diff --git a/.docs/deployment-helm.md b/.docs/deployment-helm.md index bbd02692c2643dac07b5dd277628d28023c06587..eb4c146606610c3fa75e281505a54afac14c2008 100644 --- a/.docs/deployment-helm.md +++ b/.docs/deployment-helm.md @@ -22,7 +22,7 @@ helm upgrade --install dbrepo \ Our chart depends on seven other charts which will be automatically resolved when installing our `dbrepo-core` chart: * Keycloak (Bitnami, v17.3.3) for [Authentication Service](../system-services-authentication) -* MariaDB Galera (Bitnami, v10.1.3) for [Data Database](../system-databases-data) & [Metadata Database](../system-databases-metadata) +* MariaDB Galera (Bitnami, v11.0.1) for [Data Database](../system-databases-data) & [Metadata Database](../system-databases-metadata) * SeaweedFS (SeaweedFS, v3.59.4) for [Storage Service](../system-services-storage) * OpenSearch (OpenSearch Project, v2.16.0) for [Search Database](../system-databases-search) * OpenSearch Dashboards (OpenSearch Project, v2.14.0) for [Search Dashboard](../system-other-search-dashboard) diff --git a/.docs/system-databases-data.md b/.docs/system-databases-data.md index c71c57cd9122391479ae12af78fe892dc6c2c727..ff62c19476839a92c7c612a1f12dcfbfbf2f113f 100644 --- a/.docs/system-databases-data.md +++ b/.docs/system-databases-data.md @@ -26,10 +26,31 @@ curl \ -d '{"name": "Data Database 2", "imageId": 1, "host": "example.com", "port": 3306, "privilegedUsername": "root", "privilegedPassword": "s3cr3t" }' ``` +### Settings + +The procedures require the user-generated databases to have the same collation (because of comparison operations). +Ensure that the Data Database has the character set `utf8mb4` and collation `utf8mb4_general_ci` in your `my.cfg`: + +```ini +[mysqld] +character_set_server=utf8mb4 +collation_server=utf8mb4_general_ci +``` + +We observed this unexpected behavior for +the [MariaDB Galera chart](https://artifacthub.io/packages/helm/bitnami/mariadb-galera) powered by Bitnami and had to +set extra flags. We could not observe this behavior with +the [MariaDB Galera container image](https://hub.docker.com/r/bitnami/mariadb-galera) itself. + +```yaml +mariadb-galera: + extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" +``` + ### Sidecar -We deploy a sidecar that handles the CSV-file upload/download operations between -the [Storage Service](../system-services-storage) and the Data Database using a Python Flask application and +We deploy a sidecar that handles the CSV-file upload/download operations between +the [Storage Service](../system-services-storage) and the Data Database using a Python Flask application and the [`boto3`](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) client until MariaDB supports S3 natively. @@ -44,7 +65,7 @@ Export all databases with `--skip-lock-tables` option for MariaDB Galera cluster MariaDB Galera. ```console -mysqldump \ +mariadb \ -u <privilegedUsername> \ -p<privilegedPassword> \ --complete-insert \ @@ -56,7 +77,7 @@ mysqldump \ ### Restore ```console -mysql \ +mariadb \ -u <privilegedUsername> \ -p<privilegedPassword> < dump.sql ``` diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java index 3fbf0b99fd54b91165e1cae28e942f51742c6bb5..b760968fc59f29bde80f2c5440db2e93abff15cb 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java @@ -1,5 +1,6 @@ package at.tuwien.api.container.image; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -31,4 +32,10 @@ public class ImageBriefDto { @Schema(example = "10.5") private String version; + @NotBlank + @JsonProperty("jdbc_method") + @Field(name = "jdbc_method") + @Schema(example = "mariadb") + private String jdbcMethod; + } diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/StoreMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/StoreMapper.java index e65a3d9e01166532b5951b40f5ef04e016bde9e4..285d8fd14dd5aed30fbd4e919106395f95256072 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/StoreMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/StoreMapper.java @@ -28,7 +28,7 @@ public interface StoreMapper { /* timestamp */ if (data.getTimestamp() == null) { data.setTimestamp(Instant.now()); - log.trace("timestamp=null, set to {}", data.getTimestamp()); + log.trace("timestamp is null: set timestamp to {}", data.getTimestamp()); } try { final CallableStatement ps = connection.prepareCall(statement); @@ -39,11 +39,10 @@ public interface StoreMapper { ps.setTimestamp(3, Timestamp.from(data.getTimestamp())); log.trace("param 3={}", Timestamp.from(data.getTimestamp())); ps.registerOutParameter(4, Types.BIGINT); - log.trace("out param 4={}", Types.BIGINT); return ps; } catch (SQLException e) { - log.error("failed to prepare statement {}, reason: {}", statement, e.getMessage()); - throw new QueryStoreException("Failed to prepare statement", e); + log.error("failed to prepare statement {}: {}", statement, e.getMessage()); + throw new QueryStoreException("Failed to prepare statement '" + statement + "'", e); } } diff --git a/dbrepo-ui/components/SubsetToolbar.vue b/dbrepo-ui/components/SubsetToolbar.vue index 0341d1233d2bcb800728799578c818247387a7ab..44d9f4991fca17100b2c135ad7cb980cbed08974 100644 --- a/dbrepo-ui/components/SubsetToolbar.vue +++ b/dbrepo-ui/components/SubsetToolbar.vue @@ -135,6 +135,9 @@ export default { .then((subset) => { this.subset = subset }) + .catch(() => { + this.loadingSave = false + }) .finally(() => { this.loadingSave = false }) @@ -145,6 +148,9 @@ export default { .then((subset) => { this.subset = subset }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -160,6 +166,9 @@ export default { document.body.appendChild(link) link.click() }) + .catch(() => { + this.downloadLoading = false + }) .finally(() => { this.downloadLoading = false }) diff --git a/dbrepo-ui/dbrepo.config.json b/dbrepo-ui/dbrepo.config.json index 4d2d56820e4844f1a7f29a1ffcf55df93374f3b1..bebad3e73d7f86e968a2a85f3daaee517955a738 100644 --- a/dbrepo-ui/dbrepo.config.json +++ b/dbrepo-ui/dbrepo.config.json @@ -10,6 +10,9 @@ "icon": { "path": "/favicon.ico" }, + "appleTouchIcon": { + "path": "/apple-touch-icon.png" + }, "api": { "useSsl": false }, diff --git a/dbrepo-ui/nuxt.config.js b/dbrepo-ui/nuxt.config.js index 0476e44fc7d8ccdd91de8a63117ff0aabcecc755..38b708173d0244db040330a728a9b024cab658ac 100644 --- a/dbrepo-ui/nuxt.config.js +++ b/dbrepo-ui/nuxt.config.js @@ -51,7 +51,8 @@ export default { title: config.title, meta, link: [ - { rel: 'icon', type: 'image/x-icon', href: config.icon.path } + { rel: 'icon', type: 'image/x-icon', href: config.icon.path }, + { rel: 'apple-touch-icon', sizes: '180x180', href: config.appleTouchIcon.path } ] }, diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json index 1b8975f1bd5475cfa1247b47d37def67472ca884..04b7cc1b28731a8667a8daaa31a277f62f48e1d3 100644 --- a/dbrepo-ui/package.json +++ b/dbrepo-ui/package.json @@ -41,7 +41,6 @@ "jwt-decode": "^3.1.2", "knex": "^0.95.6", "lodash": "^4.17.21", - "minio": "7.0.18", "moment": "^2.29.1", "multer": "^1.4.2", "node-fetch": "^2.6.1", diff --git a/dbrepo-ui/pages/database/_database_id/info.vue b/dbrepo-ui/pages/database/_database_id/info.vue index 01d351ab8384128938a62e64898659551c6748c3..c7ca194eb70876178263b2e35a61ef0fcf1fd590 100644 --- a/dbrepo-ui/pages/database/_database_id/info.vue +++ b/dbrepo-ui/pages/database/_database_id/info.vue @@ -19,41 +19,25 @@ <v-list-item-title> Database Visibility </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading">{{ database.is_public ? 'Public' : 'Private' }}</span> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="`${database.is_public ? 'Public' : 'Private'}`" /> <v-list-item-title class="mt-2"> Database Internal Name </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading">{{ internal_name }}</span> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="internal_name" /> <v-list-item-title class="mt-2"> Database Creator </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading"> - {{ creator }} <sup v-if="creatorVerified"> - <v-icon color="primary" title="E-Mail verified" small>mdi-check-decagram</v-icon> - </sup> - </span> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="creator" /> <v-list-item-title class="mt-2"> Database Creation </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading" v-text="createdUTC" /> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="createdUTC" /> <v-list-item-title v-if="access && access.type" class="mt-2"> Database Access </v-list-item-title> <v-list-item-content v-if="access && access.type"> <span> - <v-badge v-if="databaseExtraInfo" inline :content="databaseExtraInfo" color="primary"> + <v-badge v-if="databaseExtraInfo" inline :content="databaseExtraInfo" color="secondary"> <span v-text="accessDescription.text" /> </v-badge> <span v-else v-text="accessDescription.text" /> @@ -86,31 +70,19 @@ <v-list-item-title class="mt-2"> Container Name </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading" v-text="container_name" /> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="container_name" /> <v-list-item-title class="mt-2"> Container Internal Name </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading" v-text="container_internal_name" /> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="container_internal_name" /> <v-list-item-title class="mt-2"> Image Name </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading" v-text="image_name" /> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="image_name" /> <v-list-item-title class="mt-2"> Image Version </v-list-item-title> - <v-list-item-content> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - <span v-if="!loading" v-text="image_version" /> - </v-list-item-content> + <v-list-item-content v-if="!loading" v-text="image_version" /> </v-list-item-content> </v-list-item> </v-list> @@ -244,7 +216,7 @@ export default { }, jdbcString () { const flags = this.database.container.ui_additional_flags ? this.database.container.ui_additional_flags : '' - return `jdbc://${this.database.container.ui_host}:${this.database.container.ui_port}/${this.database.internal_name}${flags} (username=${this.user.username}, password=yourpassword)` + return `jdbc:${this.database.container.image.jdbc_method}://${this.database.container.ui_host}:${this.database.container.ui_port}/${this.database.internal_name}${flags} (username=${this.user.username}, password=yourpassword)` }, databaseExtraInfo () { return this.$config.databaseExtraInfo diff --git a/dbrepo-ui/pages/database/_database_id/query/_query_id/data.vue b/dbrepo-ui/pages/database/_database_id/query/_query_id/data.vue index 0b463191ec0ad304754b340b497b9e655d0d975a..edcfa2bca50dd1f333047a08eafefa590dd341fd 100644 --- a/dbrepo-ui/pages/database/_database_id/query/_query_id/data.vue +++ b/dbrepo-ui/pages/database/_database_id/query/_query_id/data.vue @@ -64,6 +64,9 @@ export default { this.subset = subset this.loadResult() }) + .catch(() => { + this.loadingSubset = false + }) .finally(() => { this.loadingSubset = false }) diff --git a/dbrepo-ui/pages/database/_database_id/query/_query_id/info.vue b/dbrepo-ui/pages/database/_database_id/query/_query_id/info.vue index 132373a67ab7231b4889163956b3f9957d323d73..18554f07a6d70bfc79e7e01bae72529731c8a162 100644 --- a/dbrepo-ui/pages/database/_database_id/query/_query_id/info.vue +++ b/dbrepo-ui/pages/database/_database_id/query/_query_id/info.vue @@ -188,6 +188,9 @@ export default { .then((subset) => { this.subset = subset }) + .catch(() => { + this.loadingSubset = false + }) .finally(() => { this.loadingSubset = false }) diff --git a/dbrepo-ui/pages/database/_database_id/settings.vue b/dbrepo-ui/pages/database/_database_id/settings.vue index fe5eacc7c6bcc8b290fbd662b6a965bd9be9e7e9..ad47064ab66fda4ca9cd0e5b8bf1c9ccc2520dbc 100644 --- a/dbrepo-ui/pages/database/_database_id/settings.vue +++ b/dbrepo-ui/pages/database/_database_id/settings.vue @@ -247,6 +247,9 @@ export default { this.$toast.success('Successfully updated the database visibility') location.reload() }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -258,6 +261,9 @@ export default { this.$toast.success('Successfully updated the database owner') location.reload() }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -278,6 +284,9 @@ export default { .then((users) => { this.users = users }) + .catch(() => { + this.loadingUsers = false + }) .finally(() => { this.loadingUsers = false }) diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/data.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/data.vue index 7c58f75a0c02080adfadf06fc6047bff89f58a3e..d56052f6242db342b7819780aa75456272dc61f6 100644 --- a/dbrepo-ui/pages/database/_database_id/table/_table_id/data.vue +++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/data.vue @@ -196,6 +196,9 @@ export default { document.body.appendChild(link) link.click() }) + .catch(() => { + this.downloadLoading = false + }) .finally(() => { this.downloadLoading = false }) @@ -209,6 +212,9 @@ export default { document.body.appendChild(link) link.click() }) + .catch(() => { + this.downloadLoading = false + }) .finally(() => { this.downloadLoading = false }) @@ -308,6 +314,9 @@ export default { .then((count) => { this.total = count }) + .catch(() => { + this.loadingData-- + }) .finally(() => { this.loadingData-- }) diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/import.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/import.vue index 1f60efcb8d816ec70ab82bb2325862e15f24a328..15ce462653c2ee36976c7edec4f94e92d775e85d 100644 --- a/dbrepo-ui/pages/database/_database_id/table/_table_id/import.vue +++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/import.vue @@ -205,6 +205,9 @@ export default { this.$toast.success('Successfully imported data') this.$router.push(`/database/${this.$route.params.database_id}/table/${this.$route.params.table_id}`) }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -219,6 +222,9 @@ export default { .then((table) => { this.table = table }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue index 659acbd9cc33485868804c3c86e97ab56f7e8f33..18a42daa7e3ed301640e1d8f0c17c9a9c34d161c 100644 --- a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue +++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue @@ -41,7 +41,7 @@ </v-list-item-title> <v-list-item-content v-if="access && access.type"> <span> - <v-badge v-if="brokerExtraInfo" inline :content="brokerExtraInfo" color="primary"> + <v-badge v-if="brokerExtraInfo" inline :content="brokerExtraInfo" color="secondary"> <span v-text="accessDescription.text" /> </v-badge> <span v-else v-text="accessDescription.text" /> diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/schema.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/schema.vue index b43f06dd231cf7abfe4875a6b8c2585d56e7b224..51135aeaa4ac49151bacfaa771dc1b32bfc4e74a 100644 --- a/dbrepo-ui/pages/database/_database_id/table/_table_id/schema.vue +++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/schema.vue @@ -228,6 +228,9 @@ export default { .then((table) => { this.$store.commit('SET_TABLE', table) }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) diff --git a/dbrepo-ui/pages/database/_database_id/table/create.vue b/dbrepo-ui/pages/database/_database_id/table/create.vue index a17dd423553aa0cb822b26357606f0289aaa39ea..6b2da528ad33bf5818c6b7b000da13ea35482a62 100644 --- a/dbrepo-ui/pages/database/_database_id/table/create.vue +++ b/dbrepo-ui/pages/database/_database_id/table/create.vue @@ -158,6 +158,9 @@ export default { await this.$store.dispatch('reloadDatabase') await this.$router.push(`/database/${this.databaseId}/table/${table.id}`) }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) diff --git a/dbrepo-ui/pages/database/_database_id/table/import.vue b/dbrepo-ui/pages/database/_database_id/table/import.vue index ad767f43152c0fc179858d0e422fdaa0e12c398e..fe4c47bdb1614cc56effd63f21e538e53d1a15a1 100644 --- a/dbrepo-ui/pages/database/_database_id/table/import.vue +++ b/dbrepo-ui/pages/database/_database_id/table/import.vue @@ -377,6 +377,9 @@ export default { this.step = 4 } }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -440,6 +443,7 @@ export default { this.step = 5 }) .catch(() => { + this.loading = false this.$refs.schema.loading = false }) .finally(() => { diff --git a/dbrepo-ui/pages/index.vue b/dbrepo-ui/pages/index.vue index 3ad7873d66e1ee0e7fe1b2de7b5d453c45f3dae1..4ef1ceba380b90c5012d374fc262c8a2a4a657a8 100644 --- a/dbrepo-ui/pages/index.vue +++ b/dbrepo-ui/pages/index.vue @@ -88,6 +88,9 @@ export default { this.databases = databases console.info('Found', this.databases.length, 'database(s) with access') }) + .catch(() => { + this.loadingDatabases = false + }) .finally(() => { this.loadingDatabases = false }) @@ -97,6 +100,9 @@ export default { this.databases = databases console.info('Found', this.databases.length, 'database(s)') }) + .catch(() => { + this.loadingDatabases = false + }) .finally(() => { this.loadingDatabases = false }) diff --git a/dbrepo-ui/pages/search/index.vue b/dbrepo-ui/pages/search/index.vue index 52a9ac24d12f4136e354635b45ba4595f93cd768..266cd6ce57e8eb570d473916011cf5d7b88591dd 100644 --- a/dbrepo-ui/pages/search/index.vue +++ b/dbrepo-ui/pages/search/index.vue @@ -121,6 +121,9 @@ export default { .then((response) => { this.results = response }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) diff --git a/dbrepo-ui/pages/semantic/index.vue b/dbrepo-ui/pages/semantic/index.vue index 63353bb5abbb58474570da5d79d6326b153bdcee..2a8c6570dfd73518601b0e1b779896ad107735c1 100644 --- a/dbrepo-ui/pages/semantic/index.vue +++ b/dbrepo-ui/pages/semantic/index.vue @@ -122,6 +122,9 @@ export default { }) this.concepts = concepts }) + .catch(() => { + this.loadingConcepts = false + }) .finally(() => { this.loadingConcepts = false }) @@ -136,6 +139,9 @@ export default { }) this.units = units }) + .catch(() => { + this.loadingUnits = false + }) .finally(() => { this.loadingUnits = false }) diff --git a/dbrepo-ui/pages/semantic/ontology/_ontology_id/index.vue b/dbrepo-ui/pages/semantic/ontology/_ontology_id/index.vue index a9b4422d3a2867b9da47e3e8f80160dacd96576f..8963000d26edc96adca021e586275d069a1b8e1a 100644 --- a/dbrepo-ui/pages/semantic/ontology/_ontology_id/index.vue +++ b/dbrepo-ui/pages/semantic/ontology/_ontology_id/index.vue @@ -148,6 +148,9 @@ export default { this.ontology = ontology this.ontologyChangeDto = Object.assign({}, ontology) }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) @@ -159,6 +162,9 @@ export default { await this.$store.dispatch('reloadOntologies') await this.$router.push('/semantic/ontology') }) + .catch(() => { + this.loadingDelete = false + }) .finally(() => { this.loadingDelete = false }) @@ -176,6 +182,9 @@ export default { this.$store.dispatch('reloadOntologies') this.$toast.success('Successfully update ontology!') }) + .catch(() => { + this.loading = false + }) .finally(() => { this.loading = false }) diff --git a/dbrepo-ui/pages/signup.vue b/dbrepo-ui/pages/signup.vue index ec066977ec3f541f83b5c62311572bf49355ce8e..36f9b05a3170cb87605fb1b1f0aa94ab21b673db 100644 --- a/dbrepo-ui/pages/signup.vue +++ b/dbrepo-ui/pages/signup.vue @@ -121,6 +121,9 @@ export default { .catch(() => { this.loading = false }) + .finally(() => { + this.loading = false + }) }, loadUsers () { this.loadingUsers = true @@ -128,6 +131,9 @@ export default { .then((users) => { this.usernames = users.map(u => u.username) }) + .catch(() => { + this.loadingUsers = false + }) .finally(() => { this.loadingUsers = false }) diff --git a/dbrepo-ui/pages/user/authentication.vue b/dbrepo-ui/pages/user/authentication.vue index 877ae8ce165781981e83898c878df80318f55584..c3808434570c0c3b0f5732b4114295334df35598 100644 --- a/dbrepo-ui/pages/user/authentication.vue +++ b/dbrepo-ui/pages/user/authentication.vue @@ -98,6 +98,9 @@ export default { .catch(() => { this.loadingUpdate = false }) + .finally(() => { + this.loadingUpdate = false + }) } } } diff --git a/dbrepo-ui/pages/user/info.vue b/dbrepo-ui/pages/user/info.vue index e29baf6e952fd06784a351722dc7833db2947b8c..b76c37a5fd50c778764fcae84e444c0f7d09ebb4 100644 --- a/dbrepo-ui/pages/user/info.vue +++ b/dbrepo-ui/pages/user/info.vue @@ -169,6 +169,9 @@ export default { this.$toast.success('Successfully updated user information') this.reloadUser() }) + .catch(() => { + this.loadingUpdate = false + }) .finally(() => { this.loadingUpdate = false }) diff --git a/dbrepo-ui/server-middleware/index.js b/dbrepo-ui/server-middleware/index.js index 40b785bac1f38f7748dc6ecb220eaef1c79af24b..9bc39525e60b4a805768c487b39f5b8e2b3ae2c6 100644 --- a/dbrepo-ui/server-middleware/index.js +++ b/dbrepo-ui/server-middleware/index.js @@ -1,40 +1,11 @@ -import config from '../dbrepo.config.json' const express = require('express') -const multer = require('multer') -const Minio = require('minio') const { buildQuery } = require('./query') const app = express() app.use(express.json()) -const minioClient = new Minio.Client({ - endPoint: config.storage.endpoint, - port: config.storage.port, - useSSL: config.storage.useSsl, - accessKeyId: config.storage.accessKey.id, - secretAccessKey: config.storage.accessKey.secret -}) - app.post('/query/build', (req, res) => { return res.json(buildQuery(req.body)) }) -app.post('/upload', multer().single('file'), function (req, res) { - const { file } = req - try { - minioClient.putObject('dbrepo-upload', file.originalname, file.buffer, function (err, etag) { - if (err) { - console.error('Failed to upload file', err) - return res.sendStatus(403) - } - console.debug('Successfully uploaded file', etag) - file.etag = etag - return res.status(201).json(file) - }) - } catch (err) { - console.error('Failed to upload file', err) - return res.sendStatus(403) - } -}) - module.exports = app diff --git a/dbrepo-ui/static/apple-touch-icon.png b/dbrepo-ui/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb228f6c58382ab4a5fcd23bf638e83ff1f96111 Binary files /dev/null and b/dbrepo-ui/static/apple-touch-icon.png differ diff --git a/dbrepo-ui/static/apple-touch-icon.psd b/dbrepo-ui/static/apple-touch-icon.psd new file mode 100644 index 0000000000000000000000000000000000000000..d908643f8dfa14c81849d16e84d868200fc779ba Binary files /dev/null and b/dbrepo-ui/static/apple-touch-icon.psd differ diff --git a/dbrepo-ui/static/logo.png b/dbrepo-ui/static/logo.png index 568433e3de128371c7595bf8b330bac4831b58c4..49965bb0ca5bc7d1b9326d13dcbcfdf48cead183 100644 Binary files a/dbrepo-ui/static/logo.png and b/dbrepo-ui/static/logo.png differ diff --git a/dbrepo-ui/static/logo.psd b/dbrepo-ui/static/logo.psd index 84defabf368b6978ee3dea9150057e75d9e0fab0..950a68a536e164a4c11d674d235d5a75a44ab963 100644 Binary files a/dbrepo-ui/static/logo.psd and b/dbrepo-ui/static/logo.psd differ diff --git a/dbrepo-ui/static/logo.svg b/dbrepo-ui/static/logo.svg index f45c858124cd0d532f12c3d96e8fd65dc939ad60..d6a090c62e1cde50bb28b3c2bee47ee0cb868e2c 100644 --- a/dbrepo-ui/static/logo.svg +++ b/dbrepo-ui/static/logo.svg @@ -1,4 +1,4 @@ -<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 265" width="1024" height="265"> +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 646 265" width="646" height="265"> <title>logo</title> <defs> <image width="265" height="265" id="img1" href="data:image/png;base64,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"/> @@ -8,10 +8,10 @@ .s1 { fill: #5e5e5e } </style> <use id="Layer 1" href="#img1" transform="matrix(1,0,0,1,1.5,0)"/> - <path id="DBREPO Repository for Data in Da" class="s0" aria-label="DBREPO -Repository for Data in -Databases" d="m330 74h-15.4v-49.8h15.3q6.5 0 11.7 3 5.2 2.9 8.1 8.4 2.9 5.5 2.9 12.4v2.3q0 6.9-2.9 12.3-2.8 5.4-8 8.4-5.2 3-11.7 3zm-0.1-41.5h-5.1v33.3h5q6 0 9.2-4 3.1-3.9 3.2-11.2v-2.6q0-7.6-3.1-11.5-3.2-4-9.2-4zm49.5 41.5h-19.3v-49.8h17.4q9 0 13.7 3.5 4.7 3.5 4.7 10.2 0 3.6-1.9 6.4-1.8 2.8-5.2 4.1 3.8 1 6 3.9 2.2 2.9 2.2 7.1 0 7.1-4.5 10.8-4.6 3.7-13.1 3.8zm0.3-21.7h-9.4v13.5h8.8q3.6 0 5.6-1.7 2.1-1.8 2.1-4.8 0-6.9-7.1-7zm-9.4-19.8v12.6h7.6q7.8-0.2 7.8-6.2 0-3.4-2-4.9-2-1.5-6.2-1.5zm62.2 41.5l-9.4-18.2h-8.1v18.2h-10.3v-49.8h18.5q8.8 0 13.6 4 4.8 3.9 4.8 11.1 0 5.1-2.2 8.5-2.2 3.4-6.7 5.4l10.8 20.3v0.5zm-17.5-41.5v15h8.2q3.9 0 6-2 2.1-2 2.1-5.4 0-3.5-2-5.5-2-2.1-6.1-2.1zm64.4 11.9v8h-19.7v13.4h23.1v8.2h-33.4v-49.8h33.3v8.3h-23v11.9zm28.7 12.1h-9v17.5h-10.3v-49.8h19.4q5.6 0 9.9 2.1 4.2 2 6.5 5.8 2.3 3.8 2.3 8.6 0 7.3-5 11.6-5 4.2-13.8 4.2zm-9-24v15.7h9.1q4.1 0 6.2-2 2.2-1.9 2.2-5.4 0-3.7-2.2-5.9-2.1-2.3-5.9-2.4zm75.7 15.5v2.2q0 7.4-2.6 12.9-2.6 5.6-7.4 8.6-4.8 3-11.1 3-6.2 0-11-3-4.9-3-7.5-8.5-2.7-5.5-2.7-12.7v-2.4q0-7.4 2.6-13 2.7-5.6 7.5-8.5 4.8-3 11.1-3 6.2 0 11 3 4.8 2.9 7.5 8.5 2.6 5.6 2.6 12.9zm-10.3 2.4v-2.4q0-7.8-2.9-11.9-2.8-4.1-7.9-4.1-5.2 0-8 4.1-2.8 4-2.8 11.7v2.4q0 7.7 2.8 11.9 2.8 4.2 8 4.2 5.2 0 7.9-4.1 2.8-4 2.9-11.8z"/> - <path id="DBREPO Repository for Data in Da" class="s1" aria-label="DBREPO -Repository for Data in -Databases" d="m345 158l-10.8-20.1h-11.7v20.1h-6.6v-49.8h16.4q8.4 0 13 3.9 4.5 3.8 4.5 11.1 0 4.7-2.5 8.1-2.5 3.5-7 5.2l11.7 21.1v0.4zm-22.5-44.4v18.9h10.1q4.9 0 7.7-2.5 2.9-2.6 2.9-6.8 0-4.6-2.7-7.1-2.8-2.4-7.9-2.5zm50.8 45.1q-7.5 0-12.2-4.9-4.7-5-4.7-13.3v-1.1q0-5.5 2.1-9.8 2.1-4.4 5.9-6.8 3.7-2.5 8.2-2.5 7.2 0 11.2 4.8 4 4.7 4 13.6v2.6h-25.1q0.2 5.5 3.2 8.9 3.1 3.3 7.8 3.3 3.3 0 5.7-1.3 2.3-1.4 4-3.7l3.9 3q-4.7 7.2-14 7.2zm-0.7-33.2q-3.9 0-6.5 2.8-2.6 2.8-3.2 7.8h18.5v-0.5q-0.2-4.8-2.6-7.4-2.3-2.7-6.2-2.7zm53.7 13.8v0.6q0 8.5-3.8 13.6-3.9 5.2-10.5 5.2-6.7 0-10.6-4.3v17.8h-6.3v-51.2h5.8l0.3 4.1q3.8-4.8 10.7-4.8 6.7 0 10.5 5.1 3.9 5 3.9 13.9zm-6.3-0.1q0-6.3-2.7-9.9-2.6-3.6-7.3-3.6-5.7 0-8.6 5.1v17.7q2.8 5 8.7 5 4.5 0 7.2-3.6 2.7-3.6 2.7-10.7zm12.7 0.4v-0.4q0-5.5 2.1-9.8 2.2-4.3 5.9-6.7 3.9-2.4 8.8-2.4 7.5 0 12.2 5.3 4.6 5.2 4.6 13.9v0.4q0 5.4-2 9.7-2.1 4.3-6 6.7-3.8 2.4-8.8 2.4-7.5 0-12.2-5.2-4.6-5.3-4.6-13.9zm6.3 0.3q0 6.2 2.9 9.9 2.8 3.7 7.6 3.7 4.9 0 7.7-3.7 2.8-3.8 2.8-10.6 0-6.1-2.9-9.9-2.9-3.8-7.6-3.8-4.7 0-7.6 3.8-2.9 3.7-2.9 10.6zm56.8 8.3q0-2.6-1.9-4-2-1.4-6.8-2.4-4.8-1.1-7.6-2.5-2.8-1.4-4.2-3.4-1.3-2-1.3-4.7 0-4.6 3.8-7.7 3.9-3.2 9.9-3.2 6.3 0 10.2 3.3 3.9 3.2 3.9 8.3h-6.4q0-2.6-2.2-4.5-2.2-1.9-5.5-1.9-3.5 0-5.4 1.5-2 1.5-2 4 0 2.3 1.8 3.4 1.8 1.2 6.6 2.2 4.7 1.1 7.7 2.6 2.9 1.4 4.3 3.5 1.4 2.1 1.4 5 0 5-3.9 8-4 3-10.3 3-4.5 0-7.9-1.6-3.4-1.6-5.3-4.4-2-2.8-2-6.1h6.4q0.1 3.2 2.5 5.1 2.4 1.8 6.3 1.8 3.6 0 5.7-1.4 2.2-1.5 2.2-3.9zm21.4-27.2v37h-6.3v-37zm-6.8-9.8q0-1.5 0.9-2.6 1-1 2.8-1 1.9 0 2.8 1 1 1.1 1 2.6 0 1.5-1 2.6-0.9 1-2.8 1-1.8 0-2.8-1-0.9-1.1-0.9-2.6zm19.2 0.9h6.3v8.9h6.9v4.9h-6.9v22.9q0 2.3 0.9 3.4 1 1.1 3.2 1.1 1.1 0 3-0.4v5.1q-2.5 0.7-4.9 0.7-4.2 0-6.4-2.6-2.1-2.5-2.1-7.3v-22.9h-6.7v-4.9h6.7zm18.2 27.6v-0.5q0-5.4 2.2-9.8 2.1-4.3 5.9-6.7 3.8-2.3 8.7-2.3 7.6 0 12.2 5.2 4.7 5.2 4.7 13.9v0.5q0 5.4-2.1 9.7-2 4.3-5.9 6.6-3.8 2.4-8.8 2.4-7.5 0-12.2-5.2-4.7-5.2-4.7-13.8zm6.4 0.3q0 6.1 2.8 9.9 2.9 3.7 7.7 3.7 4.8 0 7.6-3.8 2.9-3.8 2.9-10.6 0-6.1-2.9-9.8-2.9-3.8-7.7-3.8-4.7 0-7.5 3.7-2.9 3.7-2.9 10.7zm53.1-19.1v5.8q-1.4-0.2-3.1-0.2-6.2 0-8.4 5.3v26.3h-6.4v-37h6.2l0.1 4.2q3.1-4.9 8.8-4.9 1.9 0 2.8 0.5zm9.3 0.2l9.2 27.7 8.7-27.7h6.7l-14.8 42.7q-3.5 9.2-11 9.2l-1.2-0.1-2.4-0.5v-5.1l1.7 0.2q3.2 0 5-1.3 1.8-1.3 3-4.8l1.4-3.8-13.2-36.5zm57 37h-6.3v-32.1h-5.8v-4.9h5.8v-3.8q0-6 3.2-9.2 3.2-3.3 9-3.3 2.2 0 4.3 0.6l-0.3 5.1q-1.6-0.3-3.5-0.3-3 0-4.7 1.8-1.7 1.8-1.7 5.2v3.9h7.9v4.9h-7.9zm13.2-18.4v-0.5q0-5.4 2.1-9.7 2.2-4.4 6-6.7 3.8-2.4 8.7-2.4 7.5 0 12.2 5.2 4.7 5.3 4.7 13.9v0.5q0 5.4-2.1 9.7-2.1 4.3-5.9 6.7-3.8 2.3-8.8 2.3-7.6 0-12.2-5.2-4.7-5.2-4.7-13.8zm6.4 0.3q0 6.1 2.8 9.9 2.9 3.7 7.7 3.7 4.8 0 7.6-3.8 2.9-3.8 2.9-10.6 0-6.1-2.9-9.8-2.9-3.8-7.7-3.8-4.7 0-7.6 3.7-2.8 3.7-2.8 10.7zm53.1-19.1v5.9q-1.5-0.3-3.1-0.3-6.2 0-8.5 5.3v26.3h-6.3v-37h6.2l0.1 4.3q3.1-5 8.8-5 1.8 0 2.8 0.5zm37.9 37.2h-13.8v-49.8h14.1q6.5 0 11.4 2.9 5 2.8 7.7 8.1 2.8 5.3 2.8 12.2v3.2q0 7-2.7 12.3-2.7 5.3-7.8 8.2-5 2.8-11.7 2.9zm0.4-44.4h-7.6v39h6.9q7.6 0 11.8-4.7 4.2-4.7 4.2-13.5v-2.9q0-8.4-4-13.1-4-4.7-11.3-4.8zm60.2 44.4h-6.6q-0.6-1.1-0.9-3.9-4.4 4.5-10.6 4.5-5.4 0-8.9-3-3.5-3.1-3.5-7.9 0-5.8 4.3-8.9 4.5-3.3 12.4-3.3h6.2v-2.9q0-3.3-2-5.2-2-2-5.9-2-3.3 0-5.6 1.7-2.3 1.7-2.3 4.1h-6.4q0-2.7 2-5.3 2-2.6 5.3-4.1 3.4-1.5 7.4-1.5 6.4 0 10 3.2 3.7 3.2 3.8 8.8v17q0 5.1 1.3 8.1zm-17.1-4.8q2.9 0 5.6-1.5 2.7-1.6 3.9-4v-7.6h-5q-11.6 0-11.6 6.8 0 2.9 2 4.6 2 1.7 5.1 1.7zm28-41.1h6.3v8.9h6.9v4.9h-6.9v23q0 2.2 0.9 3.3 0.9 1.1 3.2 1.1 1 0 3-0.4v5.1q-2.5 0.7-4.9 0.7-4.2 0-6.4-2.6-2.1-2.5-2.1-7.2v-23h-6.8v-4.9h6.8zm50 46h-6.6q-0.5-1.1-0.9-3.9-4.4 4.6-10.5 4.6-5.5 0-9-3.1-3.5-3.1-3.5-7.9 0-5.8 4.4-8.9 4.4-3.3 12.4-3.3h6.1v-2.9q0-3.3-2-5.2-2-2-5.8-2-3.4 0-5.7 1.7-2.3 1.7-2.3 4.1h-6.3q0-2.7 1.9-5.3 2-2.6 5.3-4.1 3.4-1.5 7.5-1.5 6.4 0 10 3.2 3.6 3.2 3.7 8.8v17q0 5.1 1.3 8.1zm-17.1-4.8q3 0 5.6-1.5 2.7-1.6 3.9-4v-7.6h-4.9q-11.7 0-11.7 6.8 0 3 2 4.6 2 1.7 5.1 1.7zm49.9-32.2v37h-6.3v-37zm-6.8-9.8q0-1.5 0.9-2.6 1-1 2.8-1 1.9 0 2.8 1 1 1.1 1 2.6 0 1.6-1 2.6-0.9 1-2.8 1-1.8 0-2.8-1-0.9-1-0.9-2.6zm16.9 9.8h6l0.2 4.7q4.3-5.3 11.1-5.3 11.7 0 11.8 13.2v24.4h-6.3v-24.5q0-3.9-1.8-5.9-1.8-1.9-5.6-1.9-3.1 0-5.4 1.7-2.3 1.6-3.6 4.3v26.3h-6.4zm-619 121h-13.8v-49.8h14.1q6.5 0 11.5 2.9 5 2.9 7.7 8.2 2.7 5.3 2.7 12.1v3.2q0 7.1-2.7 12.4-2.7 5.3-7.8 8.1-5 2.8-11.7 2.9zm0.5-44.4h-7.7v39h6.9q7.6 0 11.8-4.7 4.2-4.7 4.2-13.4v-2.9q0-8.5-4-13.2-3.9-4.7-11.2-4.8zm60.1 44.4h-6.6q-0.6-1.1-0.9-3.9-4.4 4.6-10.5 4.6-5.5 0-9-3.1-3.5-3.1-3.5-7.8 0-5.8 4.4-9 4.4-3.2 12.3-3.2h6.2v-2.9q0-3.3-2-5.3-2-2-5.8-2-3.4 0-5.7 1.7-2.3 1.7-2.3 4.2h-6.4q0-2.8 2-5.4 2-2.6 5.3-4.1 3.4-1.5 7.4-1.5 6.4 0 10.1 3.3 3.6 3.1 3.7 8.7v17.1q0 5 1.3 8.1zm-17.1-4.9q3 0 5.6-1.5 2.7-1.5 3.9-4v-7.6h-5q-11.6 0-11.6 6.8 0 3 2 4.7 2 1.6 5.1 1.6zm28-41.1h6.3v9h6.9v4.9h-6.9v22.9q0 2.2 0.9 3.3 1 1.1 3.2 1.1 1.1 0 3-0.4v5.2q-2.5 0.6-4.9 0.6-4.2 0-6.4-2.5-2.1-2.6-2.1-7.3v-22.9h-6.8v-4.9h6.8zm50.1 45.9h-6.7q-0.5-1.1-0.9-3.9-4.4 4.6-10.5 4.6-5.5 0-9-3.1-3.5-3.1-3.5-7.8 0-5.8 4.4-9 4.4-3.2 12.4-3.2h6.1v-2.9q0-3.3-1.9-5.3-2-2-5.9-2-3.4 0-5.7 1.7-2.3 1.8-2.3 4.2h-6.3q0-2.8 1.9-5.3 2-2.6 5.4-4.1 3.3-1.6 7.4-1.6 6.4 0 10 3.3 3.6 3.1 3.8 8.7v17.1q0 5.1 1.3 8.1zm-17.2-4.9q3 0 5.7-1.5 2.6-1.5 3.8-4v-7.6h-4.9q-11.6 0-11.6 6.8 0 3 1.9 4.7 2 1.6 5.1 1.6zm57.1-13.8v0.6q0 8.5-3.9 13.6-3.9 5.1-10.5 5.1-7 0-10.8-4.9l-0.3 4.3h-5.8v-52.5h6.3v19.6q3.8-4.8 10.6-4.8 6.7 0 10.5 5.1 3.9 5.1 3.9 13.9zm-6.3-0.1q0-6.5-2.5-10-2.5-3.5-7.2-3.5-6.3 0-9 5.8v16q2.9 5.8 9 5.8 4.6 0 7.1-3.5 2.6-3.6 2.6-10.6zm43.7 18.8h-6.6q-0.6-1.1-0.9-3.9-4.4 4.5-10.5 4.5-5.5 0-9-3-3.5-3.1-3.5-7.9 0-5.8 4.4-8.9 4.4-3.3 12.3-3.3h6.2v-2.9q0-3.3-2-5.2-2-2-5.8-2-3.4 0-5.7 1.7-2.3 1.7-2.3 4.1h-6.4q0-2.7 2-5.3 2-2.6 5.3-4.1 3.4-1.5 7.4-1.5 6.4 0 10 3.2 3.7 3.2 3.8 8.8v17q0 5.1 1.3 8.1zm-17.1-4.8q3 0 5.6-1.5 2.7-1.6 3.9-4v-7.6h-5q-11.6 0-11.6 6.8 0 2.9 2 4.6 2 1.7 5.1 1.7zm47.2-5q0-2.6-1.9-4-1.9-1.4-6.7-2.4-4.8-1-7.7-2.5-2.8-1.4-4.1-3.4-1.4-2-1.4-4.7 0-4.6 3.9-7.7 3.8-3.1 9.8-3.1 6.3 0 10.2 3.2 3.9 3.2 3.9 8.3h-6.3q0-2.6-2.2-4.5-2.2-1.9-5.6-1.9-3.4 0-5.4 1.6-1.9 1.5-1.9 3.9 0 2.3 1.8 3.4 1.8 1.2 6.5 2.3 4.8 1 7.7 2.5 2.9 1.5 4.3 3.5 1.5 2.1 1.5 5.1 0 4.9-4 7.9-4 3-10.3 3-4.4 0-7.8-1.6-3.5-1.5-5.4-4.3-1.9-2.9-1.9-6.2h6.3q0.2 3.2 2.5 5.1 2.4 1.8 6.3 1.8 3.6 0 5.8-1.4 2.1-1.5 2.1-3.9zm30 10.5q-7.6 0-12.3-4.9-4.7-5-4.7-13.2v-1.2q0-5.5 2.1-9.8 2.1-4.4 5.9-6.8 3.8-2.4 8.2-2.4 7.2 0 11.2 4.7 4 4.8 4 13.6v2.6h-25.1q0.2 5.5 3.2 8.9 3.1 3.3 7.8 3.3 3.3 0 5.7-1.3 2.3-1.4 4-3.6l3.9 3q-4.6 7.1-13.9 7.1zm-0.8-33.2q-3.9 0-6.5 2.9-2.6 2.7-3.2 7.7h18.6v-0.4q-0.3-4.9-2.6-7.5-2.4-2.7-6.3-2.7zm44 22.7q0-2.6-1.9-4-1.9-1.4-6.8-2.4-4.7-1-7.6-2.5-2.8-1.4-4.1-3.4-1.4-2-1.4-4.7 0-4.6 3.9-7.7 3.8-3.1 9.8-3.1 6.3 0 10.2 3.2 3.9 3.2 3.9 8.3h-6.3q0-2.6-2.3-4.5-2.2-1.9-5.5-1.9-3.5 0-5.4 1.6-2 1.5-2 3.9 0 2.3 1.9 3.4 1.8 1.2 6.5 2.3 4.7 1 7.7 2.5 2.9 1.5 4.3 3.5 1.5 2.1 1.5 5.1 0 4.9-4 7.9-4 3-10.3 3-4.4 0-7.9-1.6-3.4-1.5-5.3-4.3-1.9-2.9-1.9-6.2h6.3q0.2 3.2 2.5 5.1 2.4 1.8 6.3 1.8 3.6 0 5.7-1.4 2.2-1.5 2.2-3.9z"/> + <path id="DBRepo Database Repository" class="s0" aria-label="DBRepo +Database +Repository" d="m331 74h-15.4v-49.8h15.3q6.5 0 11.7 3 5.2 2.9 8.1 8.4 2.9 5.5 2.9 12.4v2.3q0 6.9-2.9 12.3-2.8 5.4-8 8.4-5.2 3-11.7 3zm-0.1-41.5h-5.1v33.3h5q6 0 9.2-4 3.1-3.9 3.2-11.2v-2.6q0-7.6-3.1-11.5-3.2-4-9.2-4zm49.5 41.5h-19.3v-49.8h17.4q9 0 13.7 3.5 4.7 3.5 4.7 10.2 0 3.6-1.9 6.4-1.8 2.8-5.2 4.1 3.8 1 6 3.9 2.2 2.9 2.2 7.1 0 7.1-4.5 10.8-4.6 3.7-13.1 3.8zm0.3-21.7h-9.4v13.5h8.8q3.6 0 5.6-1.7 2.1-1.8 2.1-4.8 0-6.9-7.1-7zm-9.4-19.8v12.6h7.6q7.8-0.2 7.8-6.2 0-3.4-2-4.9-2-1.5-6.2-1.5zm62.2 41.5l-9.4-18.2h-8.1v18.2h-10.3v-49.8h18.5q8.8 0 13.6 4 4.8 3.9 4.8 11.1 0 5.1-2.2 8.5-2.2 3.4-6.7 5.4l10.8 20.3v0.5zm-17.5-41.5v15h8.2q3.9 0 6-2 2.1-2 2.1-5.4 0-3.5-2-5.5-2-2.1-6.1-2.1zm50.8 42.2q-8.1 0-13.3-5-5.1-5-5.1-13.3v-1q0-5.5 2.2-9.9 2.1-4.4 6.1-6.8 3.9-2.4 9-2.4 7.6 0 11.9 4.8 4.4 4.8 4.4 13.6v4h-23.5q0.4 3.6 2.8 5.8 2.5 2.2 6.1 2.2 5.8 0 9-4.1l4.8 5.4q-2.2 3.2-6 4.9-3.8 1.8-8.4 1.8zm-1.1-30.4q-3 0-4.8 2-1.8 2-2.3 5.7h13.7v-0.8q-0.1-3.3-1.8-5.1-1.7-1.8-4.8-1.8zm55.2 11v0.6q0 8.5-3.9 13.7-3.9 5.1-10.5 5.1-5.6 0-9-3.9v17.4h-9.9v-51.2h9.2l0.3 3.6q3.6-4.3 9.4-4.3 6.8 0 10.6 5.1 3.8 5.1 3.8 13.9zm-9.9-0.2q0-5.1-1.8-7.9-1.8-2.8-5.3-2.8-4.7 0-6.4 3.5v15.2q1.8 3.6 6.5 3.6 7 0 7-11.6zm14.5 0.5v-0.4q0-5.5 2.1-9.8 2.1-4.3 6.1-6.7 4-2.4 9.2-2.4 7.5 0 12.3 4.6 4.7 4.6 5.2 12.5l0.1 2.5q0 8.5-4.7 13.7-4.8 5.1-12.8 5.1-8 0-12.8-5.1-4.7-5.2-4.7-14zm9.9 0.3q0 5.2 1.9 8.1 2 2.7 5.7 2.7 3.6 0 5.6-2.7 2-2.8 2-8.8 0-5.2-2-8-2-2.9-5.7-2.9-3.6 0-5.6 2.9-1.9 2.8-1.9 8.7z"/> + <path id="DBRepo Database Repository" class="s1" aria-label="DBRepo +Database +Repository" d="m330.7 158h-13.8v-49.8h14q6.5 0 11.5 2.9 5 2.9 7.7 8.2 2.8 5.3 2.8 12.1v3.2q0 7.1-2.7 12.4-2.7 5.3-7.8 8.1-5 2.8-11.7 2.9zm0.4-44.4h-7.6v39h6.9q7.6 0 11.8-4.7 4.2-4.7 4.2-13.4v-2.9q0-8.5-4-13.2-4-4.7-11.3-4.8zm60.2 44.4h-6.7q-0.5-1.1-0.8-3.9-4.5 4.6-10.6 4.6-5.4 0-9-3.1-3.4-3.1-3.4-7.9 0-5.7 4.3-8.9 4.4-3.2 12.4-3.2h6.2v-2.9q0-3.3-2-5.3-2-2-5.9-2-3.4 0-5.6 1.7-2.3 1.7-2.3 4.2h-6.4q0-2.8 2-5.4 1.9-2.6 5.3-4.1 3.4-1.5 7.4-1.5 6.4 0 10 3.2 3.6 3.2 3.8 8.8v17.1q0 5 1.3 8.1zm-17.2-4.9q3 0 5.7-1.5 2.7-1.5 3.9-4v-7.6h-5q-11.6 0-11.6 6.8 0 3 2 4.7 1.9 1.6 5 1.6zm28-41.1h6.4v9h6.9v4.9h-6.9v22.9q0 2.2 0.9 3.3 0.9 1.1 3.1 1.1 1.1 0 3-0.4v5.2q-2.5 0.6-4.8 0.6-4.3 0-6.4-2.5-2.2-2.6-2.2-7.3v-22.9h-6.7v-4.9h6.7zm50.1 45.9h-6.6q-0.6-1.1-0.9-3.9-4.4 4.6-10.5 4.6-5.5 0-9-3.1-3.5-3.1-3.5-7.8 0-5.8 4.4-9 4.4-3.2 12.3-3.2h6.2v-2.9q0-3.3-2-5.3-2-2-5.8-2-3.4 0-5.7 1.7-2.3 1.8-2.3 4.2h-6.4q0-2.8 2-5.4 2-2.6 5.3-4.1 3.4-1.5 7.4-1.5 6.4 0 10.1 3.3 3.6 3.1 3.7 8.7v17.1q0 5.1 1.3 8.1zm-17.1-4.9q3 0 5.6-1.5 2.7-1.5 3.9-4v-7.6h-5q-11.6 0-11.6 6.8 0 3 2 4.7 2 1.6 5.1 1.6zm57-13.8v0.6q0 8.5-3.9 13.6-3.9 5.1-10.4 5.1-7 0-10.9-4.9l-0.3 4.3h-5.8v-52.5h6.4v19.5q3.8-4.7 10.5-4.7 6.7 0 10.6 5.1 3.8 5.1 3.8 13.9zm-6.3-0.1q0-6.5-2.5-10-2.5-3.5-7.2-3.5-6.2 0-8.9 5.8v16q2.9 5.8 9 5.8 4.6 0 7.1-3.5 2.5-3.6 2.5-10.6zm43.8 18.8h-6.7q-0.5-1.1-0.9-3.9-4.4 4.5-10.5 4.5-5.5 0-9-3-3.5-3.1-3.5-7.9 0-5.8 4.4-8.9 4.4-3.3 12.4-3.3h6.1v-2.9q0-3.3-1.9-5.2-2-2-5.9-2-3.4 0-5.7 1.7-2.2 1.7-2.2 4.1h-6.4q0-2.7 1.9-5.3 2-2.6 5.4-4.1 3.4-1.5 7.4-1.5 6.4 0 10 3.2 3.6 3.2 3.8 8.8v17q0 5.1 1.3 8.1zm-17.2-4.8q3 0 5.7-1.5 2.6-1.6 3.8-4v-7.6h-4.9q-11.6 0-11.6 6.8 0 2.9 1.9 4.6 2 1.7 5.1 1.7zm47.3-5q0-2.6-1.9-4-2-1.4-6.8-2.4-4.8-1-7.6-2.5-2.8-1.4-4.2-3.4-1.3-2-1.3-4.7 0-4.6 3.8-7.7 3.9-3.2 9.9-3.2 6.3 0 10.2 3.3 3.9 3.2 3.9 8.3h-6.4q0-2.6-2.2-4.5-2.2-1.9-5.5-1.9-3.5 0-5.4 1.5-2 1.6-2 4 0 2.3 1.8 3.4 1.9 1.2 6.6 2.3 4.7 1 7.7 2.5 2.9 1.5 4.3 3.5 1.4 2.1 1.4 5.1 0 4.9-3.9 7.9-4 3-10.3 3-4.5 0-7.9-1.6-3.4-1.5-5.3-4.3-2-2.9-2-6.2h6.4q0.1 3.2 2.5 5.1 2.4 1.8 6.3 1.8 3.6 0 5.7-1.4 2.2-1.5 2.2-3.9zm29.9 10.5q-7.5 0-12.2-4.9-4.7-5-4.7-13.3v-1.1q0-5.5 2-9.8 2.2-4.4 5.9-6.8 3.8-2.5 8.2-2.5 7.2 0 11.2 4.8 4 4.8 4 13.6v2.6h-25q0.1 5.5 3.2 8.9 3 3.3 7.8 3.3 3.3 0 5.6-1.3 2.4-1.4 4.1-3.7l3.9 3.1q-4.7 7.1-14 7.1zm-0.8-33.2q-3.8 0-6.4 2.8-2.6 2.8-3.2 7.8h18.5v-0.4q-0.3-4.9-2.6-7.5-2.3-2.7-6.3-2.7zm-242.8 116.5l-10.8-20.1h-11.7v20.1h-6.6v-49.8h16.4q8.4 0 13 3.9 4.5 3.8 4.5 11.1 0 4.7-2.5 8.1-2.5 3.5-7 5.2l11.7 21.1v0.4zm-22.5-44.4v18.9h10.1q4.9 0 7.7-2.5 2.9-2.5 2.9-6.8 0-4.6-2.7-7.1-2.8-2.4-7.9-2.5zm50.8 45.1q-7.5 0-12.2-4.9-4.7-5-4.7-13.3v-1.1q0-5.5 2.1-9.8 2.1-4.4 5.9-6.8 3.7-2.5 8.2-2.5 7.2 0 11.2 4.8 4 4.8 4 13.6v2.6h-25.1q0.2 5.5 3.2 8.9 3.1 3.3 7.8 3.3 3.3 0 5.7-1.3 2.3-1.4 4-3.7l3.9 3.1q-4.7 7.1-14 7.1zm-0.7-33.2q-3.9 0-6.5 2.8-2.6 2.8-3.2 7.8h18.5v-0.4q-0.2-4.9-2.6-7.5-2.3-2.7-6.2-2.7zm53.7 13.9v0.5q0 8.5-3.8 13.6-3.9 5.2-10.5 5.2-6.7 0-10.6-4.3v17.8h-6.3v-51.2h5.8l0.3 4.1q3.8-4.8 10.7-4.8 6.7 0 10.5 5.1 3.9 5 3.9 14zm-6.3-0.2q0-6.2-2.7-9.9-2.6-3.6-7.3-3.6-5.7 0-8.6 5.1v17.7q2.8 5 8.7 5 4.5 0 7.2-3.6 2.7-3.6 2.7-10.7zm12.7 0.4v-0.4q0-5.5 2.1-9.8 2.2-4.3 5.9-6.7 3.9-2.4 8.8-2.4 7.5 0 12.2 5.3 4.6 5.2 4.6 13.9v0.4q0 5.4-2 9.7-2.1 4.3-6 6.7-3.8 2.4-8.8 2.4-7.5 0-12.2-5.2-4.6-5.3-4.6-13.9zm6.3 0.3q0 6.2 2.9 9.9 2.8 3.7 7.6 3.7 4.9 0 7.7-3.7 2.8-3.8 2.8-10.6 0-6.1-2.9-9.9-2.9-3.8-7.6-3.8-4.7 0-7.6 3.8-2.9 3.7-2.9 10.6zm56.8 8.3q0-2.6-1.9-4-2-1.4-6.8-2.4-4.8-1-7.6-2.5-2.8-1.4-4.2-3.4-1.3-2-1.3-4.7 0-4.6 3.8-7.7 3.9-3.2 9.9-3.2 6.3 0 10.2 3.3 3.9 3.2 3.9 8.3h-6.4q0-2.6-2.2-4.5-2.2-1.9-5.5-1.9-3.5 0-5.4 1.5-2 1.6-2 4 0 2.3 1.8 3.4 1.8 1.2 6.6 2.3 4.7 1 7.7 2.5 2.9 1.5 4.3 3.5 1.4 2.1 1.4 5.1 0 4.9-3.9 7.9-4 3-10.3 3-4.5 0-7.9-1.6-3.4-1.5-5.3-4.3-2-2.9-2-6.2h6.4q0.1 3.2 2.5 5.1 2.4 1.8 6.3 1.8 3.6 0 5.7-1.4 2.2-1.5 2.2-3.9zm21.4-27.2v37h-6.3v-37zm-6.8-9.8q0-1.5 0.9-2.6 1-1 2.8-1 1.9 0 2.8 1 1 1.1 1 2.6 0 1.6-1 2.6-0.9 1-2.8 1-1.8 0-2.8-1-0.9-1-0.9-2.6zm19.2 0.9h6.3v8.9h6.9v4.9h-6.9v23q0 2.2 0.9 3.3 1 1.1 3.2 1.1 1.1 0 3-0.4v5.1q-2.5 0.7-4.9 0.7-4.2 0-6.4-2.6-2.1-2.5-2.1-7.2v-23h-6.7v-4.9h6.7zm18.2 27.6v-0.5q0-5.4 2.2-9.7 2.1-4.4 5.9-6.7 3.8-2.4 8.7-2.4 7.6 0 12.2 5.2 4.7 5.3 4.7 13.9v0.5q0 5.4-2.1 9.7-2 4.3-5.9 6.7-3.8 2.4-8.8 2.4-7.5 0-12.2-5.3-4.7-5.2-4.7-13.8zm6.4 0.3q0 6.1 2.8 9.9 2.9 3.7 7.7 3.7 4.8 0 7.6-3.8 2.9-3.8 2.9-10.6 0-6-2.9-9.8-2.9-3.8-7.7-3.8-4.7 0-7.5 3.7-2.9 3.8-2.9 10.7zm53.1-19.1v5.9q-1.4-0.3-3.1-0.3-6.2 0-8.4 5.3v26.3h-6.4v-37h6.2l0.1 4.3q3.1-5 8.8-5 1.9 0 2.8 0.5zm9.3 0.2l9.2 27.7 8.7-27.7h6.7l-14.8 42.7q-3.5 9.2-11 9.2l-1.2-0.1-2.4-0.4v-5.2l1.7 0.2q3.2 0 5-1.3 1.8-1.3 3-4.8l1.4-3.7-13.2-36.6z"/> </svg> \ No newline at end of file