@itwin/core-backend 5.0.0-dev.98 → 5.0.0-dev.99
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/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +12 -5
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +1 -0
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +37 -1
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +81 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +181 -2
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +224 -5
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +1 -0
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +4 -0
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +4 -0
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +29 -1
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +2 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js +2 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +2 -0
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +1 -0
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.d.ts.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +12 -5
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +1 -0
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ECDb.d.ts +37 -1
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +82 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts +181 -2
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +222 -4
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts.map +1 -1
- package/lib/esm/ElementAspect.js +1 -0
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
- package/lib/esm/ElementTreeWalker.js +4 -0
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +4 -0
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +29 -1
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +2 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/ViewStore.d.ts.map +1 -1
- package/lib/esm/ViewStore.js +2 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +2 -0
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js +1 -0
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +10 -0
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js +1 -0
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +2 -0
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +12 -1
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +1 -0
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +6 -0
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +1 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +253 -163
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -0
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +1 -0
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +5 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +10 -0
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js +1 -0
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +14 -0
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js +1 -0
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +1 -0
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +7 -0
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +1 -0
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetECAdaptor.js","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { DbResult, GuidString, Id64String } from \"@itwin/core-bentley\";\nimport { AnyDb, SqliteChange, SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"./SqliteChangesetReader\";\n\ninterface IClassRef {\n classId: Id64String;\n classFullName: string;\n}\n\ninterface IClassMap {\n readonly id: Id64String;\n readonly name: string;\n readonly mapStrategy: \"NotMapped\" | \"OwnTable\" | \"TablePerHierarchy\" | \"ExistingTable\" | \"ForeignKeyInTargetTable\" | \"ForeignKeyInSourceTable\";\n readonly type: \"Entity\" | \"Relationship\" | \"Struct\" | \"CustomAttribute\";\n readonly modifier: \"None\" | \"Abstract\" | \"Sealed\";\n readonly properties: IProperty[];\n}\n\ninterface IDateTimeInfo {\n readonly dateTimeKind?: \"Utc\" | \"Local\" | \"Unspecified\";\n readonly dateTimeComponent?: \"DateTime\" | \"Date\" | \"TimeOfDay\";\n}\n\ninterface IProperty {\n readonly id: Id64String;\n readonly name: string;\n readonly kind: \"Primitive\" | \"Struct\" | \"PrimitiveArray\" | \"StructArray\" | \"Navigation\";\n readonly primitiveType?: \"Binary\" | \"Boolean\" | \"DateTime\" | \"Double\" | \"Integer\" | \"Long\" | \"Point2d\" | \"Point3d\" | \"String\" | \"IGeometry\";\n readonly extendedTypeName?: string;\n readonly navigationRelationship?: IClassRef;\n readonly structClass?: IClassRef;\n readonly dateTimeInfo?: IDateTimeInfo;\n readonly columns: IColumn[];\n\n}\n\ninterface IColumn {\n readonly table: string;\n readonly column: string;\n readonly type: \"Any\" | \"Boolean\" | \"Blob\" | \"Timestamp\" | \"Real\" | \"Integer\" | \"Text\";\n readonly columnKind: \"Default\" | \"Id\" | \"ClassId\" | \"Shared\";\n readonly accessString: string;\n readonly isVirtual: boolean;\n}\n\ninterface ITable {\n readonly id: Id64String;\n readonly name: string;\n readonly type: \"Primary\" | \"Joined\" | \"Existing\" | \"Overflow\" | \"Virtual\";\n readonly exclusiveRootClassId: Id64String;\n readonly isClassIdVirtual: boolean;\n}\n\nclass ECDbMap {\n private _cachedClassMaps = new Map<Id64String, IClassMap>();\n private _cacheTables = new Map<string, ITable>();\n public constructor(public readonly db: AnyDb) { }\n public getAllDerivedClasses(classFullName: string) {\n const sql = `\n SELECT format('0x%x', ch.ClassId)\n FROM [ec_cache_ClassHierarchy] [ch]\n JOIN [ec_Class] [cs] ON [cs].[Id] = [ch].[BaseClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cs].[SchemaId]\n WHERE (([sc].[Alias] = :schemaNameOrAlias\n OR [sc].[Name] = :schemaNameOrAlias)\n AND ([cs].[Name] = :className))\n `;\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n const parts = classFullName.indexOf(\".\") !== -1 ? classFullName.split(\".\") : classFullName.split(\":\");\n stmt.bindString(\":schemaNameOrAlias\", parts[0]);\n stmt.bindString(\":className\", parts[1]);\n const classIds = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\n classIds.push(stmt.getValueString(0));\n return classIds;\n });\n }\n public getTable(tableName: string): ITable | undefined {\n if (this._cacheTables.has(tableName))\n return this._cacheTables.get(tableName);\n\n const sql = `\n SELECT\n JSON_OBJECT (\n 'id', FORMAT ('0x%x', [t].[id]),\n 'name', [t].[Name],\n 'type', (\n CASE\n [t].[type]\n WHEN 0 THEN 'Primary'\n WHEN 1 THEN 'Joined'\n WHEN 2 THEN 'Existing'\n WHEN 3 THEN 'Overflow'\n WHEN 4 THEN 'Virtual'\n END\n ),\n 'exclusiveRootClassId', FORMAT ('0x%x',\n COALESCE (\n [t].[ExclusiveRootClassId], (\n SELECT [parent].[ExclusiveRootClassId]\n FROM [ec_Table] [parent]\n WHERE [parent].[Id] = [t].[ParentTableId] AND [parent].[Type] = 1))),\n 'isClassIdVirtual', (\n SELECT\n [c].[IsVirtual]\n FROM\n [ec_Column] [c]\n WHERE\n [c].[Name] = 'ECClassId' AND [c].[TableId] = [t].[Id]\n )\n )\n FROM [ec_Table] [t]\n WHERE\n [t].[Name] = ?;\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, tableName);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const table = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null)\n return undefined;\n\n if (key === \"isClassIdVirtual\")\n return value === 0 ? false : true;\n\n return value;\n }) as ITable;\n\n this._cacheTables.set(tableName, table);\n return table;\n }\n return undefined;\n });\n }\n public getClassMap(classId: Id64String): IClassMap | undefined {\n if (this._cachedClassMaps.has(classId))\n return this._cachedClassMaps.get(classId);\n\n const sql = `\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', cs.id),\n 'name', format('%s:%s', ss.Name, cs.Name),\n 'mapStrategy',\n (\n CASE cm.MapStrategy\n WHEN 0 THEN 'NotMapped'\n WHEN 1 THEN 'OwnTable'\n WHEN 2 THEN 'TablePerHierarchy'\n WHEN 3 THEN 'ExistingTable'\n WHEN 10 THEN 'ForeignKeyInTargetTable'\n WHEN 11 THEN 'ForeignKeyInSourceTable'\n END\n ),\n 'type',\n (\n CASE cs.Type\n WHEN 0 THEN 'Entity'\n WHEN 1 THEN 'Relationship'\n WHEN 2 THEN 'Struct'\n WHEN 3 THEN 'CustomAttribute'\n END\n ),\n 'modifier',\n (\n CASE cs.Modifier\n WHEN 0 THEN 'None'\n WHEN 1 THEN 'Abstract'\n WHEN 2 THEN 'Sealed'\n END\n ),\n 'properties',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(propJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', pt.id),\n 'name', pt.Name,\n 'kind',\n (\n CASE pt.Kind\n WHEN 0 THEN 'Primitive'\n WHEN 1 THEN 'Struct'\n WHEN 2 THEN 'PrimitiveArray'\n WHEN 3 THEN 'StructArray'\n WHEN 4 THEN 'Navigation'\n END\n ),\n 'primitiveType',\n (\n CASE pt.PrimitiveType\n WHEN 0x101 THEN 'Binary'\n WHEN 0x201 THEN 'Boolean'\n WHEN 0x301 THEN 'DateTime'\n WHEN 0x401 THEN 'Double'\n WHEN 0x501 THEN 'Integer'\n WHEN 0x601 THEN 'Long'\n WHEN 0x701 THEN 'Point2d'\n WHEN 0x801 THEN 'Point3d'\n WHEN 0x901 THEN 'String'\n WHEN 0xa01 THEN 'IGeometry'\n END\n ),\n 'extendedTypeName', ExtendedTypeName,\n 'navigationRelationship',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.NavigationRelationshipClassId\n ),\n 'structClass',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.StructClassId\n ),\n 'dateTimeInfo', (\n SELECT\n JSON_OBJECT (\n 'dateTimeKind', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Utc</DateTimeKind>%' COLLATE [NoCase] THEN 'Utc'\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Local</DateTimeKind>%' COLLATE [NoCase] THEN 'Local'\n ELSE 'Unspecified'\n END\n ),\n 'dateTimeComponent', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>DateTime</DateTimeComponent>%' COLLATE [NoCase] THEN 'DateTime'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>Date</DateTimeComponent>%' COLLATE [NoCase] THEN 'Date'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>TimeOfDay</DateTimeComponent>%' COLLATE [NoCase] THEN 'TimeOfDay'\n ELSE 'DateTime'\n END\n )\n )\n FROM\n [ec_CustomAttribute] [ca]\n JOIN [ec_Class] [cl] ON [cl].[Id] = [ca].[ClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cl].[SchemaId]\n WHERE\n [ca].[ContainerType] = 992\n AND [cl].[Name] = 'DateTimeInfo'\n AND [sc].[Name] = 'CoreCustomAttributes'\n AND [ca].[ContainerId] = [pt].[Id]\n ),\n 'columns',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(columnJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'table', tb.Name,\n 'column', cc.Name,\n 'type',\n (\n CASE cc.Type\n WHEN 0 THEN 'Any'\n WHEN 1 THEN 'Boolean'\n WHEN 2 THEN 'Blob'\n WHEN 3 THEN 'Timestamp'\n WHEN 4 THEN 'Real'\n WHEN 5 THEN 'Integer'\n WHEN 6 THEN 'Text'\n END\n ),\n 'columnKind',\n (\n CASE cc.ColumnKind\n WHEN 0 THEN 'Default'\n WHEN 1 THEN 'Id'\n WHEN 2 THEN 'ClassId'\n WHEN 4 THEN 'SharedData'\n END\n ),\n 'accessString', pp0.AccessString,\n 'isVirtual', cc.IsVirtual OR tb.Type = 4\n ) columnJson\n FROM [ec_PropertyMap] [pm0]\n JOIN [ec_Column] [cc] ON [cc].[Id] = [pm0].[ColumnId]\n JOIN [ec_Table] [tb] ON [tb].[Id] = [cc].[TableId]\n JOIN [ec_PropertyPath] [pp0] ON [pp0].[Id] = [pm0].[PropertyPathId]\n WHERE\n [pp0].[RootPropertyId] = pt.Id AND pm0.ClassId = cs.Id\n )\n )\n ) propJson\n FROM [ec_PropertyMap] [pm]\n JOIN [ec_PropertyPath] [pp] ON [pp].[Id] = [pm].[PropertyPathId]\n JOIN [ec_Property] [pt] ON [pt].[Id] = [pp].[RootPropertyId]\n WHERE\n pm.ClassId = cs.Id\n GROUP BY\n pt.Id\n )\n )\n ) classDef\n FROM [ec_Class] [cs]\n JOIN [ec_ClassMap] [cm] ON [cm].[ClassId] = [cs].[Id]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cs].[SchemaId]\n WHERE\n [cs].[Id] = ?\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const classMap = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null) {\n return undefined;\n }\n if (key === \"isVirtual\") {\n return value === 0 ? false : true;\n }\n return value;\n }) as IClassMap;\n\n this._cachedClassMaps.set(classId, classMap);\n return classMap;\n }\n return undefined;\n });\n }\n}\n\n/**\n * Record meta data for the change.\n * @beta\n * */\nexport interface ChangeMetaData {\n /** list of tables making up this EC change */\n tables: string[];\n /** full name of the class of this EC change */\n classFullName?: string;\n /** sqlite operation that caused the change */\n op: SqliteChangeOp;\n /** version of the value read from sqlite change */\n stage: SqliteValueStage;\n /** if classId for the change was not found in db then fallback class for the table */\n fallbackClassId?: Id64String;\n /** list of change index making up this change (one per table) */\n changeIndexes: number[];\n}\n\n/**\n * Represent EC change derived from low level sqlite change\n * @beta\n */\nexport interface ChangedECInstance {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: Id64String;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId?: Id64String;\n $meta?: ChangeMetaData;\n [key: string]: any;\n}\n\n/**\n * Helper function to convert between JS DateTime & SQLite JulianDay values.\n * @beta\n * */\nnamespace DateTime {\n /**\n * Convert JS date to JulianDay value.\n * @param dt JS Date object.\n * @param convertToUtc convert the input value to UTC.\n * @returns julian day value\n */\n export function toJulianDay(dt: Date, convertToUtc = true): number {\n const utcOffset = convertToUtc ? dt.getTimezoneOffset() / 1440 : 0;\n return (dt.valueOf() / 86400000) - utcOffset + 2440587.5;\n }\n /**\n * Convert Julian day to JS Date object\n * @param jd JulianDay value for date/time\n * @param isLocalTime if julian day is local time or UTC\n * @returns JS Date object.\n */\n export function fromJulianDay(jd: number, isLocalTime: boolean): Date {\n const utcOffset = isLocalTime ? 0 : new Date().getTimezoneOffset() / 1440;\n return new Date((jd - 2440587.5 + utcOffset) * 86400000);\n }\n}\n/**\n * Combine partial changed instance into single instance.\n * Partial changes is per table and a single instance can\n * span multiple tables.\n * @beta\n */\nexport class PartialECChangeUnifier {\n private _cache = new Map<string, ChangedECInstance>();\n private _readonly = false;\n /**\n * Get root class id for a given class\n * @param classId given class id\n * @param db use to find root class\n * @returns return root class id\n */\n private static getRootClassId(classId: Id64String, db: AnyDb): Id64String | undefined {\n const sql = `\n WITH\n [base_class]([classId], [baseClassId], [Level]) AS(\n SELECT [ch].[ClassId], [ch].[BaseClassId], 0\n FROM [ec_ClassHasBaseClasses] [ch] WHERE [ch].[ClassId] = ?\n UNION ALL\n SELECT [ch].[ClassId], [ch].[BaseClassId], [Level] + 1\n FROM [ec_ClassHasBaseClasses] [ch], [base_class] [bc] WHERE [bc].[BaseClassId] = [ch].[ClassId]\n\n )\n SELECT FORMAT('0x%x', [bc].[BaseClassId]) rootClass\n FROM [base_class] [bc]\n WHERE [bc].[ClassId] <> [bc].[BaseClassId]\n AND [bc].[BaseClassId] NOT IN (SELECT [ca].[ContainerId]\n FROM [ec_CustomAttribute] [ca]\n WHERE [ca].[ContainerType] = 30\n AND [ca].[ClassId] IN (SELECT [cc].[Id]\n FROM [ec_Class] [cc]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cc].[SchemaId]\n WHERE [cc].[Name] = 'IsMixIn'\n AND [ss].[Name] = 'CoreCustomAttributes'))\n ORDER BY [Level] DESC`;\n\n return db.withSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW && !stmt.isValueNull(0)) {\n return stmt.getValueString(0);\n }\n return classId;\n });\n }\n /**\n * Combine partial instance with instance with same key if already exists.\n * @param rhs partial instance\n */\n private combine(rhs: ChangedECInstance, db?: AnyDb): void {\n if (!rhs.$meta) {\n throw new Error(\"PartialECChange being combine must have '$meta' property\");\n }\n const key = PartialECChangeUnifier.buildKey(rhs, db);\n const lhs = this._cache.get(key);\n if (lhs) {\n const { $meta: _, ...restOfRhs } = rhs;\n Object.assign(lhs, restOfRhs);\n if (lhs.$meta && rhs.$meta) {\n lhs.$meta.tables = [...rhs.$meta?.tables, ...lhs.$meta?.tables];\n lhs.$meta.changeIndexes = [...rhs.$meta?.changeIndexes, ...lhs.$meta?.changeIndexes];\n\n // we preserve child class name & id when merging instance.\n if (rhs.$meta.fallbackClassId && lhs.$meta.fallbackClassId && db && rhs.$meta.fallbackClassId !== lhs.$meta.fallbackClassId) {\n const lhsClassId = lhs.$meta.fallbackClassId;\n const rhsClassId = rhs.$meta.fallbackClassId;\n const isRhsIsSubClassOfLhs = db.withPreparedStatement(\"SELECT ec_instanceof(?,?)\", (stmt) => {\n stmt.bindId(1, rhsClassId);\n stmt.bindId(2, lhsClassId);\n stmt.step();\n return stmt.getValue(0).getInteger() === 1;\n });\n if (isRhsIsSubClassOfLhs) {\n lhs.$meta.fallbackClassId = rhs.$meta.fallbackClassId;\n lhs.$meta.classFullName = rhs.$meta.classFullName;\n }\n }\n }\n } else {\n this._cache.set(key, rhs);\n }\n }\n /**\n * Build key from EC change.\n * @param change EC change\n * @returns key created from EC change.\n */\n private static buildKey(change: ChangedECInstance, db?: AnyDb): string {\n let classId = change.ECClassId;\n if (typeof classId === \"undefined\") {\n if (db && change.$meta?.fallbackClassId) {\n classId = this.getRootClassId(change.$meta.fallbackClassId, db);\n }\n if (typeof classId === \"undefined\") {\n throw new Error(`unable to resolve ECClassId to root class id.`);\n }\n }\n return `${change.ECInstanceId}-${classId}-${change.$meta?.stage}`.toLowerCase();\n }\n /**\n * Append partial changes which will be combine using there instance key.\n * @note $meta property must be present on partial change as information\n * in it is used to combine partial instances.\n * @param adaptor changeset adaptor is use to read the partial EC change.\n * @beta\n */\n public appendFrom(adaptor: ChangesetECAdaptor): void {\n if (adaptor.disableMetaData) {\n throw new Error(\"change adaptor property 'disableMetaData' must be set to 'false'\");\n }\n if (this._readonly) {\n throw new Error(\"this instance is marked as readonly.\");\n }\n\n if (adaptor.op === \"Updated\" && adaptor.inserted && adaptor.deleted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n this.combine(adaptor.deleted, adaptor.reader.db);\n } else if (adaptor.op === \"Inserted\" && adaptor.inserted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n } else if (adaptor.op === \"Deleted\" && adaptor.deleted) {\n this.combine(adaptor.deleted, adaptor.reader.db);\n }\n }\n /**\n * Delete $meta from all the instances.\n */\n public stripMetaData(): void {\n for (const inst of this._cache.values()) {\n if (\"$meta\" in inst) {\n delete inst.$meta;\n }\n }\n this._readonly = true;\n }\n /**\n * Returns complete EC change instances.\n * @beta\n */\n public get instances(): IterableIterator<ChangedECInstance> { return this._cache.values(); }\n}\n\n/**\n * Transform sqlite change to ec change. EC change is partial change as\n * it is per table while a single instance can span multiple table.\n * @note PrimitiveArray and StructArray are not supported types.\n * @beta\n *\n*/\nexport class ChangesetECAdaptor implements Disposable {\n private readonly _mapCache: ECDbMap;\n private readonly _tableFilter = new Set<string>();\n private readonly _opFilter = new Set<SqliteChangeOp>();\n private readonly _classFilter = new Set<string>();\n private _allowedClasses = new Set<string>();\n /**\n * set debug flags\n */\n public readonly debugFlags = {\n replaceBlobWithEllipsis: false, // replace bolb with ... for debugging\n replaceGeomWithEllipsis: false, // replace geom with ... for debugging\n replaceGuidWithEllipsis: false, // replace geom with ... for debugging\n };\n /**\n * Return partial inserted instance\n * For updates inserted represent new version of instance after update.\n */\n public inserted?: ChangedECInstance;\n /**\n * Return partial deleted instance.\n * For updates deleted represent old version of instance before update.\n */\n public deleted?: ChangedECInstance;\n\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of tables added by acceptTable().\n * @param table Name of the table\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptTable(table: string): ChangesetECAdaptor {\n if (!this._tableFilter.has(table))\n this._tableFilter.add(table);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of op added by acceptOp().\n * @param op\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptOp(op: SqliteChangeOp): ChangesetECAdaptor {\n if (!this._opFilter.has(op))\n this._opFilter.add(op);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of class and its derived classes added by acceptClass().\n * @param classFullName\n * @returns\n */\n public acceptClass(classFullName: string): ChangesetECAdaptor {\n if (!this._classFilter.has(classFullName))\n this._classFilter.add(classFullName);\n\n this._allowedClasses.clear();\n return this;\n }\n private buildClassFilter() {\n if (this._allowedClasses.size !== 0 || this._classFilter.size === 0)\n return;\n\n this._classFilter.forEach((className) => {\n this._mapCache.getAllDerivedClasses(className).forEach((classId) => {\n this._allowedClasses.add(classId);\n });\n });\n }\n /**\n * Construct adaptor with a initialized reader.\n * @note the changeset reader must have disableSchemaCheck\n * set to false and db must also be set.\n * @param reader wrap changeset reader.\n */\n public constructor(public readonly reader: SqliteChangesetReader, public readonly disableMetaData = false) {\n if (!reader.disableSchemaCheck)\n throw new Error(\"SqliteChangesetReader, 'disableSchemaCheck' param must be set to false.\");\n\n this._mapCache = new ECDbMap(reader.db);\n }\n /**\n * dispose current instance and it will also dispose the changeset reader.\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n /**\n * close current instance and it will also close the changeset reader.\n */\n public close(): void {\n this.reader.close();\n }\n /**\n * Convert binary GUID into string GUID.\n * @param binaryGUID binary version of guid.\n * @returns GUID string.\n */\n private static convertBinaryToGuid(binaryGUID: Uint8Array): GuidString {\n // Check if the array has 16 elements\n if (binaryGUID.length !== 16) {\n throw new Error(\"Invalid array length for Guid\");\n }\n // Convert each element to a two-digit hexadecimal string\n const hex = Array.from(binaryGUID, (byte) => byte.toString(16).padStart(2, \"0\"));\n // Join the hexadecimal strings and insert hyphens\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n\n }\n /**\n * Set value use access string in a JS object.\n * @param targetObj object that will be updated.\n * @param accessString access string token separated by '.'.\n */\n private static setValue(targetObj: any, accessString: string, value: any): void {\n let cursor = targetObj;\n const propPath = accessString.split(\".\");\n propPath.forEach((propertyName) => {\n if (propertyName === \"__proto__\")\n throw new Error(\"access string cannot container __proto__\");\n });\n\n const leafProp = propPath.splice(-1).shift();\n if (!leafProp)\n throw new Error(\"not access string was specified.\");\n\n for (const elem of propPath) {\n if (typeof cursor[elem] === \"undefined\")\n cursor[elem] = {};\n cursor = cursor[elem];\n }\n cursor[leafProp] = value;\n }\n\n /**\n * Check if sqlite change table is a EC data table\n * @param tableName name of the table.\n * @returns true if table has EC data.\n */\n public isECTable(tableName: string) {\n return typeof this._mapCache.getTable(tableName) !== \"undefined\";\n }\n /**\n * Attempt find ECClassId from ECInstanceId for a change of type 'updated'.\n * @param tableName name of the table to find ECClassId from given ECInstanceId\n * @param instanceId instance id for which we need ECClassId for.\n * @returns if successful returns ECClassId else return undefined.\n */\n private getClassIdFromDb(tableName: string, instanceId: Id64String): Id64String | undefined {\n try {\n return this.reader.db?.withPreparedSqliteStatement(`SELECT [ECClassId] FROM [${tableName}] WHERE [rowId]=?`, (stmt) => {\n stmt.bindId(1, instanceId);\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueId(0) : undefined;\n });\n } catch {\n return undefined;\n }\n }\n /** helper method around reader.op */\n public get op() { return this.reader.op; }\n /** Return true if current change is of type \"Inserted\" */\n public get isInserted() { return this.op === \"Inserted\"; }\n /** Return true if current change is of type \"Deleted\" */\n public get isDeleted() { return this.op === \"Deleted\"; }\n /** Return true if current change is of type \"Updated\" */\n public get isUpdated() { return this.op === \"Updated\"; }\n\n /**\n * Advance reader to next change or a change that meets the filter set in the current adaptor\n * @returns return false if no more changes to read.\n */\n public step(): boolean {\n this.inserted = undefined;\n this.deleted = undefined;\n this.buildClassFilter();\n while (this.reader.step()) {\n if (!this.isECTable(this.reader.tableName))\n continue;\n\n if (this._tableFilter.size > 0) {\n if (!this._tableFilter.has(this.reader.tableName))\n continue;\n }\n\n if (this._opFilter.size > 0) {\n if (!this._opFilter.has(this.reader.op))\n continue;\n }\n\n if (this.reader.hasRow) {\n const table = this._mapCache.getTable(this.reader.tableName);\n if (!table || table.type === \"Virtual\") {\n throw new Error(`table in changeset not found or is virtual ${this.reader.tableName}`);\n }\n\n const change = {\n inserted: this.reader.getChangeValuesObject(\"New\", { includePrimaryKeyInUpdateNew: true }),\n deleted: this.reader.getChangeValuesObject(\"Old\", { includePrimaryKeyInUpdateNew: true }),\n };\n\n if (!change.inserted && !change.deleted) {\n throw new Error(`unable to get change from changeset reader`);\n }\n\n let ecClassId: Id64String | undefined = this.reader.op === \"Inserted\" ? change.inserted?.ECClassId : change.deleted?.ECClassId;\n const classIdPresentInChange = typeof ecClassId !== \"undefined\";\n let classMap: IClassMap | undefined;\n let fallbackClassId: Id64String | undefined;\n if (table.isClassIdVirtual) {\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n } else {\n if (!ecClassId) {\n // attempt to find ECClassId against row from the db.\n const primaryKeys = this.reader.primaryKeyValues;\n if (primaryKeys.length === 1) {\n ecClassId = this.getClassIdFromDb(this.reader.tableName, this.reader.primaryKeyValues[0] as Id64String);\n }\n }\n if (ecClassId)\n classMap = this._mapCache.getClassMap(ecClassId);\n if (!classMap) {\n // fallback to root map for table.\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n if (classMap)\n fallbackClassId = table.exclusiveRootClassId;\n }\n }\n\n if (!classMap)\n throw new Error(`unable to load class map`);\n\n if (!classIdPresentInChange && !ecClassId && !fallbackClassId)\n ecClassId = classMap.id;\n\n if (this._allowedClasses.size !== 0) {\n if (!this._allowedClasses.has(classMap.id))\n continue;\n }\n\n const $meta = {\n tables: [this.reader.tableName],\n op: this.reader.op,\n classFullName: classMap.name,\n fallbackClassId,\n changeIndexes: [this.reader.changeIndex],\n };\n\n if (this.reader.op === \"Inserted\" && change.inserted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n } else if (this.reader.op === \"Deleted\" && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else if (change.inserted && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else {\n throw new Error(\"unable to read EC changes\");\n }\n break;\n }\n }\n return this.reader.hasRow;\n }\n /**\n * Transform nav change column into navigation EC property\n * @param prop navigation property definition.\n * @param change sqlite change.\n * @param out ec instance that will be updated with navigation property.\n */\n private transformNavigationProperty(prop: IProperty, change: SqliteChange, out: ChangedECInstance): void {\n const idCol = prop.columns.filter(($) => $.accessString.endsWith(\".Id\")).at(0);\n if (!idCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const idValue = change[idCol.column];\n if (typeof idValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, idCol.accessString, idValue);\n\n const relClassIdCol = prop.columns.filter(($) => $.accessString.endsWith(\".RelECClassId\")).at(0);\n if (!relClassIdCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const relClassIdValue = relClassIdCol.isVirtual ? prop.navigationRelationship?.classId : change[relClassIdCol.column];\n if (typeof relClassIdValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, relClassIdCol.accessString, relClassIdValue);\n }\n /**\n * Transform sqlite change into EC change.\n * @param classMap classMap use to deserialize sqlite change into EC change.\n * @param change sqlite change from changeset.\n * @param table table definition of sqlite change provided.\n * @param out EC changeset that will be updated with properties.\n */\n private transform(classMap: IClassMap, change: SqliteChange, table: ITable, out: ChangedECInstance): void {\n // transform change row to instance\n for (const prop of classMap.properties) {\n if (prop.kind === \"PrimitiveArray\" || prop.kind === \"StructArray\") {\n // Arrays not supported\n continue;\n }\n if (prop.columns.filter((_) => _.isVirtual).length === prop.columns.length) {\n continue;\n }\n if (prop.kind === \"Navigation\") {\n this.transformNavigationProperty(prop, change, out);\n } else {\n for (const col of prop.columns) {\n if (col.table !== table.name)\n continue;\n\n const columnValue = change[col.column];\n if (typeof columnValue === \"undefined\")\n continue;\n\n if (columnValue !== null) {\n if (prop.primitiveType === \"DateTime\") {\n const dt = DateTime.fromJulianDay(columnValue, prop.dateTimeInfo?.dateTimeKind === \"Local\");\n ChangesetECAdaptor.setValue(out, col.accessString, dt.toISOString());\n continue;\n }\n if (prop.extendedTypeName === \"BeGuid\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGuidWithEllipsis ? \"...\" : ChangesetECAdaptor.convertBinaryToGuid(columnValue));\n continue;\n }\n if (prop.extendedTypeName === \"GeometryStream\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGeomWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n if (prop.primitiveType === \"Binary\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceBlobWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n }\n ChangesetECAdaptor.setValue(out, col.accessString, columnValue);\n }\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ChangesetECAdaptor.js","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { DbResult, GuidString, Id64String } from \"@itwin/core-bentley\";\nimport { AnyDb, SqliteChange, SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"./SqliteChangesetReader\";\n\ninterface IClassRef {\n classId: Id64String;\n classFullName: string;\n}\n\ninterface IClassMap {\n readonly id: Id64String;\n readonly name: string;\n readonly mapStrategy: \"NotMapped\" | \"OwnTable\" | \"TablePerHierarchy\" | \"ExistingTable\" | \"ForeignKeyInTargetTable\" | \"ForeignKeyInSourceTable\";\n readonly type: \"Entity\" | \"Relationship\" | \"Struct\" | \"CustomAttribute\";\n readonly modifier: \"None\" | \"Abstract\" | \"Sealed\";\n readonly properties: IProperty[];\n}\n\ninterface IDateTimeInfo {\n readonly dateTimeKind?: \"Utc\" | \"Local\" | \"Unspecified\";\n readonly dateTimeComponent?: \"DateTime\" | \"Date\" | \"TimeOfDay\";\n}\n\ninterface IProperty {\n readonly id: Id64String;\n readonly name: string;\n readonly kind: \"Primitive\" | \"Struct\" | \"PrimitiveArray\" | \"StructArray\" | \"Navigation\";\n readonly primitiveType?: \"Binary\" | \"Boolean\" | \"DateTime\" | \"Double\" | \"Integer\" | \"Long\" | \"Point2d\" | \"Point3d\" | \"String\" | \"IGeometry\";\n readonly extendedTypeName?: string;\n readonly navigationRelationship?: IClassRef;\n readonly structClass?: IClassRef;\n readonly dateTimeInfo?: IDateTimeInfo;\n readonly columns: IColumn[];\n\n}\n\ninterface IColumn {\n readonly table: string;\n readonly column: string;\n readonly type: \"Any\" | \"Boolean\" | \"Blob\" | \"Timestamp\" | \"Real\" | \"Integer\" | \"Text\";\n readonly columnKind: \"Default\" | \"Id\" | \"ClassId\" | \"Shared\";\n readonly accessString: string;\n readonly isVirtual: boolean;\n}\n\ninterface ITable {\n readonly id: Id64String;\n readonly name: string;\n readonly type: \"Primary\" | \"Joined\" | \"Existing\" | \"Overflow\" | \"Virtual\";\n readonly exclusiveRootClassId: Id64String;\n readonly isClassIdVirtual: boolean;\n}\n\nclass ECDbMap {\n private _cachedClassMaps = new Map<Id64String, IClassMap>();\n private _cacheTables = new Map<string, ITable>();\n public constructor(public readonly db: AnyDb) { }\n public getAllDerivedClasses(classFullName: string) {\n const sql = `\n SELECT format('0x%x', ch.ClassId)\n FROM [ec_cache_ClassHierarchy] [ch]\n JOIN [ec_Class] [cs] ON [cs].[Id] = [ch].[BaseClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cs].[SchemaId]\n WHERE (([sc].[Alias] = :schemaNameOrAlias\n OR [sc].[Name] = :schemaNameOrAlias)\n AND ([cs].[Name] = :className))\n `;\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n const parts = classFullName.indexOf(\".\") !== -1 ? classFullName.split(\".\") : classFullName.split(\":\");\n stmt.bindString(\":schemaNameOrAlias\", parts[0]);\n stmt.bindString(\":className\", parts[1]);\n const classIds = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\n classIds.push(stmt.getValueString(0));\n return classIds;\n });\n }\n public getTable(tableName: string): ITable | undefined {\n if (this._cacheTables.has(tableName))\n return this._cacheTables.get(tableName);\n\n const sql = `\n SELECT\n JSON_OBJECT (\n 'id', FORMAT ('0x%x', [t].[id]),\n 'name', [t].[Name],\n 'type', (\n CASE\n [t].[type]\n WHEN 0 THEN 'Primary'\n WHEN 1 THEN 'Joined'\n WHEN 2 THEN 'Existing'\n WHEN 3 THEN 'Overflow'\n WHEN 4 THEN 'Virtual'\n END\n ),\n 'exclusiveRootClassId', FORMAT ('0x%x',\n COALESCE (\n [t].[ExclusiveRootClassId], (\n SELECT [parent].[ExclusiveRootClassId]\n FROM [ec_Table] [parent]\n WHERE [parent].[Id] = [t].[ParentTableId] AND [parent].[Type] = 1))),\n 'isClassIdVirtual', (\n SELECT\n [c].[IsVirtual]\n FROM\n [ec_Column] [c]\n WHERE\n [c].[Name] = 'ECClassId' AND [c].[TableId] = [t].[Id]\n )\n )\n FROM [ec_Table] [t]\n WHERE\n [t].[Name] = ?;\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, tableName);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const table = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null)\n return undefined;\n\n if (key === \"isClassIdVirtual\")\n return value === 0 ? false : true;\n\n return value;\n }) as ITable;\n\n this._cacheTables.set(tableName, table);\n return table;\n }\n return undefined;\n });\n }\n public getClassMap(classId: Id64String): IClassMap | undefined {\n if (this._cachedClassMaps.has(classId))\n return this._cachedClassMaps.get(classId);\n\n const sql = `\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', cs.id),\n 'name', format('%s:%s', ss.Name, cs.Name),\n 'mapStrategy',\n (\n CASE cm.MapStrategy\n WHEN 0 THEN 'NotMapped'\n WHEN 1 THEN 'OwnTable'\n WHEN 2 THEN 'TablePerHierarchy'\n WHEN 3 THEN 'ExistingTable'\n WHEN 10 THEN 'ForeignKeyInTargetTable'\n WHEN 11 THEN 'ForeignKeyInSourceTable'\n END\n ),\n 'type',\n (\n CASE cs.Type\n WHEN 0 THEN 'Entity'\n WHEN 1 THEN 'Relationship'\n WHEN 2 THEN 'Struct'\n WHEN 3 THEN 'CustomAttribute'\n END\n ),\n 'modifier',\n (\n CASE cs.Modifier\n WHEN 0 THEN 'None'\n WHEN 1 THEN 'Abstract'\n WHEN 2 THEN 'Sealed'\n END\n ),\n 'properties',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(propJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', pt.id),\n 'name', pt.Name,\n 'kind',\n (\n CASE pt.Kind\n WHEN 0 THEN 'Primitive'\n WHEN 1 THEN 'Struct'\n WHEN 2 THEN 'PrimitiveArray'\n WHEN 3 THEN 'StructArray'\n WHEN 4 THEN 'Navigation'\n END\n ),\n 'primitiveType',\n (\n CASE pt.PrimitiveType\n WHEN 0x101 THEN 'Binary'\n WHEN 0x201 THEN 'Boolean'\n WHEN 0x301 THEN 'DateTime'\n WHEN 0x401 THEN 'Double'\n WHEN 0x501 THEN 'Integer'\n WHEN 0x601 THEN 'Long'\n WHEN 0x701 THEN 'Point2d'\n WHEN 0x801 THEN 'Point3d'\n WHEN 0x901 THEN 'String'\n WHEN 0xa01 THEN 'IGeometry'\n END\n ),\n 'extendedTypeName', ExtendedTypeName,\n 'navigationRelationship',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.NavigationRelationshipClassId\n ),\n 'structClass',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.StructClassId\n ),\n 'dateTimeInfo', (\n SELECT\n JSON_OBJECT (\n 'dateTimeKind', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Utc</DateTimeKind>%' COLLATE [NoCase] THEN 'Utc'\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Local</DateTimeKind>%' COLLATE [NoCase] THEN 'Local'\n ELSE 'Unspecified'\n END\n ),\n 'dateTimeComponent', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>DateTime</DateTimeComponent>%' COLLATE [NoCase] THEN 'DateTime'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>Date</DateTimeComponent>%' COLLATE [NoCase] THEN 'Date'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>TimeOfDay</DateTimeComponent>%' COLLATE [NoCase] THEN 'TimeOfDay'\n ELSE 'DateTime'\n END\n )\n )\n FROM\n [ec_CustomAttribute] [ca]\n JOIN [ec_Class] [cl] ON [cl].[Id] = [ca].[ClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cl].[SchemaId]\n WHERE\n [ca].[ContainerType] = 992\n AND [cl].[Name] = 'DateTimeInfo'\n AND [sc].[Name] = 'CoreCustomAttributes'\n AND [ca].[ContainerId] = [pt].[Id]\n ),\n 'columns',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(columnJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'table', tb.Name,\n 'column', cc.Name,\n 'type',\n (\n CASE cc.Type\n WHEN 0 THEN 'Any'\n WHEN 1 THEN 'Boolean'\n WHEN 2 THEN 'Blob'\n WHEN 3 THEN 'Timestamp'\n WHEN 4 THEN 'Real'\n WHEN 5 THEN 'Integer'\n WHEN 6 THEN 'Text'\n END\n ),\n 'columnKind',\n (\n CASE cc.ColumnKind\n WHEN 0 THEN 'Default'\n WHEN 1 THEN 'Id'\n WHEN 2 THEN 'ClassId'\n WHEN 4 THEN 'SharedData'\n END\n ),\n 'accessString', pp0.AccessString,\n 'isVirtual', cc.IsVirtual OR tb.Type = 4\n ) columnJson\n FROM [ec_PropertyMap] [pm0]\n JOIN [ec_Column] [cc] ON [cc].[Id] = [pm0].[ColumnId]\n JOIN [ec_Table] [tb] ON [tb].[Id] = [cc].[TableId]\n JOIN [ec_PropertyPath] [pp0] ON [pp0].[Id] = [pm0].[PropertyPathId]\n WHERE\n [pp0].[RootPropertyId] = pt.Id AND pm0.ClassId = cs.Id\n )\n )\n ) propJson\n FROM [ec_PropertyMap] [pm]\n JOIN [ec_PropertyPath] [pp] ON [pp].[Id] = [pm].[PropertyPathId]\n JOIN [ec_Property] [pt] ON [pt].[Id] = [pp].[RootPropertyId]\n WHERE\n pm.ClassId = cs.Id\n GROUP BY\n pt.Id\n )\n )\n ) classDef\n FROM [ec_Class] [cs]\n JOIN [ec_ClassMap] [cm] ON [cm].[ClassId] = [cs].[Id]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cs].[SchemaId]\n WHERE\n [cs].[Id] = ?\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const classMap = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null) {\n return undefined;\n }\n if (key === \"isVirtual\") {\n return value === 0 ? false : true;\n }\n return value;\n }) as IClassMap;\n\n this._cachedClassMaps.set(classId, classMap);\n return classMap;\n }\n return undefined;\n });\n }\n}\n\n/**\n * Record meta data for the change.\n * @beta\n * */\nexport interface ChangeMetaData {\n /** list of tables making up this EC change */\n tables: string[];\n /** full name of the class of this EC change */\n classFullName?: string;\n /** sqlite operation that caused the change */\n op: SqliteChangeOp;\n /** version of the value read from sqlite change */\n stage: SqliteValueStage;\n /** if classId for the change was not found in db then fallback class for the table */\n fallbackClassId?: Id64String;\n /** list of change index making up this change (one per table) */\n changeIndexes: number[];\n}\n\n/**\n * Represent EC change derived from low level sqlite change\n * @beta\n */\nexport interface ChangedECInstance {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: Id64String;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId?: Id64String;\n $meta?: ChangeMetaData;\n [key: string]: any;\n}\n\n/**\n * Helper function to convert between JS DateTime & SQLite JulianDay values.\n * @beta\n * */\nnamespace DateTime {\n /**\n * Convert JS date to JulianDay value.\n * @param dt JS Date object.\n * @param convertToUtc convert the input value to UTC.\n * @returns julian day value\n */\n export function toJulianDay(dt: Date, convertToUtc = true): number {\n const utcOffset = convertToUtc ? dt.getTimezoneOffset() / 1440 : 0;\n return (dt.valueOf() / 86400000) - utcOffset + 2440587.5;\n }\n /**\n * Convert Julian day to JS Date object\n * @param jd JulianDay value for date/time\n * @param isLocalTime if julian day is local time or UTC\n * @returns JS Date object.\n */\n export function fromJulianDay(jd: number, isLocalTime: boolean): Date {\n const utcOffset = isLocalTime ? 0 : new Date().getTimezoneOffset() / 1440;\n return new Date((jd - 2440587.5 + utcOffset) * 86400000);\n }\n}\n/**\n * Combine partial changed instance into single instance.\n * Partial changes is per table and a single instance can\n * span multiple tables.\n * @beta\n */\nexport class PartialECChangeUnifier {\n private _cache = new Map<string, ChangedECInstance>();\n private _readonly = false;\n /**\n * Get root class id for a given class\n * @param classId given class id\n * @param db use to find root class\n * @returns return root class id\n */\n private static getRootClassId(classId: Id64String, db: AnyDb): Id64String | undefined {\n const sql = `\n WITH\n [base_class]([classId], [baseClassId], [Level]) AS(\n SELECT [ch].[ClassId], [ch].[BaseClassId], 0\n FROM [ec_ClassHasBaseClasses] [ch] WHERE [ch].[ClassId] = ?\n UNION ALL\n SELECT [ch].[ClassId], [ch].[BaseClassId], [Level] + 1\n FROM [ec_ClassHasBaseClasses] [ch], [base_class] [bc] WHERE [bc].[BaseClassId] = [ch].[ClassId]\n\n )\n SELECT FORMAT('0x%x', [bc].[BaseClassId]) rootClass\n FROM [base_class] [bc]\n WHERE [bc].[ClassId] <> [bc].[BaseClassId]\n AND [bc].[BaseClassId] NOT IN (SELECT [ca].[ContainerId]\n FROM [ec_CustomAttribute] [ca]\n WHERE [ca].[ContainerType] = 30\n AND [ca].[ClassId] IN (SELECT [cc].[Id]\n FROM [ec_Class] [cc]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cc].[SchemaId]\n WHERE [cc].[Name] = 'IsMixIn'\n AND [ss].[Name] = 'CoreCustomAttributes'))\n ORDER BY [Level] DESC`;\n\n return db.withSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW && !stmt.isValueNull(0)) {\n return stmt.getValueString(0);\n }\n return classId;\n });\n }\n /**\n * Combine partial instance with instance with same key if already exists.\n * @param rhs partial instance\n */\n private combine(rhs: ChangedECInstance, db?: AnyDb): void {\n if (!rhs.$meta) {\n throw new Error(\"PartialECChange being combine must have '$meta' property\");\n }\n const key = PartialECChangeUnifier.buildKey(rhs, db);\n const lhs = this._cache.get(key);\n if (lhs) {\n const { $meta: _, ...restOfRhs } = rhs;\n Object.assign(lhs, restOfRhs);\n if (lhs.$meta && rhs.$meta) {\n lhs.$meta.tables = [...rhs.$meta?.tables, ...lhs.$meta?.tables];\n lhs.$meta.changeIndexes = [...rhs.$meta?.changeIndexes, ...lhs.$meta?.changeIndexes];\n\n // we preserve child class name & id when merging instance.\n if (rhs.$meta.fallbackClassId && lhs.$meta.fallbackClassId && db && rhs.$meta.fallbackClassId !== lhs.$meta.fallbackClassId) {\n const lhsClassId = lhs.$meta.fallbackClassId;\n const rhsClassId = rhs.$meta.fallbackClassId;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const isRhsIsSubClassOfLhs = db.withPreparedStatement(\"SELECT ec_instanceof(?,?)\", (stmt) => {\n stmt.bindId(1, rhsClassId);\n stmt.bindId(2, lhsClassId);\n stmt.step();\n return stmt.getValue(0).getInteger() === 1;\n });\n if (isRhsIsSubClassOfLhs) {\n lhs.$meta.fallbackClassId = rhs.$meta.fallbackClassId;\n lhs.$meta.classFullName = rhs.$meta.classFullName;\n }\n }\n }\n } else {\n this._cache.set(key, rhs);\n }\n }\n /**\n * Build key from EC change.\n * @param change EC change\n * @returns key created from EC change.\n */\n private static buildKey(change: ChangedECInstance, db?: AnyDb): string {\n let classId = change.ECClassId;\n if (typeof classId === \"undefined\") {\n if (db && change.$meta?.fallbackClassId) {\n classId = this.getRootClassId(change.$meta.fallbackClassId, db);\n }\n if (typeof classId === \"undefined\") {\n throw new Error(`unable to resolve ECClassId to root class id.`);\n }\n }\n return `${change.ECInstanceId}-${classId}-${change.$meta?.stage}`.toLowerCase();\n }\n /**\n * Append partial changes which will be combine using there instance key.\n * @note $meta property must be present on partial change as information\n * in it is used to combine partial instances.\n * @param adaptor changeset adaptor is use to read the partial EC change.\n * @beta\n */\n public appendFrom(adaptor: ChangesetECAdaptor): void {\n if (adaptor.disableMetaData) {\n throw new Error(\"change adaptor property 'disableMetaData' must be set to 'false'\");\n }\n if (this._readonly) {\n throw new Error(\"this instance is marked as readonly.\");\n }\n\n if (adaptor.op === \"Updated\" && adaptor.inserted && adaptor.deleted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n this.combine(adaptor.deleted, adaptor.reader.db);\n } else if (adaptor.op === \"Inserted\" && adaptor.inserted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n } else if (adaptor.op === \"Deleted\" && adaptor.deleted) {\n this.combine(adaptor.deleted, adaptor.reader.db);\n }\n }\n /**\n * Delete $meta from all the instances.\n */\n public stripMetaData(): void {\n for (const inst of this._cache.values()) {\n if (\"$meta\" in inst) {\n delete inst.$meta;\n }\n }\n this._readonly = true;\n }\n /**\n * Returns complete EC change instances.\n * @beta\n */\n public get instances(): IterableIterator<ChangedECInstance> { return this._cache.values(); }\n}\n\n/**\n * Transform sqlite change to ec change. EC change is partial change as\n * it is per table while a single instance can span multiple table.\n * @note PrimitiveArray and StructArray are not supported types.\n * @beta\n *\n*/\nexport class ChangesetECAdaptor implements Disposable {\n private readonly _mapCache: ECDbMap;\n private readonly _tableFilter = new Set<string>();\n private readonly _opFilter = new Set<SqliteChangeOp>();\n private readonly _classFilter = new Set<string>();\n private _allowedClasses = new Set<string>();\n /**\n * set debug flags\n */\n public readonly debugFlags = {\n replaceBlobWithEllipsis: false, // replace bolb with ... for debugging\n replaceGeomWithEllipsis: false, // replace geom with ... for debugging\n replaceGuidWithEllipsis: false, // replace geom with ... for debugging\n };\n /**\n * Return partial inserted instance\n * For updates inserted represent new version of instance after update.\n */\n public inserted?: ChangedECInstance;\n /**\n * Return partial deleted instance.\n * For updates deleted represent old version of instance before update.\n */\n public deleted?: ChangedECInstance;\n\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of tables added by acceptTable().\n * @param table Name of the table\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptTable(table: string): ChangesetECAdaptor {\n if (!this._tableFilter.has(table))\n this._tableFilter.add(table);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of op added by acceptOp().\n * @param op\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptOp(op: SqliteChangeOp): ChangesetECAdaptor {\n if (!this._opFilter.has(op))\n this._opFilter.add(op);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of class and its derived classes added by acceptClass().\n * @param classFullName\n * @returns\n */\n public acceptClass(classFullName: string): ChangesetECAdaptor {\n if (!this._classFilter.has(classFullName))\n this._classFilter.add(classFullName);\n\n this._allowedClasses.clear();\n return this;\n }\n private buildClassFilter() {\n if (this._allowedClasses.size !== 0 || this._classFilter.size === 0)\n return;\n\n this._classFilter.forEach((className) => {\n this._mapCache.getAllDerivedClasses(className).forEach((classId) => {\n this._allowedClasses.add(classId);\n });\n });\n }\n /**\n * Construct adaptor with a initialized reader.\n * @note the changeset reader must have disableSchemaCheck\n * set to false and db must also be set.\n * @param reader wrap changeset reader.\n */\n public constructor(public readonly reader: SqliteChangesetReader, public readonly disableMetaData = false) {\n if (!reader.disableSchemaCheck)\n throw new Error(\"SqliteChangesetReader, 'disableSchemaCheck' param must be set to false.\");\n\n this._mapCache = new ECDbMap(reader.db);\n }\n /**\n * dispose current instance and it will also dispose the changeset reader.\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n /**\n * close current instance and it will also close the changeset reader.\n */\n public close(): void {\n this.reader.close();\n }\n /**\n * Convert binary GUID into string GUID.\n * @param binaryGUID binary version of guid.\n * @returns GUID string.\n */\n private static convertBinaryToGuid(binaryGUID: Uint8Array): GuidString {\n // Check if the array has 16 elements\n if (binaryGUID.length !== 16) {\n throw new Error(\"Invalid array length for Guid\");\n }\n // Convert each element to a two-digit hexadecimal string\n const hex = Array.from(binaryGUID, (byte) => byte.toString(16).padStart(2, \"0\"));\n // Join the hexadecimal strings and insert hyphens\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n\n }\n /**\n * Set value use access string in a JS object.\n * @param targetObj object that will be updated.\n * @param accessString access string token separated by '.'.\n */\n private static setValue(targetObj: any, accessString: string, value: any): void {\n let cursor = targetObj;\n const propPath = accessString.split(\".\");\n propPath.forEach((propertyName) => {\n if (propertyName === \"__proto__\")\n throw new Error(\"access string cannot container __proto__\");\n });\n\n const leafProp = propPath.splice(-1).shift();\n if (!leafProp)\n throw new Error(\"not access string was specified.\");\n\n for (const elem of propPath) {\n if (typeof cursor[elem] === \"undefined\")\n cursor[elem] = {};\n cursor = cursor[elem];\n }\n cursor[leafProp] = value;\n }\n\n /**\n * Check if sqlite change table is a EC data table\n * @param tableName name of the table.\n * @returns true if table has EC data.\n */\n public isECTable(tableName: string) {\n return typeof this._mapCache.getTable(tableName) !== \"undefined\";\n }\n /**\n * Attempt find ECClassId from ECInstanceId for a change of type 'updated'.\n * @param tableName name of the table to find ECClassId from given ECInstanceId\n * @param instanceId instance id for which we need ECClassId for.\n * @returns if successful returns ECClassId else return undefined.\n */\n private getClassIdFromDb(tableName: string, instanceId: Id64String): Id64String | undefined {\n try {\n return this.reader.db?.withPreparedSqliteStatement(`SELECT [ECClassId] FROM [${tableName}] WHERE [rowId]=?`, (stmt) => {\n stmt.bindId(1, instanceId);\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueId(0) : undefined;\n });\n } catch {\n return undefined;\n }\n }\n /** helper method around reader.op */\n public get op() { return this.reader.op; }\n /** Return true if current change is of type \"Inserted\" */\n public get isInserted() { return this.op === \"Inserted\"; }\n /** Return true if current change is of type \"Deleted\" */\n public get isDeleted() { return this.op === \"Deleted\"; }\n /** Return true if current change is of type \"Updated\" */\n public get isUpdated() { return this.op === \"Updated\"; }\n\n /**\n * Advance reader to next change or a change that meets the filter set in the current adaptor\n * @returns return false if no more changes to read.\n */\n public step(): boolean {\n this.inserted = undefined;\n this.deleted = undefined;\n this.buildClassFilter();\n while (this.reader.step()) {\n if (!this.isECTable(this.reader.tableName))\n continue;\n\n if (this._tableFilter.size > 0) {\n if (!this._tableFilter.has(this.reader.tableName))\n continue;\n }\n\n if (this._opFilter.size > 0) {\n if (!this._opFilter.has(this.reader.op))\n continue;\n }\n\n if (this.reader.hasRow) {\n const table = this._mapCache.getTable(this.reader.tableName);\n if (!table || table.type === \"Virtual\") {\n throw new Error(`table in changeset not found or is virtual ${this.reader.tableName}`);\n }\n\n const change = {\n inserted: this.reader.getChangeValuesObject(\"New\", { includePrimaryKeyInUpdateNew: true }),\n deleted: this.reader.getChangeValuesObject(\"Old\", { includePrimaryKeyInUpdateNew: true }),\n };\n\n if (!change.inserted && !change.deleted) {\n throw new Error(`unable to get change from changeset reader`);\n }\n\n let ecClassId: Id64String | undefined = this.reader.op === \"Inserted\" ? change.inserted?.ECClassId : change.deleted?.ECClassId;\n const classIdPresentInChange = typeof ecClassId !== \"undefined\";\n let classMap: IClassMap | undefined;\n let fallbackClassId: Id64String | undefined;\n if (table.isClassIdVirtual) {\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n } else {\n if (!ecClassId) {\n // attempt to find ECClassId against row from the db.\n const primaryKeys = this.reader.primaryKeyValues;\n if (primaryKeys.length === 1) {\n ecClassId = this.getClassIdFromDb(this.reader.tableName, this.reader.primaryKeyValues[0] as Id64String);\n }\n }\n if (ecClassId)\n classMap = this._mapCache.getClassMap(ecClassId);\n if (!classMap) {\n // fallback to root map for table.\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n if (classMap)\n fallbackClassId = table.exclusiveRootClassId;\n }\n }\n\n if (!classMap)\n throw new Error(`unable to load class map`);\n\n if (!classIdPresentInChange && !ecClassId && !fallbackClassId)\n ecClassId = classMap.id;\n\n if (this._allowedClasses.size !== 0) {\n if (!this._allowedClasses.has(classMap.id))\n continue;\n }\n\n const $meta = {\n tables: [this.reader.tableName],\n op: this.reader.op,\n classFullName: classMap.name,\n fallbackClassId,\n changeIndexes: [this.reader.changeIndex],\n };\n\n if (this.reader.op === \"Inserted\" && change.inserted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n } else if (this.reader.op === \"Deleted\" && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else if (change.inserted && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else {\n throw new Error(\"unable to read EC changes\");\n }\n break;\n }\n }\n return this.reader.hasRow;\n }\n /**\n * Transform nav change column into navigation EC property\n * @param prop navigation property definition.\n * @param change sqlite change.\n * @param out ec instance that will be updated with navigation property.\n */\n private transformNavigationProperty(prop: IProperty, change: SqliteChange, out: ChangedECInstance): void {\n const idCol = prop.columns.filter(($) => $.accessString.endsWith(\".Id\")).at(0);\n if (!idCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const idValue = change[idCol.column];\n if (typeof idValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, idCol.accessString, idValue);\n\n const relClassIdCol = prop.columns.filter(($) => $.accessString.endsWith(\".RelECClassId\")).at(0);\n if (!relClassIdCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const relClassIdValue = relClassIdCol.isVirtual ? prop.navigationRelationship?.classId : change[relClassIdCol.column];\n if (typeof relClassIdValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, relClassIdCol.accessString, relClassIdValue);\n }\n /**\n * Transform sqlite change into EC change.\n * @param classMap classMap use to deserialize sqlite change into EC change.\n * @param change sqlite change from changeset.\n * @param table table definition of sqlite change provided.\n * @param out EC changeset that will be updated with properties.\n */\n private transform(classMap: IClassMap, change: SqliteChange, table: ITable, out: ChangedECInstance): void {\n // transform change row to instance\n for (const prop of classMap.properties) {\n if (prop.kind === \"PrimitiveArray\" || prop.kind === \"StructArray\") {\n // Arrays not supported\n continue;\n }\n if (prop.columns.filter((_) => _.isVirtual).length === prop.columns.length) {\n continue;\n }\n if (prop.kind === \"Navigation\") {\n this.transformNavigationProperty(prop, change, out);\n } else {\n for (const col of prop.columns) {\n if (col.table !== table.name)\n continue;\n\n const columnValue = change[col.column];\n if (typeof columnValue === \"undefined\")\n continue;\n\n if (columnValue !== null) {\n if (prop.primitiveType === \"DateTime\") {\n const dt = DateTime.fromJulianDay(columnValue, prop.dateTimeInfo?.dateTimeKind === \"Local\");\n ChangesetECAdaptor.setValue(out, col.accessString, dt.toISOString());\n continue;\n }\n if (prop.extendedTypeName === \"BeGuid\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGuidWithEllipsis ? \"...\" : ChangesetECAdaptor.convertBinaryToGuid(columnValue));\n continue;\n }\n if (prop.extendedTypeName === \"GeometryStream\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGeomWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n if (prop.primitiveType === \"Binary\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceBlobWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n }\n ChangesetECAdaptor.setValue(out, col.accessString, columnValue);\n }\n }\n }\n }\n}\n"]}
|
package/lib/esm/ECDb.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IModelJsNative } from "@bentley/imodeljs-native";
|
|
2
2
|
import { ECSchemaProps, ECSqlReader, QueryBinder, QueryOptions } from "@itwin/core-common";
|
|
3
|
-
import { ECSqlStatement } from "./ECSqlStatement";
|
|
3
|
+
import { ECSqlStatement, ECSqlWriteStatement } from "./ECSqlStatement";
|
|
4
4
|
import { SqliteStatement } from "./SqliteStatement";
|
|
5
5
|
import { _nativeDb } from "./internal/Symbols";
|
|
6
6
|
/** Modes for how to open [ECDb]($backend) files.
|
|
@@ -87,6 +87,39 @@ export declare class ECDb implements Disposable {
|
|
|
87
87
|
* @throws if the schema can not be found or loaded.
|
|
88
88
|
*/
|
|
89
89
|
getSchemaProps(name: string): ECSchemaProps;
|
|
90
|
+
/**
|
|
91
|
+
* Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist
|
|
92
|
+
* in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved
|
|
93
|
+
* in the statement cache so it can be reused in the future. Use this method for ECSQL statements that will be
|
|
94
|
+
* reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding
|
|
95
|
+
* the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withStatement]].
|
|
96
|
+
* @param sql The SQLite SQL statement to execute
|
|
97
|
+
* @param callback the callback to invoke on the prepared statement
|
|
98
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
99
|
+
* @returns the value returned by `callback`.
|
|
100
|
+
* @see [[withWriteStatement]]
|
|
101
|
+
* @beta
|
|
102
|
+
*/
|
|
103
|
+
withCachedWriteStatement<T>(ecsql: string, callback: (stmt: ECSqlWriteStatement) => T, logErrors?: boolean): T;
|
|
104
|
+
/**
|
|
105
|
+
* Prepared and execute a callback on an ECSQL statement. After the callback completes the statement is disposed.
|
|
106
|
+
* Use this method for ECSQL statements are either not expected to be reused, or are not expensive to prepare.
|
|
107
|
+
* For statements that will be reused often, instead use [[withPreparedStatement]].
|
|
108
|
+
* @param sql The SQLite SQL statement to execute
|
|
109
|
+
* @param callback the callback to invoke on the prepared statement
|
|
110
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
111
|
+
* @returns the value returned by `callback`.
|
|
112
|
+
* @see [[withCachedWriteStatement]]
|
|
113
|
+
* @beta
|
|
114
|
+
*/
|
|
115
|
+
withWriteStatement<T>(ecsql: string, callback: (stmt: ECSqlWriteStatement) => T, logErrors?: boolean): T;
|
|
116
|
+
/** Prepare an ECSQL statement.
|
|
117
|
+
* @param ecsql The ECSQL statement to prepare
|
|
118
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
119
|
+
* @throws [IModelError]($common) if there is a problem preparing the statement.
|
|
120
|
+
* @beta
|
|
121
|
+
*/
|
|
122
|
+
prepareWriteStatement(ecsql: string, logErrors?: boolean): ECSqlWriteStatement;
|
|
90
123
|
/**
|
|
91
124
|
* Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist
|
|
92
125
|
* in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved
|
|
@@ -99,6 +132,7 @@ export declare class ECDb implements Disposable {
|
|
|
99
132
|
* @returns the value returned by `callback`.
|
|
100
133
|
* @see [[withStatement]]
|
|
101
134
|
* @public
|
|
135
|
+
* @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withCachedWriteStatement]] for INSERT/UPDATE/DELETE instead.
|
|
102
136
|
*/
|
|
103
137
|
withPreparedStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors?: boolean): T;
|
|
104
138
|
/**
|
|
@@ -111,12 +145,14 @@ export declare class ECDb implements Disposable {
|
|
|
111
145
|
* @returns the value returned by `callback`.
|
|
112
146
|
* @see [[withPreparedStatement]]
|
|
113
147
|
* @public
|
|
148
|
+
* @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withWriteStatement]] for INSERT/UPDATE/DELETE instead.
|
|
114
149
|
*/
|
|
115
150
|
withStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors?: boolean): T;
|
|
116
151
|
/** Prepare an ECSQL statement.
|
|
117
152
|
* @param ecsql The ECSQL statement to prepare
|
|
118
153
|
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
119
154
|
* @throws [IModelError]($common) if there is a problem preparing the statement.
|
|
155
|
+
* @deprecated in 4.11. Use [[prepareWriteStatement]] when preparing an INSERT/UPDATE/DELETE statement or [[createQueryReader]] to execute a SELECT statement.
|
|
120
156
|
*/
|
|
121
157
|
prepareStatement(ecsql: string, logErrors?: boolean): ECSqlStatement;
|
|
122
158
|
/**
|
package/lib/esm/ECDb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECDb.d.ts","sourceRoot":"","sources":["../../src/ECDb.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAkB,aAAa,EAAE,WAAW,EAAe,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGxH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ECDb.d.ts","sourceRoot":"","sources":["../../src/ECDb.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/ECDb.js
CHANGED
|
@@ -9,7 +9,7 @@ import { assert, DbResult, Logger, OpenMode } from "@itwin/core-bentley";
|
|
|
9
9
|
import { ECSqlReader, IModelError } from "@itwin/core-common";
|
|
10
10
|
import { BackendLoggerCategory } from "./BackendLoggerCategory";
|
|
11
11
|
import { ConcurrentQuery } from "./ConcurrentQuery";
|
|
12
|
-
import { ECSqlStatement } from "./ECSqlStatement";
|
|
12
|
+
import { ECSqlStatement, ECSqlWriteStatement } from "./ECSqlStatement";
|
|
13
13
|
import { IModelNative } from "./internal/NativePlatform";
|
|
14
14
|
import { SqliteStatement, StatementCache } from "./SqliteStatement";
|
|
15
15
|
import { _nativeDb } from "./internal/Symbols";
|
|
@@ -29,6 +29,7 @@ export var ECDbOpenMode;
|
|
|
29
29
|
*/
|
|
30
30
|
export class ECDb {
|
|
31
31
|
_nativeDb;
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
32
33
|
_statementCache = new StatementCache();
|
|
33
34
|
_sqliteStatementCache = new StatementCache();
|
|
34
35
|
/** only for tests
|
|
@@ -157,6 +158,77 @@ export class ECDb {
|
|
|
157
158
|
getSchemaProps(name) {
|
|
158
159
|
return this[_nativeDb].getSchemaProps(name);
|
|
159
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist
|
|
163
|
+
* in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved
|
|
164
|
+
* in the statement cache so it can be reused in the future. Use this method for ECSQL statements that will be
|
|
165
|
+
* reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding
|
|
166
|
+
* the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withStatement]].
|
|
167
|
+
* @param sql The SQLite SQL statement to execute
|
|
168
|
+
* @param callback the callback to invoke on the prepared statement
|
|
169
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
170
|
+
* @returns the value returned by `callback`.
|
|
171
|
+
* @see [[withWriteStatement]]
|
|
172
|
+
* @beta
|
|
173
|
+
*/
|
|
174
|
+
withCachedWriteStatement(ecsql, callback, logErrors = true) {
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
176
|
+
const stmt = this._statementCache.findAndRemove(ecsql) ?? this.prepareStatement(ecsql, logErrors);
|
|
177
|
+
const release = () => this._statementCache.addOrDispose(stmt);
|
|
178
|
+
try {
|
|
179
|
+
const val = callback(new ECSqlWriteStatement(stmt));
|
|
180
|
+
if (val instanceof Promise) {
|
|
181
|
+
val.then(release, release);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
release();
|
|
185
|
+
}
|
|
186
|
+
return val;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
release();
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Prepared and execute a callback on an ECSQL statement. After the callback completes the statement is disposed.
|
|
195
|
+
* Use this method for ECSQL statements are either not expected to be reused, or are not expensive to prepare.
|
|
196
|
+
* For statements that will be reused often, instead use [[withPreparedStatement]].
|
|
197
|
+
* @param sql The SQLite SQL statement to execute
|
|
198
|
+
* @param callback the callback to invoke on the prepared statement
|
|
199
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
200
|
+
* @returns the value returned by `callback`.
|
|
201
|
+
* @see [[withCachedWriteStatement]]
|
|
202
|
+
* @beta
|
|
203
|
+
*/
|
|
204
|
+
withWriteStatement(ecsql, callback, logErrors = true) {
|
|
205
|
+
const stmt = this.prepareWriteStatement(ecsql, logErrors);
|
|
206
|
+
const release = () => { };
|
|
207
|
+
try {
|
|
208
|
+
const val = callback(stmt);
|
|
209
|
+
if (val instanceof Promise) {
|
|
210
|
+
val.then(release, release);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
release();
|
|
214
|
+
}
|
|
215
|
+
return val;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
release();
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Prepare an ECSQL statement.
|
|
223
|
+
* @param ecsql The ECSQL statement to prepare
|
|
224
|
+
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
225
|
+
* @throws [IModelError]($common) if there is a problem preparing the statement.
|
|
226
|
+
* @beta
|
|
227
|
+
*/
|
|
228
|
+
prepareWriteStatement(ecsql, logErrors = true) {
|
|
229
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
230
|
+
return new ECSqlWriteStatement(this.prepareStatement(ecsql, logErrors));
|
|
231
|
+
}
|
|
160
232
|
/**
|
|
161
233
|
* Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist
|
|
162
234
|
* in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved
|
|
@@ -169,8 +241,11 @@ export class ECDb {
|
|
|
169
241
|
* @returns the value returned by `callback`.
|
|
170
242
|
* @see [[withStatement]]
|
|
171
243
|
* @public
|
|
244
|
+
* @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withCachedWriteStatement]] for INSERT/UPDATE/DELETE instead.
|
|
172
245
|
*/
|
|
246
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
173
247
|
withPreparedStatement(ecsql, callback, logErrors = true) {
|
|
248
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
174
249
|
const stmt = this._statementCache.findAndRemove(ecsql) ?? this.prepareStatement(ecsql, logErrors);
|
|
175
250
|
const release = () => this._statementCache.addOrDispose(stmt);
|
|
176
251
|
try {
|
|
@@ -198,8 +273,11 @@ export class ECDb {
|
|
|
198
273
|
* @returns the value returned by `callback`.
|
|
199
274
|
* @see [[withPreparedStatement]]
|
|
200
275
|
* @public
|
|
276
|
+
* @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withWriteStatement]] for INSERT/UPDATE/DELETE instead.
|
|
201
277
|
*/
|
|
278
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
202
279
|
withStatement(ecsql, callback, logErrors = true) {
|
|
280
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
203
281
|
const stmt = this.prepareStatement(ecsql, logErrors);
|
|
204
282
|
const release = () => stmt[Symbol.dispose]();
|
|
205
283
|
try {
|
|
@@ -221,8 +299,11 @@ export class ECDb {
|
|
|
221
299
|
* @param ecsql The ECSQL statement to prepare
|
|
222
300
|
* @param logErrors Determines if error will be logged if statement fail to prepare
|
|
223
301
|
* @throws [IModelError]($common) if there is a problem preparing the statement.
|
|
302
|
+
* @deprecated in 4.11. Use [[prepareWriteStatement]] when preparing an INSERT/UPDATE/DELETE statement or [[createQueryReader]] to execute a SELECT statement.
|
|
224
303
|
*/
|
|
304
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
225
305
|
prepareStatement(ecsql, logErrors = true) {
|
|
306
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
226
307
|
const stmt = new ECSqlStatement();
|
|
227
308
|
stmt.prepare(this[_nativeDb], ecsql, logErrors);
|
|
228
309
|
return stmt;
|
package/lib/esm/ECDb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECDb.js","sourceRoot":"","sources":["../../src/ECDb.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { assert, DbResult, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { DbQueryRequest, ECSchemaProps, ECSqlReader, IModelError, QueryBinder, QueryOptions } from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\nimport { ConcurrentQuery } from \"./ConcurrentQuery\";\nimport { ECSqlStatement } from \"./ECSqlStatement\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { SqliteStatement, StatementCache } from \"./SqliteStatement\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\nconst loggerCategory: string = BackendLoggerCategory.ECDb;\n\n/** Modes for how to open [ECDb]($backend) files.\n * @public\n */\nexport enum ECDbOpenMode {\n Readonly,\n ReadWrite,\n /** Opens the file read-write and upgrades the file if necessary to the latest file format version. */\n FileUpgrade,\n}\n\n/** An ECDb file\n * @public\n */\nexport class ECDb implements Disposable {\n private _nativeDb?: IModelJsNative.ECDb;\n private readonly _statementCache = new StatementCache<ECSqlStatement>();\n private _sqliteStatementCache = new StatementCache<SqliteStatement>();\n\n /** only for tests\n * @internal\n */\n public resetSqliteCache(size: number) {\n this._sqliteStatementCache.clear();\n this._sqliteStatementCache = new StatementCache<SqliteStatement>(size);\n }\n\n constructor() {\n this._nativeDb = new IModelNative.platform.ECDb();\n }\n /** Call this function when finished with this ECDb object. This releases the native resources held by the\n * ECDb object.\n */\n public [Symbol.dispose](): void {\n if (!this._nativeDb)\n return;\n\n this.closeDb();\n this._nativeDb.dispose();\n this._nativeDb = undefined;\n }\n /**\n * Attach an iModel file to this connection and load and register its schemas.\n * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'\n * @param fileName IModel file name\n * @param alias identifier for the attached file. This identifer is used to access schema from the attached file. e.g. if alias is 'abc' then schema can be accessed using 'abc.MySchema.MyClass'\n */\n public attachDb(fileName: string, alias: string): void {\n if (alias.toLowerCase() === \"main\" || alias.toLowerCase() === \"schema_sync_db\" || alias.toLowerCase() === \"ecchange\" || alias.toLowerCase() === \"temp\") {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Reserved tablespace name cannot be used\");\n }\n this[_nativeDb].attachDb(fileName, alias);\n }\n /**\n * Detach the attached file from this connection. The attached file is closed and its schemas are unregistered.\n * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'\n * @param alias identifer that was used in the call to [[attachDb]]\n */\n public detachDb(alias: string): void {\n if (alias.toLowerCase() === \"main\" || alias.toLowerCase() === \"schema_sync_db\" || alias.toLowerCase() === \"ecchange\" || alias.toLowerCase() === \"temp\") {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Reserved tablespace name cannot be used\");\n }\n this.clearStatementCache();\n this[_nativeDb].detachDb(alias);\n }\n\n /** @deprecated in 5.0 Use [Symbol.dispose] instead. */\n public dispose(): void {\n this[Symbol.dispose]();\n }\n\n /** Create an ECDb\n * @param pathName The path to the ECDb file to create.\n * @throws [IModelError]($common) if the operation failed.\n */\n public createDb(pathName: string): void {\n const status: DbResult = this[_nativeDb].createDb(pathName);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to created ECDb\");\n }\n\n /** Open the ECDb.\n * @param pathName The path to the ECDb file to open\n * @param openMode Open mode\n * @throws [IModelError]($common) if the operation failed.\n */\n public openDb(pathName: string, openMode: ECDbOpenMode = ECDbOpenMode.Readonly): void {\n const nativeOpenMode: OpenMode = openMode === ECDbOpenMode.Readonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const tryUpgrade: boolean = openMode === ECDbOpenMode.FileUpgrade;\n const status: DbResult = this[_nativeDb].openDb(pathName, nativeOpenMode, tryUpgrade);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to open ECDb\");\n }\n\n /** Returns true if the ECDb is open */\n public get isOpen(): boolean { return this[_nativeDb].isOpen(); }\n\n /** Close the Db after saving any uncommitted changes.\n * @throws [IModelError]($common) if the database is not open.\n */\n public closeDb(): void {\n this._statementCache.clear();\n this._sqliteStatementCache.clear();\n this[_nativeDb].closeDb();\n }\n\n /** @internal use to test statement caching */\n public clearStatementCache() {\n this._statementCache.clear();\n }\n\n /** @internal use to test statement caching */\n public getCachedStatementCount() {\n return this._statementCache.size;\n }\n\n /** Commit the outermost transaction, writing changes to the file. Then, restart the transaction.\n * @param changesetName The name of the operation that generated these changes.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public saveChanges(changesetName?: string): void {\n const status: DbResult = this[_nativeDb].saveChanges(changesetName);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to save changes\");\n }\n\n /** Abandon (cancel) the outermost transaction, discarding all changes since last save. Then, restart the transaction.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public abandonChanges(): void {\n const status: DbResult = this[_nativeDb].abandonChanges();\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to abandon changes\");\n }\n\n /** Import a schema.\n *\n * If the import was successful, the database is automatically saved to disk.\n * @param pathName Path to ECSchema XML file to import.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public importSchema(pathName: string): void {\n const status: DbResult = this[_nativeDb].importSchema(pathName);\n if (status !== DbResult.BE_SQLITE_OK) {\n Logger.logError(loggerCategory, `Failed to import schema from '${pathName}'.`);\n throw new IModelError(status, `Failed to import schema from '${pathName}'.`);\n }\n }\n\n /**\n * Returns the full schema for the input name.\n * @param name The name of the schema e.g. 'ECDbMeta'\n * @returns The SchemaProps for the requested schema\n * @throws if the schema can not be found or loaded.\n */\n public getSchemaProps(name: string): ECSchemaProps {\n return this[_nativeDb].getSchemaProps(name);\n }\n\n /**\n * Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist\n * in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved\n * in the statement cache so it can be reused in the future. Use this method for ECSQL statements that will be\n * reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding\n * the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withStatement]]\n * @public\n */\n public withPreparedStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors = true): T {\n const stmt = this._statementCache.findAndRemove(ecsql) ?? this.prepareStatement(ecsql, logErrors);\n const release = () => this._statementCache.addOrDispose(stmt);\n try {\n const val = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /**\n * Prepared and execute a callback on an ECSQL statement. After the callback completes the statement is disposed.\n * Use this method for ECSQL statements are either not expected to be reused, or are not expensive to prepare.\n * For statements that will be reused often, instead use [[withPreparedStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withPreparedStatement]]\n * @public\n */\n public withStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors = true): T {\n const stmt = this.prepareStatement(ecsql, logErrors);\n const release = () => stmt[Symbol.dispose]();\n try {\n const val = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /** Prepare an ECSQL statement.\n * @param ecsql The ECSQL statement to prepare\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @throws [IModelError]($common) if there is a problem preparing the statement.\n */\n public prepareStatement(ecsql: string, logErrors = true): ECSqlStatement {\n const stmt = new ECSqlStatement();\n stmt.prepare(this[_nativeDb], ecsql, logErrors);\n return stmt;\n }\n\n /**\n * Use a prepared SQL statement, potentially from the statement cache. If the requested statement doesn't exist\n * in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved\n * in the statement cache so it can be reused in the future. Use this method for SQL statements that will be\n * reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding\n * the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withSqliteStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withPreparedStatement]]\n * @public\n */\n public withPreparedSqliteStatement<T>(sql: string, callback: (stmt: SqliteStatement) => T, logErrors = true): T {\n const stmt = this._sqliteStatementCache.findAndRemove(sql) ?? this.prepareSqliteStatement(sql, logErrors);\n const release = () => this._sqliteStatementCache.addOrDispose(stmt);\n try {\n const val: T = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /**\n * Prepared and execute a callback on a SQL statement. After the callback completes the statement is disposed.\n * Use this method for SQL statements are either not expected to be reused, or are not expensive to prepare.\n * For statements that will be reused often, instead use [[withPreparedSqliteStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @public\n */\n public withSqliteStatement<T>(sql: string, callback: (stmt: SqliteStatement) => T, logErrors = true): T {\n const stmt = this.prepareSqliteStatement(sql, logErrors);\n const release = () => stmt[Symbol.dispose]();\n try {\n const val: T = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /** Prepare an SQL statement.\n * @param sql The SQLite SQL statement to prepare\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @throws [IModelError]($common) if there is a problem preparing the statement.\n * @internal\n */\n public prepareSqliteStatement(sql: string, logErrors = true): SqliteStatement {\n const stmt = new SqliteStatement(sql);\n stmt.prepare(this[_nativeDb], logErrors);\n return stmt;\n }\n\n /** @internal */\n public get [_nativeDb](): IModelJsNative.ECDb {\n assert(undefined !== this._nativeDb);\n return this._nativeDb;\n }\n\n /** Allow to execute query and read results along with meta data. The result are streamed.\n *\n * See also:\n * - [ECSQL Overview]($docs/learning/backend/ExecutingECSQL)\n * - [Code Examples]($docs/learning/backend/ECSQLCodeExamples)\n * - [ECSQL Row Format]($docs/learning/ECSQLRowFormat)\n *\n * @param params The values to bind to the parameters (if the ECSQL has any).\n * @param config Allow to specify certain flags which control how query is executed.\n * @returns Returns an [ECSqlReader]($common) which helps iterate over the result set and also give access to metadata.\n * @public\n * */\n public createQueryReader(ecsql: string, params?: QueryBinder, config?: QueryOptions): ECSqlReader {\n if (!this._nativeDb || !this._nativeDb.isOpen()) {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"db not open\");\n }\n const executor = {\n execute: async (request: DbQueryRequest) => {\n return ConcurrentQuery.executeQueryRequest(this[_nativeDb], request);\n },\n };\n return new ECSqlReader(executor, ecsql, params, config);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ECDb.js","sourceRoot":"","sources":["../../src/ECDb.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { assert, DbResult, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { DbQueryRequest, ECSchemaProps, ECSqlReader, IModelError, QueryBinder, QueryOptions } from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\nimport { ConcurrentQuery } from \"./ConcurrentQuery\";\nimport { ECSqlStatement, ECSqlWriteStatement } from \"./ECSqlStatement\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { SqliteStatement, StatementCache } from \"./SqliteStatement\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\nconst loggerCategory: string = BackendLoggerCategory.ECDb;\n\n/** Modes for how to open [ECDb]($backend) files.\n * @public\n */\nexport enum ECDbOpenMode {\n Readonly,\n ReadWrite,\n /** Opens the file read-write and upgrades the file if necessary to the latest file format version. */\n FileUpgrade,\n}\n\n/** An ECDb file\n * @public\n */\nexport class ECDb implements Disposable {\n private _nativeDb?: IModelJsNative.ECDb;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n private readonly _statementCache = new StatementCache<ECSqlStatement>();\n private _sqliteStatementCache = new StatementCache<SqliteStatement>();\n\n /** only for tests\n * @internal\n */\n public resetSqliteCache(size: number) {\n this._sqliteStatementCache.clear();\n this._sqliteStatementCache = new StatementCache<SqliteStatement>(size);\n }\n\n constructor() {\n this._nativeDb = new IModelNative.platform.ECDb();\n }\n /** Call this function when finished with this ECDb object. This releases the native resources held by the\n * ECDb object.\n */\n public [Symbol.dispose](): void {\n if (!this._nativeDb)\n return;\n\n this.closeDb();\n this._nativeDb.dispose();\n this._nativeDb = undefined;\n }\n /**\n * Attach an iModel file to this connection and load and register its schemas.\n * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'\n * @param fileName IModel file name\n * @param alias identifier for the attached file. This identifer is used to access schema from the attached file. e.g. if alias is 'abc' then schema can be accessed using 'abc.MySchema.MyClass'\n */\n public attachDb(fileName: string, alias: string): void {\n if (alias.toLowerCase() === \"main\" || alias.toLowerCase() === \"schema_sync_db\" || alias.toLowerCase() === \"ecchange\" || alias.toLowerCase() === \"temp\") {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Reserved tablespace name cannot be used\");\n }\n this[_nativeDb].attachDb(fileName, alias);\n }\n /**\n * Detach the attached file from this connection. The attached file is closed and its schemas are unregistered.\n * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'\n * @param alias identifer that was used in the call to [[attachDb]]\n */\n public detachDb(alias: string): void {\n if (alias.toLowerCase() === \"main\" || alias.toLowerCase() === \"schema_sync_db\" || alias.toLowerCase() === \"ecchange\" || alias.toLowerCase() === \"temp\") {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Reserved tablespace name cannot be used\");\n }\n this.clearStatementCache();\n this[_nativeDb].detachDb(alias);\n }\n\n /** @deprecated in 5.0 Use [Symbol.dispose] instead. */\n public dispose(): void {\n this[Symbol.dispose]();\n }\n\n /** Create an ECDb\n * @param pathName The path to the ECDb file to create.\n * @throws [IModelError]($common) if the operation failed.\n */\n public createDb(pathName: string): void {\n const status: DbResult = this[_nativeDb].createDb(pathName);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to created ECDb\");\n }\n\n /** Open the ECDb.\n * @param pathName The path to the ECDb file to open\n * @param openMode Open mode\n * @throws [IModelError]($common) if the operation failed.\n */\n public openDb(pathName: string, openMode: ECDbOpenMode = ECDbOpenMode.Readonly): void {\n const nativeOpenMode: OpenMode = openMode === ECDbOpenMode.Readonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const tryUpgrade: boolean = openMode === ECDbOpenMode.FileUpgrade;\n const status: DbResult = this[_nativeDb].openDb(pathName, nativeOpenMode, tryUpgrade);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to open ECDb\");\n }\n\n /** Returns true if the ECDb is open */\n public get isOpen(): boolean { return this[_nativeDb].isOpen(); }\n\n /** Close the Db after saving any uncommitted changes.\n * @throws [IModelError]($common) if the database is not open.\n */\n public closeDb(): void {\n this._statementCache.clear();\n this._sqliteStatementCache.clear();\n this[_nativeDb].closeDb();\n }\n\n /** @internal use to test statement caching */\n public clearStatementCache() {\n this._statementCache.clear();\n }\n\n /** @internal use to test statement caching */\n public getCachedStatementCount() {\n return this._statementCache.size;\n }\n\n /** Commit the outermost transaction, writing changes to the file. Then, restart the transaction.\n * @param changesetName The name of the operation that generated these changes.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public saveChanges(changesetName?: string): void {\n const status: DbResult = this[_nativeDb].saveChanges(changesetName);\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to save changes\");\n }\n\n /** Abandon (cancel) the outermost transaction, discarding all changes since last save. Then, restart the transaction.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public abandonChanges(): void {\n const status: DbResult = this[_nativeDb].abandonChanges();\n if (status !== DbResult.BE_SQLITE_OK)\n throw new IModelError(status, \"Failed to abandon changes\");\n }\n\n /** Import a schema.\n *\n * If the import was successful, the database is automatically saved to disk.\n * @param pathName Path to ECSchema XML file to import.\n * @throws [IModelError]($common) if the database is not open or if the operation failed.\n */\n public importSchema(pathName: string): void {\n const status: DbResult = this[_nativeDb].importSchema(pathName);\n if (status !== DbResult.BE_SQLITE_OK) {\n Logger.logError(loggerCategory, `Failed to import schema from '${pathName}'.`);\n throw new IModelError(status, `Failed to import schema from '${pathName}'.`);\n }\n }\n\n /**\n * Returns the full schema for the input name.\n * @param name The name of the schema e.g. 'ECDbMeta'\n * @returns The SchemaProps for the requested schema\n * @throws if the schema can not be found or loaded.\n */\n public getSchemaProps(name: string): ECSchemaProps {\n return this[_nativeDb].getSchemaProps(name);\n }\n\n /**\n * Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist\n * in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved\n * in the statement cache so it can be reused in the future. Use this method for ECSQL statements that will be\n * reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding\n * the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withWriteStatement]]\n * @beta\n */\n public withCachedWriteStatement<T>(ecsql: string, callback: (stmt: ECSqlWriteStatement) => T, logErrors = true): T {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const stmt = this._statementCache.findAndRemove(ecsql) ?? this.prepareStatement(ecsql, logErrors);\n const release = () => this._statementCache.addOrDispose(stmt);\n try {\n const val = callback(new ECSqlWriteStatement(stmt));\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /**\n * Prepared and execute a callback on an ECSQL statement. After the callback completes the statement is disposed.\n * Use this method for ECSQL statements are either not expected to be reused, or are not expensive to prepare.\n * For statements that will be reused often, instead use [[withPreparedStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withCachedWriteStatement]]\n * @beta\n */\n public withWriteStatement<T>(ecsql: string, callback: (stmt: ECSqlWriteStatement) => T, logErrors = true): T {\n const stmt = this.prepareWriteStatement(ecsql, logErrors);\n const release = () => { };\n try {\n const val = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /** Prepare an ECSQL statement.\n * @param ecsql The ECSQL statement to prepare\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @throws [IModelError]($common) if there is a problem preparing the statement.\n * @beta\n */\n public prepareWriteStatement(ecsql: string, logErrors = true): ECSqlWriteStatement {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return new ECSqlWriteStatement(this.prepareStatement(ecsql, logErrors));\n }\n\n /**\n * Use a prepared ECSQL statement, potentially from the statement cache. If the requested statement doesn't exist\n * in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved\n * in the statement cache so it can be reused in the future. Use this method for ECSQL statements that will be\n * reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding\n * the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withStatement]]\n * @public\n * @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withCachedWriteStatement]] for INSERT/UPDATE/DELETE instead.\n */\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n public withPreparedStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors = true): T {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const stmt = this._statementCache.findAndRemove(ecsql) ?? this.prepareStatement(ecsql, logErrors);\n const release = () => this._statementCache.addOrDispose(stmt);\n try {\n const val = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /**\n * Prepared and execute a callback on an ECSQL statement. After the callback completes the statement is disposed.\n * Use this method for ECSQL statements are either not expected to be reused, or are not expensive to prepare.\n * For statements that will be reused often, instead use [[withPreparedStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withPreparedStatement]]\n * @public\n * @deprecated in 4.11. Use [[createQueryReader]] for SELECT statements and [[withWriteStatement]] for INSERT/UPDATE/DELETE instead.\n */\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n public withStatement<T>(ecsql: string, callback: (stmt: ECSqlStatement) => T, logErrors = true): T {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const stmt = this.prepareStatement(ecsql, logErrors);\n const release = () => stmt[Symbol.dispose]();\n try {\n const val = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /** Prepare an ECSQL statement.\n * @param ecsql The ECSQL statement to prepare\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @throws [IModelError]($common) if there is a problem preparing the statement.\n * @deprecated in 4.11. Use [[prepareWriteStatement]] when preparing an INSERT/UPDATE/DELETE statement or [[createQueryReader]] to execute a SELECT statement.\n */\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n public prepareStatement(ecsql: string, logErrors = true): ECSqlStatement {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const stmt = new ECSqlStatement();\n stmt.prepare(this[_nativeDb], ecsql, logErrors);\n return stmt;\n }\n\n /**\n * Use a prepared SQL statement, potentially from the statement cache. If the requested statement doesn't exist\n * in the statement cache, a new statement is prepared. After the callback completes, the statement is reset and saved\n * in the statement cache so it can be reused in the future. Use this method for SQL statements that will be\n * reused often and are expensive to prepare. The statement cache holds the most recently used statements, discarding\n * the oldest statements as it fills. For statements you don't intend to reuse, instead use [[withSqliteStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @see [[withPreparedStatement]]\n * @public\n */\n public withPreparedSqliteStatement<T>(sql: string, callback: (stmt: SqliteStatement) => T, logErrors = true): T {\n const stmt = this._sqliteStatementCache.findAndRemove(sql) ?? this.prepareSqliteStatement(sql, logErrors);\n const release = () => this._sqliteStatementCache.addOrDispose(stmt);\n try {\n const val: T = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /**\n * Prepared and execute a callback on a SQL statement. After the callback completes the statement is disposed.\n * Use this method for SQL statements are either not expected to be reused, or are not expensive to prepare.\n * For statements that will be reused often, instead use [[withPreparedSqliteStatement]].\n * @param sql The SQLite SQL statement to execute\n * @param callback the callback to invoke on the prepared statement\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @returns the value returned by `callback`.\n * @public\n */\n public withSqliteStatement<T>(sql: string, callback: (stmt: SqliteStatement) => T, logErrors = true): T {\n const stmt = this.prepareSqliteStatement(sql, logErrors);\n const release = () => stmt[Symbol.dispose]();\n try {\n const val: T = callback(stmt);\n if (val instanceof Promise) {\n val.then(release, release);\n } else {\n release();\n }\n return val;\n } catch (err) {\n release();\n throw err;\n }\n }\n\n /** Prepare an SQL statement.\n * @param sql The SQLite SQL statement to prepare\n * @param logErrors Determines if error will be logged if statement fail to prepare\n * @throws [IModelError]($common) if there is a problem preparing the statement.\n * @internal\n */\n public prepareSqliteStatement(sql: string, logErrors = true): SqliteStatement {\n const stmt = new SqliteStatement(sql);\n stmt.prepare(this[_nativeDb], logErrors);\n return stmt;\n }\n\n /** @internal */\n public get [_nativeDb](): IModelJsNative.ECDb {\n assert(undefined !== this._nativeDb);\n return this._nativeDb;\n }\n\n /** Allow to execute query and read results along with meta data. The result are streamed.\n *\n * See also:\n * - [ECSQL Overview]($docs/learning/backend/ExecutingECSQL)\n * - [Code Examples]($docs/learning/backend/ECSQLCodeExamples)\n * - [ECSQL Row Format]($docs/learning/ECSQLRowFormat)\n *\n * @param params The values to bind to the parameters (if the ECSQL has any).\n * @param config Allow to specify certain flags which control how query is executed.\n * @returns Returns an [ECSqlReader]($common) which helps iterate over the result set and also give access to metadata.\n * @public\n * */\n public createQueryReader(ecsql: string, params?: QueryBinder, config?: QueryOptions): ECSqlReader {\n if (!this._nativeDb || !this._nativeDb.isOpen()) {\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"db not open\");\n }\n const executor = {\n execute: async (request: DbQueryRequest) => {\n return ConcurrentQuery.executeQueryRequest(this[_nativeDb], request);\n },\n };\n return new ECSqlReader(executor, ecsql, params, config);\n }\n}\n"]}
|