@itwin/core-backend 5.8.0-dev.1 → 5.8.0-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/ECDb.d.ts +26 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +53 -2
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +66 -0
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/cjs/ECSqlRowExecutor.js +135 -0
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -0
- package/lib/cjs/ECSqlStatement.d.ts +13 -1
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +30 -0
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts +104 -0
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/cjs/ECSqlSyncReader.js +191 -0
- package/lib/cjs/ECSqlSyncReader.js.map +1 -0
- package/lib/cjs/IModelDb.d.ts +26 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +55 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +10 -2
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/ECDb.d.ts +26 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +54 -3
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +66 -0
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/esm/ECSqlRowExecutor.js +131 -0
- package/lib/esm/ECSqlRowExecutor.js.map +1 -0
- package/lib/esm/ECSqlStatement.d.ts +13 -1
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +30 -0
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts +104 -0
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/esm/ECSqlSyncReader.js +187 -0
- package/lib/esm/ECSqlSyncReader.js.map +1 -0
- package/lib/esm/IModelDb.d.ts +26 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +55 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +10 -2
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +113 -14
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts +2 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +122 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js +1427 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -0
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js +11 -5
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +178 -100
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +53 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/iModelDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/iModelDb.test.js +35 -0
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -0
- package/package.json +14 -14
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts +0 -2
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts.map +0 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +0 -669
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { createHash } from \"crypto\";\r\nimport * as fs from \"fs-extra\";\r\nimport { dirname, extname, join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { CloudSqliteError, FilePropertyProps, LocalDirName, LocalFileName, WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteStatement } from \"../../SqliteStatement\";\r\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport {\r\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\r\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\r\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\r\n} from \"../../workspace/Workspace\";\r\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\r\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\n\r\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\r\n return dbName ?? \"workspace-db\";\r\n}\r\n\r\n/** file extension for local WorkspaceDbs */\r\nexport const workspaceDbFileExt = \"itwin-workspace\";\r\n\r\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\r\n connectCount: number;\r\n sharedConnect(): boolean;\r\n sharedDisconnect(): void;\r\n}\r\n\r\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\r\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\r\n}\r\n\r\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\r\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\r\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\r\n CloudSqlite.addHiddenProperty(cache, \"workspaceContainers\", new Map<string, WorkspaceCloudContainer>());\r\n return cache;\r\n}\r\n\r\nfunction getContainerFullId(props: WorkspaceContainerProps) {\r\n return `${props.baseUri}/${props.containerId}`;\r\n}\r\n\r\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\r\n const id = getContainerFullId(props);\r\n let cloudContainer = cache.workspaceContainers.get(id);\r\n if (undefined !== cloudContainer)\r\n return cloudContainer;\r\n\r\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\r\n cache.workspaceContainers.set(id, cloudContainer);\r\n cloudContainer.connectCount = 0;\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedConnect\", function (this: WorkspaceCloudContainer) {\r\n if (this.connectCount++ === 0) {\r\n this.connect(cache);\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedDisconnect\", function (this: WorkspaceCloudContainer) {\r\n if (--this.connectCount <= 0) {\r\n this.disconnect();\r\n cache.workspaceContainers.delete(id);\r\n this.connectCount = 0;\r\n }\r\n });\r\n\r\n return cloudContainer;\r\n}\r\n\r\nclass WorkspaceContainerImpl implements WorkspaceContainer {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly workspace: WorkspaceImpl;\r\n public readonly filesDir: LocalDirName;\r\n public readonly id: WorkspaceContainerId;\r\n public readonly fromProps: WorkspaceContainerProps;\r\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\r\n\r\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\r\n return this._cloudContainer;\r\n }\r\n\r\n protected _wsDbs = new Map<WorkspaceDbName, WorkspaceDb>();\r\n public get dirName() { return join(this.workspace.containerDir, this.id); }\r\n\r\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\r\n validateWorkspaceContainerId(props.containerId);\r\n this.workspace = workspace;\r\n this.id = props.containerId;\r\n this.fromProps = props;\r\n\r\n if (props.baseUri !== \"\")\r\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\r\n\r\n workspace.addContainer(this);\r\n this.filesDir = join(this.dirName, \"Files\");\r\n\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return;\r\n\r\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\r\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\r\n try {\r\n if (ProcessDetector.isMobileAppBackend || ProcessDetector.isElectronAppBackend) {\r\n // Even though we've already confirmed that we are running in a native app backend,\r\n // having code here that references NativeHost causes a runtime exception. So we use\r\n // getOnlineStatus to determine whether we're online, which NativeHost keeps up to date.\r\n if (!getOnlineStatus()) {\r\n // If running in a native app and we're offline, don't check for changes.\r\n // Doing so will fail and be caught below, but it has to wait for the network\r\n // timeout.\r\n return;\r\n }\r\n }\r\n cloudContainer.checkForChanges();\r\n } catch {\r\n // must be offline\r\n }\r\n }\r\n }\r\n\r\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n return join(this.dirName, `${props.dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\r\n\r\n return CloudSqlite.querySemverMatch({ ...props, container, dbName: workspaceDbNameWithDefault(props.dbName) });\r\n }\r\n\r\n public addWorkspaceDb(toAdd: WorkspaceDb) {\r\n if (undefined !== this._wsDbs.get(toAdd.dbName))\r\n WorkspaceError.throwError(\"already-exists\", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });\r\n this._wsDbs.set(toAdd.dbName, toAdd);\r\n }\r\n\r\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\r\n return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);\r\n }\r\n\r\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\r\n const name = toDrop.dbName;\r\n const wsDb = this._wsDbs.get(name);\r\n if (wsDb === toDrop) {\r\n this._wsDbs.delete(name);\r\n wsDb.close();\r\n }\r\n }\r\n\r\n public close() {\r\n for (const [_name, db] of this._wsDbs)\r\n db.close();\r\n this._wsDbs.clear();\r\n this.cloudContainer?.sharedDisconnect();\r\n }\r\n}\r\n\r\n/** Implementation of WorkspaceDb */\r\nclass WorkspaceDbImpl implements WorkspaceDb {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly sqliteDb = new WorkspaceSqliteDb();\r\n public readonly dbName: WorkspaceDbName;\r\n protected readonly _container: WorkspaceContainer;\r\n public readonly onClose = new BeEvent<() => void>();\r\n public readonly dbFileName: string;\r\n protected _manifest?: WorkspaceDbManifest;\r\n\r\n /** true if this WorkspaceDb is currently open */\r\n public get isOpen() { return this.sqliteDb.isOpen; }\r\n public get container(): WorkspaceContainer { return this._container; }\r\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\r\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\r\n if (undefined === info)\r\n return undefined;\r\n\r\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\r\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\r\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\r\n localFileName = `${localFileName}.${info.fileExt}`;\r\n return { localFileName, info };\r\n }\r\n\r\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\r\n this.dbName = workspaceDbNameWithDefault(props.dbName);\r\n CloudSqlite.validateDbName(this.dbName);\r\n this._container = container;\r\n this.dbFileName = container.resolveDbFileName(props);\r\n container.addWorkspaceDb(this);\r\n if (true === props.prefetch)\r\n this.prefetch();\r\n }\r\n\r\n public open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\r\n }\r\n\r\n public close() {\r\n if (this.isOpen) {\r\n this.onClose.raiseEvent();\r\n this.sqliteDb.closeDb();\r\n this._container.closeWorkspaceDb(this);\r\n }\r\n }\r\n public get version() {\r\n const cloudContainer = this.container.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return \"1.0.0\"; // local file, no versioning. return default\r\n return CloudSqlite.parseDbFileName(this.dbFileName).version;\r\n }\r\n\r\n public get manifest(): WorkspaceDbManifest {\r\n return this._manifest ??= this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\r\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\r\n });\r\n }\r\n\r\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\r\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\r\n try {\r\n return operation(this.sqliteDb);\r\n } finally {\r\n done();\r\n }\r\n }\r\n\r\n public getString(rscName: WorkspaceResourceName): string | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobReader = SQLiteDb.createBlobIO();\r\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\r\n return blobReader;\r\n });\r\n }\r\n\r\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\r\n return this.withOpenDb((db) => {\r\n const file = this.queryFileResource(rscName);\r\n if (!file)\r\n return undefined;\r\n\r\n const info = file.info;\r\n const localFileName = targetFileName ?? file.localFileName;\r\n\r\n // check whether the file is already up to date.\r\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\r\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\r\n return localFileName; // yes, we're done\r\n\r\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\r\n if (stat)\r\n fs.removeSync(localFileName);\r\n else\r\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\r\n\r\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\r\n const date = new Date(info.date);\r\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\r\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\r\n return localFileName;\r\n });\r\n }\r\n\r\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\r\n const cloudContainer = this._container.cloudContainer;\r\n if (cloudContainer === undefined)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"no cloud container to prefetch\" });\r\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\r\n }\r\n\r\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\r\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\r\n this.withOpenDb((db) => {\r\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\r\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\r\n function* makeIterable() {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n yield stmt.getValueString(0);\r\n }\r\n }\r\n\r\n if (undefined !== args.namePattern) {\r\n stmt.bindString(1, args.namePattern);\r\n }\r\n\r\n args.callback(makeIterable());\r\n });\r\n });\r\n }\r\n}\r\n\r\n/** Implementation of Workspace */\r\nclass WorkspaceImpl implements Workspace {\r\n public readonly [_implementationProhibited] = undefined;\r\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\r\n public readonly containerDir: LocalDirName;\r\n public readonly settings: Settings;\r\n protected _cloudCache?: WorkspaceCloudCache;\r\n public getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\r\n }\r\n\r\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\r\n this.settings = settings;\r\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\r\n let settingsFiles = opts?.settingsFiles;\r\n if (settingsFiles) {\r\n if (typeof settingsFiles === \"string\")\r\n settingsFiles = [settingsFiles];\r\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\r\n }\r\n }\r\n\r\n public addContainer(toAdd: WorkspaceContainerImpl) {\r\n if (undefined !== this._containers.get(toAdd.id))\r\n WorkspaceError.throwError(\"container-exists\", { message: `container ${toAdd.id} already exists in workspace` });\r\n this._containers.set(toAdd.id, toAdd);\r\n }\r\n\r\n public findContainer(containerId: WorkspaceContainerId) {\r\n return this._containers.get(containerId);\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\r\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\r\n }\r\n\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\r\n const accessToken = props.accessToken ?? ((props.baseUri === \"\") || props.isPublic) ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\r\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\r\n if (undefined === container) {\r\n const accessToken = props.isPublic ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\r\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\r\n }\r\n return container.getWorkspaceDb(props);\r\n }\r\n\r\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\r\n if (!Array.isArray(props))\r\n props = [props];\r\n\r\n for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const manifest = db.manifest;\r\n const dictProps: SettingsDictionaryProps = { name: prop.resourceName, workspaceDb: db, priority: prop.priority };\r\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\r\n if (undefined === this.settings.getDictionary(dictProps)) {\r\n const settingsJson = db.getString(prop.resourceName);\r\n if (undefined === settingsJson)\r\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${prop.resourceName}' from: '${manifest.workspaceName}'`, prop, db);\r\n\r\n db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\r\n\r\n this.settings.addJson(dictProps, settingsJson);\r\n const dict = this.settings.getDictionary(dictProps);\r\n if (dict) {\r\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\r\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\r\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\r\n if (nested !== undefined) {\r\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\r\n await this.loadSettingsDictionary(nested, problems);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n db.close();\r\n problems?.push(e as WorkspaceDbLoadError);\r\n }\r\n }\r\n }\r\n\r\n public close() {\r\n this.settings.close();\r\n for (const [_id, container] of this._containers)\r\n container.close();\r\n this._containers.clear();\r\n }\r\n\r\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\r\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\r\n const combine = settingDef?.combineArray === true;\r\n filter = filter ?? (() => true);\r\n const result: WorkspaceDbCloudProps[] = [];\r\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\r\n for (const dbProp of entry.value) {\r\n if (filter(dbProp, entry.dictionary)) {\r\n result.push(dbProp);\r\n }\r\n }\r\n\r\n if (!combine) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\r\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\r\n const result: WorkspaceDb[] = [];\r\n const pushUnique = (wsDb: WorkspaceDb) => {\r\n for (const db of result) {\r\n // if we already have this db, skip it. The test below also has to consider that we create a separate WorkspaceDb object for the same\r\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\r\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\r\n return; // this db is redundant\r\n }\r\n result.push(wsDb);\r\n };\r\n\r\n for (const dbProps of dbList) {\r\n try {\r\n pushUnique(await this.getWorkspaceDb(dbProps));\r\n } catch (e) {\r\n const loadErr = e as WorkspaceDbLoadError;\r\n loadErr.wsDbProps = dbProps;\r\n args.problems?.push(loadErr);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\r\nclass EditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\r\n }\r\n}\r\n\r\nclass EditorImpl implements WorkspaceEditor {\r\n public readonly [_implementationProhibited] = undefined;\r\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\r\n\r\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\r\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\r\n protected static override _cacheName = workspaceEditorName;\r\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"workspace\" } });\r\n const dbFullName = CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\r\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\r\n return props;\r\n }\r\n }\r\n return CloudAccess.initializeWorkspace(args);\r\n }\r\n\r\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\r\n const cloudContainer = await this.initializeContainer(args);\r\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\r\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\r\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\r\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\r\n }\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\r\n const accessToken = props.accessToken ?? (props.baseUri === \"\") ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public close() {\r\n this.workspace.close();\r\n }\r\n}\r\n\r\ninterface EditCloudContainer extends WorkspaceCloudContainer {\r\n writeLockHeldBy?: string; // added by acquireWriteLock\r\n}\r\n\r\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\r\n public override get cloudContainer(): EditCloudContainer | undefined {\r\n return super.cloudContainer as EditCloudContainer | undefined;\r\n }\r\n\r\n public get cloudProps(): WorkspaceContainerProps | undefined {\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return undefined;\r\n return {\r\n baseUri: cloudContainer.baseUri,\r\n containerId: cloudContainer.containerId,\r\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\r\n isPublic: cloudContainer.isPublic,\r\n };\r\n }\r\n\r\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"versions require cloud containers\" });\r\n\r\n const fromDb = { ...args.fromProps, dbName: workspaceDbNameWithDefault(args.fromProps?.dbName) };\r\n return CloudSqlite.createNewDbVersion(container, { ...args, fromDb });\r\n }\r\n\r\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n return this.getEditableDb(props);\r\n }\r\n\r\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n const db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\r\n\r\n if (this.cloudContainer && !CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {\r\n this._wsDbs.delete(workspaceDbNameWithDefault(props.dbName));\r\n CloudSqliteError.throwError(\"already-published\", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public acquireWriteLock(user: string): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.acquireWriteLock(user);\r\n this.cloudContainer.writeLockHeldBy = user;\r\n }\r\n }\r\n public releaseWriteLock() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.releaseWriteLock();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public abandonChanges() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.abandonChanges();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public async createDb(args: { dbName?: string, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\r\n if (!this.cloudContainer) {\r\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\r\n } else {\r\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\r\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\r\n if (fs.existsSync(tempDbFile))\r\n IModelJsFs.removeSync(tempDbFile);\r\n\r\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\r\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName)) });\r\n IModelJsFs.removeSync(tempDbFile);\r\n }\r\n\r\n return this.getWorkspaceDb(args);\r\n }\r\n}\r\n\r\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\r\n public override get container(): EditableWorkspaceContainer {\r\n assert(this._container instanceof EditorContainerImpl);\r\n return this._container;\r\n }\r\n\r\n private static validateResourceName(name: WorkspaceResourceName) {\r\n if (name.trim() !== name)\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name may not have leading or trailing spaces\" });\r\n\r\n if (name.length > 1024) {\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name too long\" });\r\n }\r\n }\r\n\r\n private validateResourceSize(val: Uint8Array | string) {\r\n const len = typeof val === \"string\" ? val.length : val.byteLength;\r\n if (len > (1024 * 1024 * 1024)) // one gigabyte\r\n WorkspaceError.throwError(\"too-large\", { message: \"value is too large\" });\r\n }\r\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\r\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\r\n if (props === undefined)\r\n return undefined;\r\n\r\n const parsed = CloudSqlite.parseDbFileName(this.dbFileName);\r\n return { ...props, dbName: parsed.dbName, version: parsed.version };\r\n }\r\n\r\n public override open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\r\n }\r\n\r\n public override close() {\r\n if (this.isOpen) {\r\n // whenever we close an EditableDb, update the name of the last editor in the manifest\r\n const lastEditedBy = (this._container.cloudContainer as any)?.writeLockHeldBy;\r\n if (lastEditedBy !== undefined)\r\n this.updateManifest({ ...this.manifest, lastEditedBy });\r\n\r\n // make sure all changes were saved before we close\r\n this.sqliteDb.saveChanges();\r\n }\r\n super.close();\r\n }\r\n\r\n private getFileModifiedTime(localFileName: LocalFileName): number {\r\n return Math.round(fs.statSync(localFileName).mtimeMs);\r\n }\r\n\r\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\r\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\r\n stmt.bindString(1, rscName);\r\n bind?.(stmt);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc) {\r\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\r\n WorkspaceError.throwError(\"resource-exists\", { message: `resource \"${rscName}\" already exists` });\r\n\r\n WorkspaceError.throwError(\"write-error\", { message: `workspace [${sql}], rc=${rc}` });\r\n }\r\n });\r\n this.sqliteDb.saveChanges();\r\n }\r\n\r\n public updateManifest(manifest: WorkspaceDbManifest) {\r\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\r\n this._manifest = undefined;\r\n }\r\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\r\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\r\n }\r\n public addString(rscName: WorkspaceResourceName, val: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public updateString(rscName: WorkspaceResourceName, val: string): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public removeString(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\r\n }\r\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobWriter = SQLiteDb.createBlobIO();\r\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\r\n return blobWriter;\r\n });\r\n }\r\n public removeBlob(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\r\n }\r\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n fileExt = fileExt ?? extname(localFileName);\r\n if (fileExt?.[0] === \".\")\r\n fileExt = fileExt.slice(1);\r\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\r\n }\r\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\r\n this.queryFileResource(rscName); // throws if not present\r\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\r\n }\r\n public removeFile(rscName: WorkspaceResourceName): void {\r\n const file = this.queryFileResource(rscName);\r\n if (undefined === file)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `file resource \"${rscName}\" does not exist` });\r\n if (file && fs.existsSync(file.localFileName))\r\n fs.unlinkSync(file.localFileName);\r\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\r\n }\r\n}\r\n\r\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\r\n return new WorkspaceDbImpl(props, container);\r\n}\r\n\r\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new WorkspaceImpl(settings, opts);\r\n}\r\n\r\nexport function constructWorkspaceEditor(): WorkspaceEditor {\r\n return new EditorImpl();\r\n}\r\n\r\n/**\r\n * Validate that a WorkspaceContainer.Id is valid.\r\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\r\n * - may only contain lower case letters, numbers or dashes\r\n * - may not start or end with with a dash nor have more than one dash in a row\r\n * - may not be shorter than 3 or longer than 63 characters\r\n */\r\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\r\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\r\n WorkspaceError.throwError(\"invalid-name\", { message: `invalid containerId: [${id}]` });\r\n}\r\n\r\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\r\n\r\n\r\nfunction throwWorkspaceDbLoadError(message: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, wsDb?: WorkspaceDb): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadError>(\"load-error\", { message, wsDb, wsDbProps });\r\n}\r\n\r\nexport function throwWorkspaceDbLoadErrors(message: string, wsLoadErrors: WorkspaceDbLoadError[]): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadErrors>(\"load-errors\", { message, wsLoadErrors });\r\n}\r\n\r\nexport interface OwnedWorkspace extends Workspace {\r\n /** Only the owner of a Workspace may close it. */\r\n close(): void;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAe,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAW,QAAQ,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAkD,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAqE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE/H,OAAO,EACsB,SAAS,EAE2D,qBAAqB,GACrH,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAqH,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACrL,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,SAAS,0BAA0B,CAAC,MAAwB;IAC1D,OAAO,MAAM,IAAI,cAAc,CAAC;AAClC,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAYpD,SAAS,uBAAuB,CAAC,GAAoC;IACnE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAwB,CAAC;IAC3E,IAAI,SAAS,KAAK,KAAK,CAAC,mBAAmB,EAAE,kDAAkD;QAC7F,WAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAG,EAAmC,CAAC,CAAC;IAC1G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAuC,EAAE,KAA0B;IACrG,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,cAAc;QAC9B,OAAO,cAAc,CAAC;IAExB,cAAc,GAAG,WAAW,CAAC,oBAAoB,CAAC,KAAK,CAA4B,CAAC;IACpF,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAClD,cAAc,CAAC,YAAY,GAAG,CAAC,CAAC;IAChC,WAAW,CAAC,iBAAiB,CAAC,cAAc,EAAE,eAAe,EAAE;QAC7D,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,sBAAsB;IACV,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACxC,SAAS,CAAgB;IACzB,QAAQ,CAAe;IACvB,EAAE,CAAuB;IACzB,SAAS,CAA0B;IAClC,eAAe,CAAuC;IAEvE,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAES,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3E,YAAmB,SAAwB,EAAE,KAA6D;QACxG,4BAA4B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;YACtB,IAAI,CAAC,eAAe,GAAG,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3F,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO;QAET,mHAAmH;QACnH,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,KAAK,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,IAAI,eAAe,CAAC,kBAAkB,IAAI,eAAe,CAAC,oBAAoB,EAAE,CAAC;oBAC/E,mFAAmF;oBACnF,oFAAoF;oBACpF,wFAAwF;oBACxF,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;wBACvB,yEAAyE;wBACzE,6EAA6E;wBAC7E,WAAW;wBACX,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,cAAc,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,KAAuB;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC,mCAAmC;QAEzG,OAAO,WAAW,CAAC,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IAEM,cAAc,CAAC,KAAkB;QACtC,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAC7C,cAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,CAAC,MAAM,+BAA+B,EAAE,CAAC,CAAC;QACxH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,cAAc,CAAC,KAAwB;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9G,CAAC;IAEM,gBAAgB,CAAC,MAAmB;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK;QACV,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM;YACnC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,oCAAoC;AACpC,MAAM,eAAe;IACH,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACxC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACnC,MAAM,CAAkB;IACrB,UAAU,CAAqB;IAClC,OAAO,GAAG,IAAI,OAAO,EAAc,CAAC;IACpC,UAAU,CAAS;IACzB,SAAS,CAAuB;IAE1C,iDAAiD;IACjD,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,IAAW,SAAS,KAAyB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/D,iBAAiB,CAAC,OAA8B;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO,SAAS,CAAC;QAEnB,iIAAiI;QACjI,IAAI,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7H,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,8FAA8F;YACrH,aAAa,GAAG,GAAG,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,YAAmB,KAAuB,EAAE,SAA6B;QACvE,IAAI,CAAC,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrD,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3F,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,IAAW,OAAO;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;QACrD,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO,OAAO,CAAC,CAAC,4CAA4C;QAC9D,OAAO,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/C,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,IAAI,CAAuB,CAAC;YAC5G,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAI,SAAuC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,OAA8B;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,OAAO,EAAE,CAAC,mBAAmB,CAAC,sCAAsC,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7E,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5B,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,OAA8B;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;YACtF,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrH,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,OAA8B;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,OAAO,EAAE,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3E,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5B,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,OAA8B,EAAE,cAA8B;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI;gBACP,OAAO,SAAS,CAAC;YAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,aAAa,GAAG,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC;YAE3D,gDAAgD;YAChD,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gBAC3E,OAAO,aAAa,CAAC,CAAC,kBAAkB;YAE1C,kFAAkF;YAClF,IAAI,IAAI;gBACN,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;;gBAE7B,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;YAExD,EAAE,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,oEAAoE;YAC9G,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB;YACzD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,IAAgC;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QACtD,IAAI,cAAc,KAAK,SAAS;YAC9B,cAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACjG,OAAO,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IAEM,cAAc,CAAC,IAAmC;QACvD,MAAM,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,KAAK,GAAG,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjE,QAAQ,CAAC,CAAC,YAAY;oBACpB,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAED,IAAI,SAAS,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvC,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kCAAkC;AAClC,MAAM,aAAa;IACD,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAgD,CAAC;IAC9D,YAAY,CAAe;IAC3B,QAAQ,CAAW;IACzB,WAAW,CAAuB;IACrC,aAAa;QAClB,OAAO,IAAI,CAAC,WAAW,KAAK,uBAAuB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,YAAmB,QAAkB,EAAE,IAAoB;QACzD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjF,IAAI,aAAa,GAAG,IAAI,EAAE,aAAa,CAAC;QACxC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,OAAO,aAAa,KAAK,QAAQ;gBACnC,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAEM,YAAY,CAAC,KAA6B;QAC/C,IAAI,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAClH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,WAAiC;QACpD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAEM,YAAY,CAAC,KAAgC;QAClD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,KAA8B;QAC3D,IAAI,KAAK,CAAC,WAAW;YACnB,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,KAA4B;QACtD,IAAI,SAAS,GAAmC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC5G,SAAS,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAC,KAA4D,EAAE,QAAiC;QACjI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3C,EAAE,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;gBAC7B,MAAM,SAAS,GAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjH,0GAA0G;gBAC1G,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzD,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBACrD,IAAI,SAAS,KAAK,YAAY;wBAC5B,yBAAyB,CAAC,+CAA+C,IAAI,CAAC,YAAY,YAAY,QAAQ,CAAC,aAAa,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBAE7I,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,6FAA6F;oBAEzG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;oBACpD,IAAI,IAAI,EAAE,CAAC;wBACT,SAAS,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC3D,gGAAgG;wBAChG,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAA6B,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;wBACrG,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;4BACzB,UAAU,CAAC,eAAe,CAAC,eAAe,CAA6B,MAAM,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;4BACzH,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;wBACtD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,EAAE,IAAI,CAAC,CAAyB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW;YAC7C,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEM,yBAAyB,CAAC,WAAwB,EAAE,MAA+B;QACxF,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,UAAU,EAAE,YAAY,KAAK,IAAI,CAAC;QAClD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAA0B,WAAW,CAAC,EAAE,CAAC;YAC1F,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,IAA4G;QACvI,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3H,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,CAAC,IAAiB,EAAE,EAAE;YACvC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,qIAAqI;gBACrI,+FAA+F;gBAC/F,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;oBACzH,OAAO,CAAC,uBAAuB;YACnC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,CAAyB,CAAC;gBAC1C,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,CAAC,6CAA6C;AAC5F,MAAM,mBAAoB,SAAQ,aAAa;IAC7B,aAAa;QAC3B,OAAO,IAAI,CAAC,WAAW,KAAK,uBAAuB,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;CACF;AAED,MAAM,UAAU;IACE,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACjD,SAAS,GAAG,IAAI,mBAAmB,CAAC,IAAI,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE1H,KAAK,CAAC,mBAAmB,CAAC,IAAqC;QACpE,MAAM,WAAY,SAAQ,WAAW,CAAC,QAA2B;YACrD,MAAM,CAAU,UAAU,GAAG,mBAAmB,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAqC;gBAC3E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBAChI,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9G,OAAO,KAAK,CAAC;YACf,CAAC;;QAEH,OAAO,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAAC,IAAqC;QACxE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,cAAc,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACxH,CAAC;IAEM,YAAY,CAAC,KAAgC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAA2C,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrJ,CAAC;IACM,KAAK,CAAC,iBAAiB,CAAC,KAA8B;QAC3D,IAAI,KAAK,CAAC,WAAW;YACnB,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAMD,MAAM,mBAAoB,SAAQ,sBAAsB;IACtD,IAAoB,cAAc;QAChC,OAAO,KAAK,CAAC,cAAgD,CAAC;IAChE,CAAC;IAED,IAAW,UAAU;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO,SAAS,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,WAAW,EAAE,cAAc,CAAC,WAAiC;YAC7D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SAClC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,2BAA2B,CAAC,IAAqC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS;YACzB,cAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAEpG,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,0BAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACjG,OAAO,WAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAEe,cAAc,CAAC,KAAuB;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,aAAa,CAAC,KAAuB;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAA+B,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEtI,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,gBAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,oEAAoE,EAAE,CAAC,CAAC;QACtJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,gBAAgB,CAAC,IAAY;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;IACM,gBAAgB;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAwD;QAC5E,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,eAAe,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACN,0HAA0H;YAC1H,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC,CAAC;YAC9E,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC3B,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAEpC,eAAe,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5J,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,cAAe,SAAQ,eAAe;IAC1C,IAAoB,SAAS;QAC3B,MAAM,CAAC,IAAI,CAAC,UAAU,YAAY,mBAAmB,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,IAA2B;QAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI;YACtB,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAC;QAElH,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACvB,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,GAAwB;QACnD,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAClE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,eAAe;YAC7C,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAW,UAAU;QACnB,MAAM,KAAK,GAAI,IAAI,CAAC,UAAkC,CAAC,UAA4C,CAAC;QACpG,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,SAAS,CAAC;QAEnB,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC;IAEe,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IAEe,KAAK;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,sFAAsF;YACtF,MAAM,YAAY,GAAI,IAAI,CAAC,UAAU,CAAC,cAAsB,EAAE,eAAe,CAAC;YAC9E,IAAI,YAAY,KAAK,SAAS;gBAC5B,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YAE1D,mDAAmD;YACnD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAEO,mBAAmB,CAAC,aAA4B;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,eAAe,CAAC,OAA8B,EAAE,GAAW,EAAE,IAAsC;QACzG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;gBACnC,IAAI,QAAQ,CAAC,+BAA+B,KAAK,EAAE;oBACjD,cAAc,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa,OAAO,kBAAkB,EAAE,CAAC,CAAC;gBAEpG,cAAc,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc,CAAC,QAA6B;QACjD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACM,sBAAsB,CAAC,QAA2B,EAAE,OAAgB;QACzE,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,CAAC;IACM,SAAS,CAAC,OAA8B,EAAE,GAAW;QAC1D,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,2CAA2C,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC;IACM,YAAY,CAAC,OAA8B,EAAE,GAAW;QAC7D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,0HAA0H,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/L,CAAC;IACM,YAAY,CAAC,OAA8B;QAChD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC;IAClE,CAAC;IACM,OAAO,CAAC,OAA8B,EAAE,GAAe;QAC5D,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,yCAAyC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5G,CAAC;IACM,UAAU,CAAC,OAA8B,EAAE,GAAe;QAC/D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,wHAAwH,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3L,CAAC;IACM,aAAa,CAAC,OAA8B;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;YACtF,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtI,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IACM,UAAU,CAAC,OAA8B;QAC9C,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;IAChE,CAAC;IACM,OAAO,CAAC,OAA8B,EAAE,aAA4B,EAAE,OAAgB;QAC3F,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG;YACtB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/H,CAAC;IACM,UAAU,CAAC,OAA8B,EAAE,aAA4B;QAC5E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;QACzD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAChI,CAAC;IACM,UAAU,CAAC,OAA8B;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,SAAS,KAAK,IAAI;YACpB,cAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,kBAAkB,OAAO,kBAAkB,EAAE,CAAC,CAAC;QACxG,IAAI,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAuB,EAAE,SAA6B;IACzF,OAAO,IAAI,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAkB,EAAE,IAAoB;IACzE,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAAwB;IACnE,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAsB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAGzG,SAAS,yBAAyB,CAAC,OAAe,EAAE,SAAmD,EAAE,IAAkB;IACzH,cAAc,CAAC,UAAU,CAAuB,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,YAAoC;IAC9F,cAAc,CAAC,UAAU,CAAwB,aAAa,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AAC7F,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { createHash } from \"crypto\";\r\nimport * as fs from \"fs-extra\";\r\nimport { dirname, extname, join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { CloudSqliteError, FilePropertyProps, LocalDirName, LocalFileName, WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteStatement } from \"../../SqliteStatement\";\r\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport {\r\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\r\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\r\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\r\n} from \"../../workspace/Workspace\";\r\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\r\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\n\r\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\r\n return dbName ?? \"workspace-db\";\r\n}\r\n\r\n/** file extension for local WorkspaceDbs */\r\nexport const workspaceDbFileExt = \"itwin-workspace\";\r\n\r\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\r\n connectCount: number;\r\n sharedConnect(): boolean;\r\n sharedDisconnect(): void;\r\n}\r\n\r\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\r\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\r\n}\r\n\r\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\r\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\r\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\r\n CloudSqlite.addHiddenProperty(cache, \"workspaceContainers\", new Map<string, WorkspaceCloudContainer>());\r\n return cache;\r\n}\r\n\r\nfunction getContainerFullId(props: WorkspaceContainerProps) {\r\n return `${props.baseUri}/${props.containerId}`;\r\n}\r\n\r\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\r\n const id = getContainerFullId(props);\r\n let cloudContainer = cache.workspaceContainers.get(id);\r\n if (undefined !== cloudContainer)\r\n return cloudContainer;\r\n\r\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\r\n cache.workspaceContainers.set(id, cloudContainer);\r\n cloudContainer.connectCount = 0;\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedConnect\", function (this: WorkspaceCloudContainer) {\r\n if (this.connectCount++ === 0) {\r\n this.connect(cache);\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedDisconnect\", function (this: WorkspaceCloudContainer) {\r\n if (--this.connectCount <= 0) {\r\n this.disconnect();\r\n cache.workspaceContainers.delete(id);\r\n this.connectCount = 0;\r\n }\r\n });\r\n\r\n return cloudContainer;\r\n}\r\n\r\nclass WorkspaceContainerImpl implements WorkspaceContainer {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly workspace: WorkspaceImpl;\r\n public readonly filesDir: LocalDirName;\r\n public readonly id: WorkspaceContainerId;\r\n public readonly fromProps: WorkspaceContainerProps;\r\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\r\n\r\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\r\n return this._cloudContainer;\r\n }\r\n\r\n protected _wsDbs = new Map<WorkspaceDbName, WorkspaceDb>();\r\n public get dirName() { return join(this.workspace.containerDir, this.id); }\r\n\r\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\r\n validateWorkspaceContainerId(props.containerId);\r\n this.workspace = workspace;\r\n this.id = props.containerId;\r\n this.fromProps = props;\r\n\r\n if (props.baseUri !== \"\")\r\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\r\n\r\n workspace.addContainer(this);\r\n this.filesDir = join(this.dirName, \"Files\");\r\n\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return;\r\n\r\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\r\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\r\n try {\r\n if (ProcessDetector.isMobileAppBackend || ProcessDetector.isElectronAppBackend) {\r\n // Even though we've already confirmed that we are running in a native app backend,\r\n // having code here that references NativeHost causes a runtime exception. So we use\r\n // getOnlineStatus to determine whether we're online, which NativeHost keeps up to date.\r\n if (!getOnlineStatus()) {\r\n // If running in a native app and we're offline, don't check for changes.\r\n // Doing so will fail and be caught below, but it has to wait for the network\r\n // timeout.\r\n return;\r\n }\r\n }\r\n cloudContainer.checkForChanges();\r\n } catch {\r\n // must be offline\r\n }\r\n }\r\n }\r\n\r\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n return join(this.dirName, `${props.dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\r\n\r\n return CloudSqlite.querySemverMatch({ ...props, container, dbName: workspaceDbNameWithDefault(props.dbName) });\r\n }\r\n\r\n public addWorkspaceDb(toAdd: WorkspaceDb) {\r\n if (undefined !== this._wsDbs.get(toAdd.dbName))\r\n WorkspaceError.throwError(\"already-exists\", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });\r\n this._wsDbs.set(toAdd.dbName, toAdd);\r\n }\r\n\r\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\r\n return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);\r\n }\r\n\r\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\r\n const name = toDrop.dbName;\r\n const wsDb = this._wsDbs.get(name);\r\n if (wsDb === toDrop) {\r\n this._wsDbs.delete(name);\r\n wsDb.close();\r\n }\r\n }\r\n\r\n public close() {\r\n for (const [_name, db] of this._wsDbs)\r\n db.close();\r\n this._wsDbs.clear();\r\n this.cloudContainer?.sharedDisconnect();\r\n }\r\n}\r\n\r\n/** Implementation of WorkspaceDb */\r\nclass WorkspaceDbImpl implements WorkspaceDb {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly sqliteDb = new WorkspaceSqliteDb();\r\n public readonly dbName: WorkspaceDbName;\r\n protected readonly _container: WorkspaceContainer;\r\n public readonly onClose = new BeEvent<() => void>();\r\n public readonly dbFileName: string;\r\n protected _manifest?: WorkspaceDbManifest;\r\n\r\n /** true if this WorkspaceDb is currently open */\r\n public get isOpen() { return this.sqliteDb.isOpen; }\r\n public get container(): WorkspaceContainer { return this._container; }\r\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\r\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\r\n if (undefined === info)\r\n return undefined;\r\n\r\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\r\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\r\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\r\n localFileName = `${localFileName}.${info.fileExt}`;\r\n return { localFileName, info };\r\n }\r\n\r\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\r\n this.dbName = workspaceDbNameWithDefault(props.dbName);\r\n CloudSqlite.validateDbName(this.dbName);\r\n this._container = container;\r\n this.dbFileName = container.resolveDbFileName(props);\r\n container.addWorkspaceDb(this);\r\n if (true === props.prefetch)\r\n this.prefetch();\r\n }\r\n\r\n public open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\r\n }\r\n\r\n public close() {\r\n if (this.isOpen) {\r\n this.onClose.raiseEvent();\r\n this.sqliteDb.closeDb();\r\n this._container.closeWorkspaceDb(this);\r\n }\r\n }\r\n public get version() {\r\n const cloudContainer = this.container.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return \"1.0.0\"; // local file, no versioning. return default\r\n return CloudSqlite.parseDbFileName(this.dbFileName).version;\r\n }\r\n\r\n public get manifest(): WorkspaceDbManifest {\r\n return this._manifest ??= this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\r\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\r\n });\r\n }\r\n\r\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\r\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\r\n try {\r\n return operation(this.sqliteDb);\r\n } finally {\r\n done();\r\n }\r\n }\r\n\r\n public getString(rscName: WorkspaceResourceName): string | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobReader = SQLiteDb.createBlobIO();\r\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\r\n return blobReader;\r\n });\r\n }\r\n\r\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\r\n return this.withOpenDb((db) => {\r\n const file = this.queryFileResource(rscName);\r\n if (!file)\r\n return undefined;\r\n\r\n const info = file.info;\r\n const localFileName = targetFileName ?? file.localFileName;\r\n\r\n // check whether the file is already up to date.\r\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\r\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\r\n return localFileName; // yes, we're done\r\n\r\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\r\n if (stat)\r\n fs.removeSync(localFileName);\r\n else\r\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\r\n\r\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\r\n const date = new Date(info.date);\r\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\r\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\r\n return localFileName;\r\n });\r\n }\r\n\r\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\r\n const cloudContainer = this._container.cloudContainer;\r\n if (cloudContainer === undefined)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"no cloud container to prefetch\" });\r\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\r\n }\r\n\r\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\r\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\r\n this.withOpenDb((db) => {\r\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\r\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\r\n function* makeIterable() {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n yield stmt.getValueString(0);\r\n }\r\n }\r\n\r\n if (undefined !== args.namePattern) {\r\n stmt.bindString(1, args.namePattern);\r\n }\r\n\r\n args.callback(makeIterable());\r\n });\r\n });\r\n }\r\n}\r\n\r\n/** Implementation of Workspace */\r\nclass WorkspaceImpl implements Workspace {\r\n public readonly [_implementationProhibited] = undefined;\r\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\r\n public readonly containerDir: LocalDirName;\r\n public readonly settings: Settings;\r\n protected _cloudCache?: WorkspaceCloudCache;\r\n public getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\r\n }\r\n\r\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\r\n this.settings = settings;\r\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\r\n let settingsFiles = opts?.settingsFiles;\r\n if (settingsFiles) {\r\n if (typeof settingsFiles === \"string\")\r\n settingsFiles = [settingsFiles];\r\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\r\n }\r\n }\r\n\r\n public addContainer(toAdd: WorkspaceContainerImpl) {\r\n if (undefined !== this._containers.get(toAdd.id))\r\n WorkspaceError.throwError(\"container-exists\", { message: `container ${toAdd.id} already exists in workspace` });\r\n this._containers.set(toAdd.id, toAdd);\r\n }\r\n\r\n public findContainer(containerId: WorkspaceContainerId) {\r\n return this._containers.get(containerId);\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\r\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\r\n }\r\n\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\" || props.isPublic)\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\r\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\r\n if (undefined === container) {\r\n const accessToken = props.isPublic ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\r\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\r\n }\r\n return container.getWorkspaceDb(props);\r\n }\r\n\r\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\r\n if (!Array.isArray(props))\r\n props = [props];\r\n\r\n for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const manifest = db.manifest;\r\n const dictProps: SettingsDictionaryProps = { name: prop.resourceName, workspaceDb: db, priority: prop.priority };\r\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\r\n if (undefined === this.settings.getDictionary(dictProps)) {\r\n const settingsJson = db.getString(prop.resourceName);\r\n if (undefined === settingsJson)\r\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${prop.resourceName}' from: '${manifest.workspaceName}'`, prop, db);\r\n\r\n db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\r\n\r\n this.settings.addJson(dictProps, settingsJson);\r\n const dict = this.settings.getDictionary(dictProps);\r\n if (dict) {\r\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\r\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\r\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\r\n if (nested !== undefined) {\r\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\r\n await this.loadSettingsDictionary(nested, problems);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n db.close();\r\n problems?.push(e as WorkspaceDbLoadError);\r\n }\r\n }\r\n }\r\n\r\n public close() {\r\n this.settings.close();\r\n for (const [_id, container] of this._containers)\r\n container.close();\r\n this._containers.clear();\r\n }\r\n\r\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\r\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\r\n const combine = settingDef?.combineArray === true;\r\n filter = filter ?? (() => true);\r\n const result: WorkspaceDbCloudProps[] = [];\r\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\r\n for (const dbProp of entry.value) {\r\n if (filter(dbProp, entry.dictionary)) {\r\n result.push(dbProp);\r\n }\r\n }\r\n\r\n if (!combine) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\r\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\r\n const result: WorkspaceDb[] = [];\r\n const pushUnique = (wsDb: WorkspaceDb) => {\r\n for (const db of result) {\r\n // if we already have this db, skip it. The test below also has to consider that we create a separate WorkspaceDb object for the same\r\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\r\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\r\n return; // this db is redundant\r\n }\r\n result.push(wsDb);\r\n };\r\n\r\n for (const dbProps of dbList) {\r\n try {\r\n pushUnique(await this.getWorkspaceDb(dbProps));\r\n } catch (e) {\r\n const loadErr = e as WorkspaceDbLoadError;\r\n loadErr.wsDbProps = dbProps;\r\n args.problems?.push(loadErr);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\r\nclass EditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\r\n }\r\n}\r\n\r\nclass EditorImpl implements WorkspaceEditor {\r\n public readonly [_implementationProhibited] = undefined;\r\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\r\n\r\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\r\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\r\n protected static override _cacheName = workspaceEditorName;\r\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"workspace\" } });\r\n const dbFullName = CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\r\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\r\n return props;\r\n }\r\n }\r\n return CloudAccess.initializeWorkspace(args);\r\n }\r\n\r\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\r\n const cloudContainer = await this.initializeContainer(args);\r\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\r\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\r\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\r\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\r\n }\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\")\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public close() {\r\n this.workspace.close();\r\n }\r\n}\r\n\r\ninterface EditCloudContainer extends WorkspaceCloudContainer {\r\n writeLockHeldBy?: string; // added by acquireWriteLock\r\n}\r\n\r\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\r\n public override get cloudContainer(): EditCloudContainer | undefined {\r\n return super.cloudContainer as EditCloudContainer | undefined;\r\n }\r\n\r\n public get cloudProps(): WorkspaceContainerProps | undefined {\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return undefined;\r\n return {\r\n baseUri: cloudContainer.baseUri,\r\n containerId: cloudContainer.containerId,\r\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\r\n isPublic: cloudContainer.isPublic,\r\n };\r\n }\r\n\r\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"versions require cloud containers\" });\r\n\r\n const fromDb = { ...args.fromProps, dbName: workspaceDbNameWithDefault(args.fromProps?.dbName) };\r\n return CloudSqlite.createNewDbVersion(container, { ...args, fromDb });\r\n }\r\n\r\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n return this.getEditableDb(props);\r\n }\r\n\r\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n const db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\r\n\r\n if (this.cloudContainer && !CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {\r\n this._wsDbs.delete(workspaceDbNameWithDefault(props.dbName));\r\n CloudSqliteError.throwError(\"already-published\", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public acquireWriteLock(user: string): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.acquireWriteLock(user);\r\n this.cloudContainer.writeLockHeldBy = user;\r\n }\r\n }\r\n public releaseWriteLock() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.releaseWriteLock();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public abandonChanges() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.abandonChanges();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public async createDb(args: { dbName?: string, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\r\n if (!this.cloudContainer) {\r\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\r\n } else {\r\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\r\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\r\n if (fs.existsSync(tempDbFile))\r\n IModelJsFs.removeSync(tempDbFile);\r\n\r\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\r\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName)) });\r\n IModelJsFs.removeSync(tempDbFile);\r\n }\r\n\r\n return this.getWorkspaceDb(args);\r\n }\r\n}\r\n\r\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\r\n public override get container(): EditableWorkspaceContainer {\r\n assert(this._container instanceof EditorContainerImpl);\r\n return this._container;\r\n }\r\n\r\n private static validateResourceName(name: WorkspaceResourceName) {\r\n if (name.trim() !== name)\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name may not have leading or trailing spaces\" });\r\n\r\n if (name.length > 1024) {\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name too long\" });\r\n }\r\n }\r\n\r\n private validateResourceSize(val: Uint8Array | string) {\r\n const len = typeof val === \"string\" ? val.length : val.byteLength;\r\n if (len > (1024 * 1024 * 1024)) // one gigabyte\r\n WorkspaceError.throwError(\"too-large\", { message: \"value is too large\" });\r\n }\r\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\r\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\r\n if (props === undefined)\r\n return undefined;\r\n\r\n const parsed = CloudSqlite.parseDbFileName(this.dbFileName);\r\n return { ...props, dbName: parsed.dbName, version: parsed.version };\r\n }\r\n\r\n public override open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\r\n }\r\n\r\n public override close() {\r\n if (this.isOpen) {\r\n // whenever we close an EditableDb, update the name of the last editor in the manifest\r\n const lastEditedBy = (this._container.cloudContainer as any)?.writeLockHeldBy;\r\n if (lastEditedBy !== undefined)\r\n this.updateManifest({ ...this.manifest, lastEditedBy });\r\n\r\n // make sure all changes were saved before we close\r\n this.sqliteDb.saveChanges();\r\n }\r\n super.close();\r\n }\r\n\r\n private getFileModifiedTime(localFileName: LocalFileName): number {\r\n return Math.round(fs.statSync(localFileName).mtimeMs);\r\n }\r\n\r\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\r\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\r\n stmt.bindString(1, rscName);\r\n bind?.(stmt);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc) {\r\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\r\n WorkspaceError.throwError(\"resource-exists\", { message: `resource \"${rscName}\" already exists` });\r\n\r\n WorkspaceError.throwError(\"write-error\", { message: `workspace [${sql}], rc=${rc}` });\r\n }\r\n });\r\n this.sqliteDb.saveChanges();\r\n }\r\n\r\n public updateManifest(manifest: WorkspaceDbManifest) {\r\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\r\n this._manifest = undefined;\r\n }\r\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\r\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\r\n }\r\n public addString(rscName: WorkspaceResourceName, val: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public updateString(rscName: WorkspaceResourceName, val: string): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public removeString(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\r\n }\r\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobWriter = SQLiteDb.createBlobIO();\r\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\r\n return blobWriter;\r\n });\r\n }\r\n public removeBlob(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\r\n }\r\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n fileExt = fileExt ?? extname(localFileName);\r\n if (fileExt?.[0] === \".\")\r\n fileExt = fileExt.slice(1);\r\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\r\n }\r\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\r\n this.queryFileResource(rscName); // throws if not present\r\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\r\n }\r\n public removeFile(rscName: WorkspaceResourceName): void {\r\n const file = this.queryFileResource(rscName);\r\n if (undefined === file)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `file resource \"${rscName}\" does not exist` });\r\n if (file && fs.existsSync(file.localFileName))\r\n fs.unlinkSync(file.localFileName);\r\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\r\n }\r\n}\r\n\r\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\r\n return new WorkspaceDbImpl(props, container);\r\n}\r\n\r\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new WorkspaceImpl(settings, opts);\r\n}\r\n\r\nexport function constructWorkspaceEditor(): WorkspaceEditor {\r\n return new EditorImpl();\r\n}\r\n\r\n/**\r\n * Validate that a WorkspaceContainer.Id is valid.\r\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\r\n * - may only contain lower case letters, numbers or dashes\r\n * - may not start or end with with a dash nor have more than one dash in a row\r\n * - may not be shorter than 3 or longer than 63 characters\r\n */\r\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\r\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\r\n WorkspaceError.throwError(\"invalid-name\", { message: `invalid containerId: [${id}]` });\r\n}\r\n\r\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\r\n\r\n\r\nfunction throwWorkspaceDbLoadError(message: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, wsDb?: WorkspaceDb): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadError>(\"load-error\", { message, wsDb, wsDbProps });\r\n}\r\n\r\nexport function throwWorkspaceDbLoadErrors(message: string, wsLoadErrors: WorkspaceDbLoadError[]): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadErrors>(\"load-errors\", { message, wsLoadErrors });\r\n}\r\n\r\nexport interface OwnedWorkspace extends Workspace {\r\n /** Only the owner of a Workspace may close it. */\r\n close(): void;\r\n}\r\n"]}
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { assert } from "chai";
|
|
6
5
|
import { DbResult, Id64 } from "@itwin/core-bentley";
|
|
7
6
|
import { DbRequestKind, ECSqlReader, QueryBinder, QueryOptionsBuilder, QueryRowFormat } from "@itwin/core-common";
|
|
7
|
+
import { assert, expect, use } from "chai";
|
|
8
|
+
import * as chaiAsPromised from "chai-as-promised";
|
|
9
|
+
import * as path from "path";
|
|
8
10
|
import { ConcurrentQuery } from "../../ConcurrentQuery";
|
|
9
11
|
import { _nativeDb, SnapshotDb } from "../../core-backend";
|
|
10
12
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
11
13
|
import { SequentialLogMatcher } from "../SequentialLogMatcher";
|
|
12
|
-
|
|
14
|
+
use(chaiAsPromised);
|
|
13
15
|
// cspell:ignore mirukuru ibim
|
|
14
16
|
describe("ECSql Query", () => {
|
|
15
17
|
let imodel1;
|
|
@@ -34,6 +36,15 @@ describe("ECSql Query", () => {
|
|
|
34
36
|
imodel5.close();
|
|
35
37
|
imodel6.close();
|
|
36
38
|
});
|
|
39
|
+
const megaBytes = (n) => n * 1024 * 1024;
|
|
40
|
+
it("v8 max string length test", async () => {
|
|
41
|
+
const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(500)}))`);
|
|
42
|
+
await expect(reader.step()).to.be.rejectedWith("result size exceeded maximum allowed size");
|
|
43
|
+
});
|
|
44
|
+
it("step fail with large blob", async () => {
|
|
45
|
+
const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(5000)}))`);
|
|
46
|
+
await expect(reader.step()).to.be.rejectedWith("concurrent query step() failed: string or blob too big (BE_SQLITE_TOOBIG)");
|
|
47
|
+
});
|
|
37
48
|
it("verify 4.8.x format for ECClassId", async () => {
|
|
38
49
|
const queries = [
|
|
39
50
|
"SELECT ECClassId FROM Bis.Element LIMIT 1",
|
|
@@ -557,8 +568,26 @@ describe("ECSql Query", () => {
|
|
|
557
568
|
assert.equal(reader.stats.backendRowsReturned, 0);
|
|
558
569
|
assert.isTrue(reader.stats.backendCpuTime > 0);
|
|
559
570
|
});
|
|
560
|
-
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
|
|
571
|
+
it("concurrent query bind idset with invalid values in IdSet virtual table should fail", async () => {
|
|
561
572
|
const ids = ["0x1", "ABC", "YZ"];
|
|
573
|
+
try {
|
|
574
|
+
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
575
|
+
}
|
|
576
|
+
catch (err) {
|
|
577
|
+
assert.equal(err.message, "unsupported type");
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
it("concurrent query bind idset with invalid values in IdSet virtual table should fail", async () => {
|
|
581
|
+
const ids = ["ABC", "0x1", "YZ"]; // as first value is not an Id so QueryBinder.from will throw error of "unsupported type"
|
|
582
|
+
try {
|
|
583
|
+
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
584
|
+
}
|
|
585
|
+
catch (err) {
|
|
586
|
+
assert.equal(err.message, "unsupported type");
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
it("concurrent query bind multiple ids in idset virtual table", async () => {
|
|
590
|
+
const ids = ["0x1", "0xe", "0x10"];
|
|
562
591
|
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
563
592
|
let props = await reader.getMetaData();
|
|
564
593
|
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
|
|
@@ -566,21 +595,12 @@ describe("ECSql Query", () => {
|
|
|
566
595
|
while (await reader.step()) {
|
|
567
596
|
rows++;
|
|
568
597
|
}
|
|
569
|
-
assert.equal(rows,
|
|
598
|
+
assert.equal(rows, 3);
|
|
570
599
|
props = await reader.getMetaData();
|
|
571
600
|
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
|
|
572
|
-
assert.equal(reader.stats.backendRowsReturned,
|
|
601
|
+
assert.equal(reader.stats.backendRowsReturned, 3);
|
|
573
602
|
assert.isTrue(reader.stats.backendCpuTime > 0);
|
|
574
603
|
});
|
|
575
|
-
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
|
|
576
|
-
const ids = ["ABC", "0x1", "YZ"]; // as first value is not an Id so QueryBinder.from will throw error of "unsupported type"
|
|
577
|
-
try {
|
|
578
|
-
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
579
|
-
}
|
|
580
|
-
catch (err) {
|
|
581
|
-
assert.equal(err.message, "unsupported type");
|
|
582
|
-
}
|
|
583
|
-
});
|
|
584
604
|
it("concurrent query get meta data", async () => {
|
|
585
605
|
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element");
|
|
586
606
|
let props = await reader.getMetaData();
|
|
@@ -694,5 +714,84 @@ describe("ECSql Query", () => {
|
|
|
694
714
|
assert.equal(rowCounts[entry], resultSet.length);
|
|
695
715
|
}
|
|
696
716
|
});
|
|
717
|
+
describe("supports_instance_query", () => {
|
|
718
|
+
it("returns 1 for entity classes", async () => {
|
|
719
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
720
|
+
assert.equal(row[0], 1, "Entity class BisCore.Element should support instance queries");
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
it("returns 1 for link table relationship classes", async () => {
|
|
724
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.CategorySelectorRefersToCategories')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
725
|
+
assert.equal(row[0], 1, "Link table relationship should support instance queries");
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
it("returns 1 for link table relationship with external class ids", async () => {
|
|
729
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.ModelSelectorRefersToModels')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
730
|
+
assert.equal(row[0], 1, "ModelSelectorRefersToModels (link table with external class ids) should support instance queries");
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
it("returns 0 for non-existent classes", async () => {
|
|
734
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.DoesNotExist')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
735
|
+
assert.equal(row[0], 0, "Non-existent class should not support instance queries");
|
|
736
|
+
}
|
|
737
|
+
});
|
|
738
|
+
it("returns 0 for NULL input", async () => {
|
|
739
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query(NULL)", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
740
|
+
assert.equal(row[0], 0, "NULL input should return 0");
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
it("works with schema alias:class format", async () => {
|
|
744
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('bis:Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
745
|
+
assert.equal(row[0], 1, "Should work with alias:class format");
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
it("works with integer class id", async () => {
|
|
749
|
+
// First get the class id for BisCore.Element
|
|
750
|
+
let classId;
|
|
751
|
+
for await (const row of imodel1.createQueryReader("SELECT ec_classid('BisCore', 'Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
752
|
+
classId = row[0];
|
|
753
|
+
}
|
|
754
|
+
assert.isDefined(classId, "Should be able to resolve BisCore.Element class id");
|
|
755
|
+
for await (const row of imodel1.createQueryReader(`SELECT supports_instance_query(${classId})`, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
756
|
+
assert.equal(row[0], 1, "Should work with integer class id");
|
|
757
|
+
}
|
|
758
|
+
});
|
|
759
|
+
it("can be used to filter classes that support instance queries", async () => {
|
|
760
|
+
// Example: find all classes in a schema that support SELECT $
|
|
761
|
+
const rows = [];
|
|
762
|
+
for await (const row of imodel1.createQueryReader(`SELECT c.Name, supports_instance_query(c.ECInstanceId) as supported
|
|
763
|
+
FROM meta.ECClassDef c
|
|
764
|
+
JOIN meta.ECSchemaDef s ON c.Schema.Id = s.ECInstanceId
|
|
765
|
+
WHERE s.Name = 'BisCore' AND supports_instance_query(c.ECInstanceId) = 1
|
|
766
|
+
LIMIT 5`, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
767
|
+
rows.push(row.toRow());
|
|
768
|
+
}
|
|
769
|
+
assert.isAbove(rows.length, 0, "Should find at least one BisCore class that supports instance queries");
|
|
770
|
+
for (const row of rows) {
|
|
771
|
+
assert.equal(row.supported, 1);
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
describe("instance query on link table relationships", () => {
|
|
776
|
+
it("SELECT $ works for link table relationship with external class ids", async () => {
|
|
777
|
+
// ModelSelectorRefersToModels is a link table relationship where SourceECClassId
|
|
778
|
+
// and TargetECClassId may be stored in external tables. This was previously failing
|
|
779
|
+
// with a SQLite syntax error due to bugs in CreateLinkTableView.
|
|
780
|
+
let rowCount = 0;
|
|
781
|
+
for await (const row of imodel1.createQueryReader("SELECT $ FROM BisCore.ModelSelectorRefersToModels", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
782
|
+
const instance = row.toRow();
|
|
783
|
+
const json = instance.$;
|
|
784
|
+
assert.isDefined(json, "$ column should be defined");
|
|
785
|
+
const parsed = typeof json === "string" ? JSON.parse(json) : json;
|
|
786
|
+
assert.isDefined(parsed.ECInstanceId, "Instance must have ECInstanceId");
|
|
787
|
+
assert.isDefined(parsed.ECClassId, "Instance must have ECClassId");
|
|
788
|
+
assert.isDefined(parsed.SourceECInstanceId, "Instance must have SourceECInstanceId");
|
|
789
|
+
assert.isDefined(parsed.TargetECInstanceId, "Instance must have TargetECInstanceId");
|
|
790
|
+
rowCount++;
|
|
791
|
+
}
|
|
792
|
+
// The query should at least not crash — whether there are rows depends on the test file
|
|
793
|
+
assert.isAtLeast(rowCount, 0, "Query should execute without error");
|
|
794
|
+
});
|
|
795
|
+
});
|
|
697
796
|
});
|
|
698
797
|
//# sourceMappingURL=ECSqlQuery.test.js.map
|