Skip to content

Commit

Permalink
fix: Detect the database not opened issue and hint user
Browse files Browse the repository at this point in the history
  • Loading branch information
ci010 committed Jan 10, 2024
1 parent e161125 commit bc1c1b0
Show file tree
Hide file tree
Showing 16 changed files with 120 additions and 10 deletions.
10 changes: 10 additions & 0 deletions xmcl-keystone-ui/locales/de.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,16 @@ errors:
{actual}.
ConnectTimeoutError: Die Verbindungszeit zum Server ist abgelaufen.
DNSNotFoundError: Fehler beim DNS-Lookup
DatabaseNotOpened: >-
Datenbank ist nicht geöffnet!
Der Launcher funktioniert nicht richtig!
Bitte wählen Sie ein Datenverzeichnis aus, auf das der Launcher zugreifen
kann.
Sie können versuchen, den Datenstamm auf der Einstellungsseite
zurückzusetzen.
DownloadAggregateError: Datei kann nicht hochgeladen werden.
DownloadFileSystemError: >-
Fehler beim Zugriff auf den Pfad zur Download-Datei. Stellen Sie sicher,
Expand Down
4 changes: 4 additions & 0 deletions xmcl-keystone-ui/locales/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,10 @@ errors:
ChecksumNotMatchError: Checksum not matched! Expect {expect}. Actual {actual}.
ConnectTimeoutError: Connection timeout to server.
DNSNotFoundError: DNS lookup error
DatabaseNotOpened: >-
Database is not opened! The launcher won't work properly! Please select a
data directory the launcher can access. You can try to reset the data root
in setting page.
DownloadAggregateError: Fail to download file.
DownloadFileSystemError: >-
Error during accessing the download file path. Please ensure the launcher
Expand Down
6 changes: 6 additions & 0 deletions xmcl-keystone-ui/locales/es-ES.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,12 @@ diagnosis:
missingAssetsIndex:
message: Launcher descargará el índice de assets por ti
name: Falta el archivo de índice de activos de {version}.
errors:
DatabaseNotOpened: |-
¡La base de datos no está abierta!
¡El lanzador no funcionará correctamente!
Seleccione un directorio de datos al que pueda acceder el iniciador.
Puede intentar restablecer la raíz de datos en la página de configuración.
fabricVersion:
disable: Desactivar Fabric
empty: No hay versión de Fabric para Minecraft {version}
Expand Down
1 change: 1 addition & 0 deletions xmcl-keystone-ui/locales/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ errors:
Reçu {actual}.
ConnectTimeoutError: Délai de connexion au serveur.
DNSNotFoundError: Erreur de recherche DNS
DatabaseNotOpened: "La base de données n'est pas ouverte\_! \nLe lanceur ne fonctionnera pas correctement\_! \nVeuillez sélectionner un répertoire de données auquel le lanceur peut accéder. \nVous pouvez essayer de réinitialiser la racine des données dans la page de configuration."
DownloadAggregateError: Échec du téléchargement du fichier.
DownloadFileSystemError: |-
Erreur lors de l'accès au chemin du fichier de téléchargement.
Expand Down
9 changes: 9 additions & 0 deletions xmcl-keystone-ui/locales/ru.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,15 @@ errors:
ChecksumNotMatchError: Контрольная сумма не совпадает! Должно быть {expect}. Сейчас {actual}.
ConnectTimeoutError: Вышло время ожидания подключения к серверу.
DNSNotFoundError: Ошибка поиска DNS
DatabaseNotOpened: >-
База данных не открывается!
Лаунчер не будет работать должным образом!
Пожалуйста, выберите каталог данных, к которому будет иметь доступ программа
запуска.
Вы можете попробовать сбросить корень данных на странице настроек.
DownloadAggregateError: Не удаётся скачать файл.
DownloadFileSystemError: >-
Возникла ошибка доступа к расположению файла загрузки. Пожалуйста, убедитесь
Expand Down
9 changes: 9 additions & 0 deletions xmcl-keystone-ui/locales/uk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,15 @@ errors:
ChecksumNotMatchError: Контрольна сума не збігається! Має бути {expect}. Зараз {actual}.
ConnectTimeoutError: Вийшов час очікування на підключення до сервера.
DNSNotFoundError: Помилка пошуку DNS
DatabaseNotOpened: >-
База даних не відкрита!
Лаунчер не працює належним чином!
Будь ласка, виберіть каталог даних, до якого програма запуску матиме
доступ.
Ви можете спробувати скинути корінь даних на сторінці налаштувань.
DownloadAggregateError: Неможливо завантажити файл.
DownloadFileSystemError: >-
Помилка під час доступу до шляху до файлу завантаження. Переконайтеся, що
Expand Down
4 changes: 4 additions & 0 deletions xmcl-keystone-ui/locales/zh-CN.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,10 @@ errors:
BodyTimeoutError: 等待 HTTP 数据超时
ChecksumNotMatchError: 文件校验失败!期望哈希值是 {expect},实际获取到的是 {actual}。
ConnectTimeoutError: 与服务器建立连接超时
DatabaseNotOpened: |-
数据库无法打开!
启动器将无法正常工作!
请选择启动器可以访问的数据目录。你可以在设置页面重选数据目录。
DownloadAggregateError: 下载文件失败。
DownloadFileSystemError: 无法访问下载目标路径,请确认启动器有权写入目标路径。
HeadersTimeoutError: 等待 HTTP 头信息超时
Expand Down
15 changes: 15 additions & 0 deletions xmcl-keystone-ui/src/composables/databaseStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ResourceServiceKey } from '@xmcl/runtime-api'
import { useService } from './service'
import useSWRV from 'swrv'
import { InjectionKey } from 'vue'

export const kDatabaseStatus: InjectionKey<ReturnType<typeof useDatabaseStatus>> = Symbol('DatabaseStatus')

export function useDatabaseStatus() {
const { isResourceDatabaseOpened } = useService(ResourceServiceKey)
const { data } = useSWRV('isResourceDatabaseOpened', isResourceDatabaseOpened)
const isOpened = computed(() => data.value ?? false)
return {
isOpened,
}
}
36 changes: 36 additions & 0 deletions xmcl-keystone-ui/src/views/HomeDatabaseError.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<template>
<v-card
v-if="error"
class="mx-2"
color="red"
>
<v-card-text>
{{ error }}
</v-card-text>
<v-card-actions>
<v-btn
text
@click="push('/setting')"
>
<v-icon left>
settings
</v-icon>
{{ t('setting.name', 2) }}
</v-btn>
</v-card-actions>
</v-card>
</template>
<script setup lang="ts">
import { kDatabaseStatus } from '@/composables/databaseStatus'
import { injection } from '@/util/inject'
const { t } = useI18n()
const { isOpened } = injection(kDatabaseStatus)
const { push } = useRouter()
const error = computed(() => {
if (!isOpened.value) {
return t('errors.DatabaseNotOpened')
}
return ''
})
</script>
10 changes: 5 additions & 5 deletions xmcl-keystone-ui/src/views/HomeDefault.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<div
class="relative mx-3 select-none"
>
<HomeDatabaseError />
<GridLayout
:layout.sync="layout"
:responsive-layouts="layouts"
Expand Down Expand Up @@ -105,22 +106,21 @@ import { useLocalStorageCache, useLocalStorageCacheBool } from '@/composables/ca
import { kInstance } from '@/composables/instance'
import { kUpstream } from '@/composables/instanceUpdate'
import { useMojangNews } from '@/composables/mojangNews'
import { useTutorial } from '@/composables/tutorial'
import { injection } from '@/util/inject'
import { DriveStep } from 'driver.js'
import debounce from 'lodash.debounce'
import { GridItem, GridLayout } from 'vue-grid-layout'
import CurseforgeProject from './CurseforgeProject.vue'
import HomeDatabaseError from './HomeDatabaseError.vue'
import HomeModCard from './HomeModCard.vue'
import HomeNewsCard from './HomeNewsCard.vue'
import HomeResourcePacksCard from './HomeResourcePacksCard.vue'
import HomeSavesCard from './HomeSavesCard.vue'
import HomeScreenshotCard from './HomeScreenshotCard.vue'
import HomeServerStatusBar from './HomeServerStatusBar.vue'
import HomeShaderPackCard from './HomeShaderPackCard.vue'
import ModrinthProject from './ModrinthProject.vue'
import { useTutorial } from '@/composables/tutorial'
import { DriveStep } from 'driver.js'
import HomeUpstreamModrinth from './HomeUpstreamModrinth.vue'
import HomeUpstreamCurseforge from './HomeUpstreamCurseforge.vue'
import HomeUpstreamModrinth from './HomeUpstreamModrinth.vue'
const { instance, isServer } = injection(kInstance)
Expand Down
10 changes: 7 additions & 3 deletions xmcl-keystone-ui/src/views/HomeFocus.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
v-if="!inView"
key="empty"
class="h-full"
/>
>
<HomeDatabaseError />
</div>
<HomeUpstreamCurseforge
v-else-if="instance.upstream && instance.upstream.type === 'curseforge-modpack'"
:id="instance.upstream.modId"
Expand Down Expand Up @@ -38,6 +40,8 @@ import debounce from 'lodash.debounce'
import HomeFocusFooter from './HomeFocusFooter.vue'
import HomeUpstreamCurseforge from './HomeUpstreamCurseforge.vue'
import HomeUpstreamModrinth from './HomeUpstreamModrinth.vue'
import { kDatabaseStatus } from '@/composables/databaseStatus'
import HomeDatabaseError from './HomeDatabaseError.vue'
const { instance } = injection(kInstance)
const { t } = useI18n()
Expand All @@ -55,14 +59,14 @@ const content = ref<HTMLElement | null>(null)
let counter = 0
const inView = ref(false)
const scrollIn = debounce(() => {
if (counter > 3) {
if (counter > 3 && instance.value.upstream) {
inView.value = true
}
counter = 0
}, 300)
const scrollOut = debounce(() => {
if (counter > 3) {
if (counter > 3 && instance.value.upstream) {
inView.value = false
}
counter = 0
Expand Down
3 changes: 3 additions & 0 deletions xmcl-keystone-ui/src/windows/main/Context.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { kFilterCombobox, kSemaphores, useExternalRoute, useFilterComboboxData, useI18nSync, useSemaphores, useThemeSync } from '@/composables'
import { kBackground, useBackground } from '@/composables/background'
import { kColorTheme, useColorTheme } from '@/composables/colorTheme'
import { kDatabaseStatus, useDatabaseStatus } from '@/composables/databaseStatus'
import { kDropHandler, useDropHandler } from '@/composables/dropHandler'
import { kExceptionHandlers, useExceptionHandlers } from '@/composables/exception'
import { kImageDialog, useImageDialog } from '@/composables/imageDialog'
Expand Down Expand Up @@ -86,6 +87,8 @@ export default defineComponent({
const filesDiagnose = useInstanceFilesDiagnose(files.files, files.install)
const userDiagnose = useUserDiagnose(user.userProfile)

provide(kDatabaseStatus, useDatabaseStatus())

provide(kUserContext, user)
provide(kJavaContext, java)
provide(kSettingsState, settings)
Expand Down
1 change: 1 addition & 0 deletions xmcl-runtime-api/src/services/ResourceService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export interface ResourceService extends GenericEventEmitter<ResourceServiceEven
getResourceMetadataByHash(sha1: string): Promise<ResourceMetadata | undefined>
getResourcesMetadataByHashes(sha1: string[]): Promise<Array<ResourceMetadata | undefined>>

isResourceDatabaseOpened(): Promise<boolean>
getResourcesUnder(options: { fileNames: string[]; domain: ResourceDomain }): Promise<Array<Resource | undefined>>
/**
* Remove resources from the disk
Expand Down
2 changes: 2 additions & 0 deletions xmcl-runtime/resource/core/ResourceContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import { ParseResourceArgs, ParseResourceResult } from '../parsers'
import { ImageStorage } from '~/imageStore'
import { Logger } from '~/logger'
import { Database } from './schema'
import type { Database as SQLite } from 'better-sqlite3'

export interface ResourceContext {
readonly db: Kysely<Database>
readonly sqlite: SQLite

readonly image: ImageStorage

Expand Down
6 changes: 4 additions & 2 deletions xmcl-runtime/resource/core/createResourceContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@ class JSONTransformer extends OperationNodeTransformer {
}

export function createResourceContext(root: string, imageStore: ImageStorage, eventBus: EventEmitter, logger: Logger, delegates: Pick<ResourceContext, 'hash' | 'parse' | 'hashAndFileType'>) {
const sqlite = new SQLite(root, {
})
const dialect = new SqliteDialect({
database: new SQLite(root, {
}),
database: sqlite,
})

// Database interface is passed to Kysely's constructor, and from now on, Kysely
Expand All @@ -61,6 +62,7 @@ export function createResourceContext(root: string, imageStore: ImageStorage, ev

const context: ResourceContext = {
db,
sqlite,
image: imageStore,
hash: delegates.hash,
hashAndFileType: delegates.hashAndFileType,
Expand Down
4 changes: 4 additions & 0 deletions xmcl-runtime/resource/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ export class ResourceService extends AbstractService implements IResourceService
})
}

async isResourceDatabaseOpened() {
return this.context.sqlite.open
}

async getResourceMetadataByUri(uri: string): Promise<ResourceMetadata[]> {
const result = await getResourceAndMetadata(this.context, { uris: [uri] })
return result
Expand Down

0 comments on commit bc1c1b0

Please sign in to comment.