udbx4ts 0.3.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core/sql/SqlHelpers.ts","../src/core/schema/UdbxTypeMappings.ts","../src/core/schema/SmFieldInfoRepository.ts","../src/core/dataset/BaseDataset.ts","../src/core/utils/errors.ts","../src/core/dataset/CadDataset.ts","../src/core/utils/BinaryCursor.ts","../src/core/utils/BinaryWriter.ts","../src/core/geometry/gaia/GaiaConstants.ts","../src/core/geometry/gaia/GaiaErrors.ts","../src/core/geometry/gaia/GaiaHeader.ts","../src/core/geometry/gaia/GaiaPointCodec.ts","../src/core/geometry/gaia/GaiaLineCodec.ts","../src/core/schema/SmRegisterRepository.ts","../src/core/dataset/vectorDatasetShared.ts","../src/core/dataset/LineDataset.ts","../src/core/dataset/LineZDataset.ts","../src/core/dataset/PointDataset.ts","../src/core/dataset/PointZDataset.ts","../src/core/geometry/gaia/GaiaPolygonCodec.ts","../src/core/dataset/RegionDataset.ts","../src/core/dataset/RegionZDataset.ts","../src/core/dataset/TabularDataset.ts","../src/core/dataset/TextDataset.ts","../src/core/schema/UdbxSchemaInitializer.ts","../src/core/datasource/UdbxDataSource.ts","../src/core/errors.ts","../src/core/geometry/gaia/GaiaGeometryCodec.ts","../src/core/geometry/jsts/JstsGeometryAdapter.ts"],"sourcesContent":["export * from \"./core/datasource/UdbxDataSource\";\nexport * from \"./core/dataset/BaseDataset\";\nexport * from \"./core/dataset/CadDataset\";\nexport * from \"./core/dataset/Dataset\";\nexport * from \"./core/dataset/LineDataset\";\nexport * from \"./core/dataset/LineZDataset\";\nexport * from \"./core/dataset/PointDataset\";\nexport * from \"./core/dataset/PointZDataset\";\nexport * from \"./core/dataset/RegionDataset\";\nexport * from \"./core/dataset/RegionZDataset\";\nexport * from \"./core/dataset/TabularDataset\";\nexport * from \"./core/dataset/TextDataset\";\nexport * from \"./core/errors\";\nexport * from \"./core/geometry/gaia/GaiaConstants\";\nexport * from \"./core/geometry/gaia/GaiaErrors\";\nexport * from \"./core/geometry/gaia/GaiaGeometryCodec\";\nexport * from \"./core/geometry/gaia/GaiaHeader\";\nexport * from \"./core/geometry/gaia/GaiaLineCodec\";\nexport * from \"./core/geometry/gaia/GaiaPointCodec\";\nexport * from \"./core/geometry/gaia/GaiaPolygonCodec\";\nexport * from \"./core/geometry/jsts/JstsGeometryAdapter\";\nexport * from \"./core/schema/SmFieldInfoRepository\";\nexport * from \"./core/schema/SmRegisterRepository\";\nexport * from \"./core/schema/UdbxTypeMappings\";\nexport * from \"./core/schema/UdbxSchemaInitializer\";\nexport * from \"./core/sql/SqlDriver\";\nexport * from \"./core/types\";\nexport * from \"./core/utils/BinaryCursor\";\nexport * from \"./core/utils/BinaryWriter\";\nexport * from \"./core/utils/errors\";\n","import type { SqlDriver, SqlStatement, SqlValue } from \"./SqlDriver\";\n\nexport async function queryAll<T>(\n driver: SqlDriver,\n sql: string,\n params?: readonly SqlValue[]\n): Promise<T[]> {\n const statement = await driver.prepare(sql);\n\n try {\n if (params) {\n await statement.bind(params);\n }\n\n const rows: T[] = [];\n while (await statement.step()) {\n rows.push(await statement.getRow<T>());\n }\n\n return rows;\n } finally {\n await statement.finalize();\n }\n}\n\nexport async function queryOne<T>(\n driver: SqlDriver,\n sql: string,\n params?: readonly SqlValue[]\n): Promise<T | null> {\n const rows = await queryAll<T>(driver, sql, params);\n return rows[0] ?? null;\n}\n\nexport async function executeStatement(\n statement: SqlStatement,\n params?: readonly SqlValue[]\n): Promise<void> {\n try {\n if (params) {\n await statement.bind(params);\n }\n\n await statement.step();\n } finally {\n await statement.finalize();\n }\n}\n\nexport async function executeSql(\n driver: SqlDriver,\n sql: string,\n params?: readonly SqlValue[]\n): Promise<void> {\n const statement = await driver.prepare(sql);\n await executeStatement(statement, params);\n}\n\n","import type { DatasetKind, FieldType } from \"../types\";\n\nconst datasetKindToValueMap: Record<DatasetKind, number> = {\n tabular: 0,\n point: 1,\n line: 3,\n region: 5,\n pointZ: 101,\n lineZ: 103,\n regionZ: 105,\n text: 7,\n cad: 149\n};\n\nconst datasetValueToKindMap = new Map<number, DatasetKind>(\n Object.entries(datasetKindToValueMap).map(([kind, value]) => [\n value,\n kind as DatasetKind\n ])\n);\n\nconst fieldTypeToValueMap: Record<FieldType, number> = {\n boolean: 1,\n byte: 2,\n int16: 3,\n int32: 4,\n int64: 5,\n single: 6,\n double: 7,\n date: 8,\n binary: 9,\n geometry: 10,\n char: 11,\n ntext: 127,\n text: 128,\n time: 16\n};\n\nconst fieldValueToTypeMap = new Map<number, FieldType>([\n [1, \"boolean\"],\n [2, \"byte\"],\n [3, \"int16\"],\n [4, \"int32\"],\n [5, \"int64\"],\n [6, \"single\"],\n [7, \"double\"],\n [8, \"date\"],\n [9, \"binary\"],\n [10, \"geometry\"],\n [11, \"char\"],\n [16, \"time\"],\n [127, \"ntext\"],\n [128, \"text\"]\n]);\n\nexport function datasetKindToValue(kind: DatasetKind): number {\n return datasetKindToValueMap[kind];\n}\n\nexport function datasetValueToKind(value: number): DatasetKind {\n const kind = datasetValueToKindMap.get(value);\n if (!kind) {\n throw new Error(`Unsupported SmDatasetType value: ${value}.`);\n }\n\n return kind;\n}\n\nexport function fieldTypeToValue(type: FieldType): number {\n return fieldTypeToValueMap[type];\n}\n\nexport function fieldValueToType(value: number): FieldType {\n const type = fieldValueToTypeMap.get(value);\n if (!type) {\n throw new Error(`Unsupported SmFieldType value: ${value}.`);\n }\n\n return type;\n}\n\n","import { executeStatement, queryAll } from \"../sql/SqlHelpers\";\nimport type { SqlDriver } from \"../sql/SqlDriver\";\nimport type { FieldInfo } from \"../types\";\nimport { fieldTypeToValue, fieldValueToType } from \"./UdbxTypeMappings\";\n\ninterface SmFieldInfoRow {\n readonly SmFieldName: string;\n readonly SmFieldType: number;\n readonly SmFieldbRequired: number | null;\n readonly SmFieldDefaultValue: string | null;\n}\n\nfunction mapRow(row: SmFieldInfoRow): FieldInfo {\n return {\n name: row.SmFieldName,\n fieldType: fieldValueToType(row.SmFieldType),\n nullable: row.SmFieldbRequired !== 1,\n defaultValue: row.SmFieldDefaultValue ?? undefined\n };\n}\n\nexport class SmFieldInfoRepository {\n constructor(private readonly driver: SqlDriver) {}\n\n async findByDatasetId(datasetId: number): Promise<readonly FieldInfo[]> {\n const rows = await queryAll<SmFieldInfoRow>(\n this.driver,\n `SELECT\n SmFieldName,\n SmFieldType,\n SmFieldbRequired,\n SmFieldDefaultValue\n FROM SmFieldInfo\n WHERE SmDatasetID = ?\n ORDER BY SmID`,\n [datasetId]\n );\n\n return rows.map(mapRow);\n }\n\n async insertAll(datasetId: number, fields: readonly FieldInfo[]): Promise<void> {\n for (const field of fields) {\n const statement = await this.driver.prepare(\n `INSERT INTO SmFieldInfo (\n SmDatasetID,\n SmFieldName,\n SmFieldType,\n SmFieldCaption,\n SmFieldbRequired,\n SmFieldDefaultValue\n ) VALUES (?, ?, ?, ?, ?, ?)`\n );\n\n await executeStatement(statement, [\n datasetId,\n field.name,\n fieldTypeToValue(field.fieldType),\n field.name,\n field.nullable ? 0 : 1,\n field.defaultValue == null ? null : String(field.defaultValue)\n ]);\n }\n }\n}\n","import type { SqlDriver } from \"../sql/SqlDriver\";\nimport type { DatasetInfo, FieldInfo } from \"../types\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport type { Dataset } from \"./Dataset\";\n\nexport abstract class BaseDataset implements Dataset {\n protected readonly fieldInfoRepository: SmFieldInfoRepository;\n\n constructor(\n protected readonly driver: SqlDriver,\n readonly info: DatasetInfo\n ) {\n this.fieldInfoRepository = new SmFieldInfoRepository(driver);\n }\n\n getFields(): Promise<readonly FieldInfo[]> {\n return this.fieldInfoRepository.findByDatasetId(this.info.id);\n }\n}\n","export class NotImplementedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotImplementedError\";\n }\n}\n\nexport function createNotImplementedError(scope: string): NotImplementedError {\n return new NotImplementedError(`${scope} is not implemented yet.`);\n}\n\n","import type { SqlDriver } from \"../sql/SqlDriver\";\nimport type { CadGeometry, DatasetInfo, QueryOptions } from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport { createNotImplementedError } from \"../utils/errors\";\n\nexport type CadFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = {\n readonly id: number;\n readonly geometry: CadGeometry;\n readonly attributes: TAttributes;\n};\n\nexport class CadDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<CadFeature<TAttributes>>\n{\n async getById(): Promise<CadFeature<TAttributes> | null> {\n throw createNotImplementedError(\"CadDataset.getById\");\n }\n\n async list(): Promise<readonly CadFeature<TAttributes>[]> {\n throw createNotImplementedError(\"CadDataset.list\");\n }\n\n async *iterate(): AsyncIterable<CadFeature<TAttributes>> {\n throw createNotImplementedError(\"CadDataset.iterate\");\n }\n\n async count(): Promise<number> {\n throw createNotImplementedError(\"CadDataset.count\");\n }\n\n async insert(): Promise<void> {\n throw createNotImplementedError(\"CadDataset.insert\");\n }\n\n async insertMany(): Promise<void> {\n throw createNotImplementedError(\"CadDataset.insertMany\");\n }\n\n async update(): Promise<void> {\n throw createNotImplementedError(\"CadDataset.update\");\n }\n\n async delete(): Promise<void> {\n throw createNotImplementedError(\"CadDataset.delete\");\n }\n}\n","function toUint8Array(\n input: ArrayBuffer | ArrayBufferView | Uint8Array\n): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n return new Uint8Array(input);\n}\n\nexport class BinaryCursor {\n private readonly bytes: Uint8Array;\n private readonly view: DataView;\n private offset = 0;\n\n constructor(input: ArrayBuffer | ArrayBufferView | Uint8Array) {\n this.bytes = toUint8Array(input);\n this.view = new DataView(\n this.bytes.buffer,\n this.bytes.byteOffset,\n this.bytes.byteLength\n );\n }\n\n get length(): number {\n return this.bytes.byteLength;\n }\n\n get position(): number {\n return this.offset;\n }\n\n get remaining(): number {\n return this.length - this.offset;\n }\n\n seek(position: number): void {\n if (position < 0 || position > this.length) {\n throw new RangeError(\n `Cannot seek to ${position}; valid range is 0..${this.length}.`\n );\n }\n\n this.offset = position;\n }\n\n skip(length: number): void {\n this.seek(this.offset + length);\n }\n\n readUint8(): number {\n this.ensureAvailable(1);\n const value = this.view.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n readInt32(littleEndian = true): number {\n this.ensureAvailable(4);\n const value = this.view.getInt32(this.offset, littleEndian);\n this.offset += 4;\n return value;\n }\n\n readFloat64(littleEndian = true): number {\n this.ensureAvailable(8);\n const value = this.view.getFloat64(this.offset, littleEndian);\n this.offset += 8;\n return value;\n }\n\n readBytes(length: number): Uint8Array {\n this.ensureAvailable(length);\n const value = this.bytes.slice(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n\n peekUint8(): number {\n this.ensureAvailable(1);\n return this.view.getUint8(this.offset);\n }\n\n private ensureAvailable(length: number): void {\n if (length < 0) {\n throw new RangeError(\"Length must be non-negative.\");\n }\n\n if (this.offset + length > this.length) {\n throw new RangeError(\n `Cannot read ${length} byte(s) from offset ${this.offset}; only ${this.remaining} byte(s) remain.`\n );\n }\n }\n}\n\n","export class BinaryWriter {\n private buffer: ArrayBuffer;\n private view: DataView;\n private bytes: Uint8Array;\n private offset = 0;\n\n constructor(initialCapacity = 64) {\n if (initialCapacity <= 0) {\n throw new RangeError(\"Initial capacity must be greater than 0.\");\n }\n\n this.buffer = new ArrayBuffer(initialCapacity);\n this.view = new DataView(this.buffer);\n this.bytes = new Uint8Array(this.buffer);\n }\n\n get length(): number {\n return this.offset;\n }\n\n writeUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.offset, value);\n this.offset += 1;\n }\n\n writeInt32(value: number, littleEndian = true): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.offset, value, littleEndian);\n this.offset += 4;\n }\n\n writeFloat64(value: number, littleEndian = true): void {\n this.ensureCapacity(8);\n this.view.setFloat64(this.offset, value, littleEndian);\n this.offset += 8;\n }\n\n writeBytes(value: ArrayBuffer | ArrayBufferView | Uint8Array): void {\n const bytes = value instanceof Uint8Array\n ? value\n : ArrayBuffer.isView(value)\n ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n : new Uint8Array(value);\n\n this.ensureCapacity(bytes.byteLength);\n this.bytes.set(bytes, this.offset);\n this.offset += bytes.byteLength;\n }\n\n toUint8Array(): Uint8Array {\n return this.bytes.slice(0, this.offset);\n }\n\n private ensureCapacity(required: number): void {\n if (this.offset + required <= this.buffer.byteLength) {\n return;\n }\n\n let nextCapacity = this.buffer.byteLength;\n while (this.offset + required > nextCapacity) {\n nextCapacity *= 2;\n }\n\n const nextBuffer = new ArrayBuffer(nextCapacity);\n const nextBytes = new Uint8Array(nextBuffer);\n nextBytes.set(this.bytes.subarray(0, this.offset));\n\n this.buffer = nextBuffer;\n this.view = new DataView(this.buffer);\n this.bytes = nextBytes;\n }\n}\n\n","export const GAIA_START = 0x00;\nexport const GAIA_BYTE_ORDER_LE = 0x01;\nexport const GAIA_MBR = 0x7c;\nexport const GAIA_END = 0xfe;\n\nexport const GAIA_GEOMETRY_DATA_OFFSET = 43;\n\nexport const GEO_TYPE_POINT = 1;\nexport const GEO_TYPE_POINTZ = 1001;\nexport const GEO_TYPE_MULTILINESTRING = 5;\nexport const GEO_TYPE_MULTILINESTRINGZ = 1005;\nexport const GEO_TYPE_MULTIPOLYGON = 6;\nexport const GEO_TYPE_MULTIPOLYGONZ = 1006;\n\n","export class GaiaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GaiaError\";\n }\n}\n\nexport class GaiaFormatError extends GaiaError {\n constructor(message: string) {\n super(message);\n this.name = \"GaiaFormatError\";\n }\n}\n\nexport class GaiaGeoTypeMismatchError extends GaiaError {\n constructor(expected: number, actual: number) {\n super(`Expected geoType=${expected}, got ${actual}.`);\n this.name = \"GaiaGeoTypeMismatchError\";\n }\n}\n\nexport class GaiaUnsupportedGeoTypeError extends GaiaError {\n constructor(geoType: number) {\n super(`Unsupported GAIA geoType: ${geoType}.`);\n this.name = \"GaiaUnsupportedGeoTypeError\";\n }\n}\n\n","import { BinaryCursor } from \"../../utils/BinaryCursor\";\nimport {\n GAIA_BYTE_ORDER_LE,\n GAIA_END,\n GAIA_GEOMETRY_DATA_OFFSET,\n GAIA_MBR,\n GAIA_START\n} from \"./GaiaConstants\";\nimport { GaiaFormatError, GaiaGeoTypeMismatchError } from \"./GaiaErrors\";\n\nexport interface GaiaHeader {\n readonly byteOrder: number;\n readonly srid: number;\n readonly mbr: readonly [number, number, number, number];\n readonly geoType: number;\n readonly geometryDataOffset: number;\n}\n\nexport function readGaiaHeader(\n cursor: BinaryCursor,\n expectedGeoType?: number\n): GaiaHeader {\n cursor.seek(0);\n\n const gaiaStart = cursor.readUint8();\n if (gaiaStart !== GAIA_START) {\n throw new GaiaFormatError(\n `Invalid GAIA start marker: expected 0x${GAIA_START.toString(16)}, got 0x${gaiaStart.toString(16)}.`\n );\n }\n\n const byteOrder = cursor.readUint8();\n if (byteOrder !== GAIA_BYTE_ORDER_LE) {\n throw new GaiaFormatError(\n `Unsupported byte order: expected 0x${GAIA_BYTE_ORDER_LE.toString(16)}, got 0x${byteOrder.toString(16)}.`\n );\n }\n\n const srid = cursor.readInt32(true);\n const minX = cursor.readFloat64(true);\n const minY = cursor.readFloat64(true);\n const maxX = cursor.readFloat64(true);\n const maxY = cursor.readFloat64(true);\n\n const gaiaMbr = cursor.readUint8();\n if (gaiaMbr !== GAIA_MBR) {\n throw new GaiaFormatError(\n `Invalid GAIA MBR marker: expected 0x${GAIA_MBR.toString(16)}, got 0x${gaiaMbr.toString(16)}.`\n );\n }\n\n const geoType = cursor.readInt32(true);\n if (expectedGeoType !== undefined && geoType !== expectedGeoType) {\n throw new GaiaGeoTypeMismatchError(expectedGeoType, geoType);\n }\n\n return {\n byteOrder,\n srid,\n mbr: [minX, minY, maxX, maxY],\n geoType,\n geometryDataOffset: GAIA_GEOMETRY_DATA_OFFSET\n };\n}\n\nexport function validateGaiaEnd(cursor: BinaryCursor): void {\n const gaiaEnd = cursor.readUint8();\n if (gaiaEnd !== GAIA_END) {\n throw new GaiaFormatError(\n `Invalid GAIA end marker: expected 0x${GAIA_END.toString(16)}, got 0x${gaiaEnd.toString(16)}.`\n );\n }\n}\n\n","import type { PointGeometry } from \"../../types\";\nimport { BinaryCursor } from \"../../utils/BinaryCursor\";\nimport { BinaryWriter } from \"../../utils/BinaryWriter\";\nimport {\n GAIA_BYTE_ORDER_LE,\n GAIA_END,\n GAIA_MBR,\n GAIA_START,\n GEO_TYPE_POINT,\n GEO_TYPE_POINTZ\n} from \"./GaiaConstants\";\nimport { GaiaFormatError } from \"./GaiaErrors\";\nimport { readGaiaHeader, validateGaiaEnd } from \"./GaiaHeader\";\n\nfunction isPoint3D(geometry: PointGeometry): geometry is PointGeometry & {\n readonly coordinates: [number, number, number];\n} {\n return geometry.coordinates.length === 3;\n}\n\nfunction createPointMbr(\n coordinates: readonly [number, number] | readonly [number, number, number]\n): readonly [number, number, number, number] {\n return [coordinates[0], coordinates[1], coordinates[0], coordinates[1]];\n}\n\nexport function writeGaiaHeader(\n writer: BinaryWriter,\n srid: number,\n mbr: readonly [number, number, number, number],\n geoType: number\n): void {\n writer.writeUint8(GAIA_START);\n writer.writeUint8(GAIA_BYTE_ORDER_LE);\n writer.writeInt32(srid, true);\n writer.writeFloat64(mbr[0], true);\n writer.writeFloat64(mbr[1], true);\n writer.writeFloat64(mbr[2], true);\n writer.writeFloat64(mbr[3], true);\n writer.writeUint8(GAIA_MBR);\n writer.writeInt32(geoType, true);\n}\n\nexport class GaiaPointCodec {\n static readPoint(input: Uint8Array): PointGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_POINT);\n\n const x = cursor.readFloat64(true);\n const y = cursor.readFloat64(true);\n validateGaiaEnd(cursor);\n\n return {\n type: \"Point\",\n coordinates: [x, y],\n srid: header.srid,\n bbox: header.mbr,\n hasZ: false,\n geoType: header.geoType\n };\n }\n\n static readPointZ(input: Uint8Array): PointGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_POINTZ);\n\n const x = cursor.readFloat64(true);\n const y = cursor.readFloat64(true);\n const z = cursor.readFloat64(true);\n validateGaiaEnd(cursor);\n\n return {\n type: \"Point\",\n coordinates: [x, y, z],\n srid: header.srid,\n bbox: header.mbr,\n hasZ: true,\n geoType: header.geoType\n };\n }\n\n static writePoint(geometry: PointGeometry, srid: number): Uint8Array {\n if (isPoint3D(geometry)) {\n throw new GaiaFormatError(\"writePoint expects a 2D Point geometry.\");\n }\n\n const writer = new BinaryWriter(60);\n const mbr = createPointMbr(geometry.coordinates);\n\n writeGaiaHeader(writer, srid, mbr, GEO_TYPE_POINT);\n writer.writeFloat64(geometry.coordinates[0], true);\n writer.writeFloat64(geometry.coordinates[1], true);\n writer.writeUint8(GAIA_END);\n\n return writer.toUint8Array();\n }\n\n static writePointZ(geometry: PointGeometry, srid: number): Uint8Array {\n if (!isPoint3D(geometry)) {\n throw new GaiaFormatError(\"writePointZ expects a 3D Point geometry.\");\n }\n\n const writer = new BinaryWriter(68);\n const mbr = createPointMbr(geometry.coordinates);\n\n writeGaiaHeader(writer, srid, mbr, GEO_TYPE_POINTZ);\n writer.writeFloat64(geometry.coordinates[0], true);\n writer.writeFloat64(geometry.coordinates[1], true);\n writer.writeFloat64(geometry.coordinates[2], true);\n writer.writeUint8(GAIA_END);\n\n return writer.toUint8Array();\n }\n}\n","import type { MultiLineStringGeometry } from \"../../types\";\nimport { BinaryCursor } from \"../../utils/BinaryCursor\";\nimport { BinaryWriter } from \"../../utils/BinaryWriter\";\nimport {\n GAIA_END,\n GEO_TYPE_MULTILINESTRING,\n GEO_TYPE_MULTILINESTRINGZ\n} from \"./GaiaConstants\";\nimport { GaiaFormatError } from \"./GaiaErrors\";\nimport { readGaiaHeader, validateGaiaEnd } from \"./GaiaHeader\";\nimport { writeGaiaHeader } from \"./GaiaPointCodec\";\n\nconst GAIA_ENTITY_MARK = 0x69;\nconst GEO_TYPE_LINESTRING = 2;\nconst GEO_TYPE_LINESTRINGZ = 1002;\n\ntype Line2D = ReadonlyArray<readonly [number, number]>;\ntype Line3D = ReadonlyArray<readonly [number, number, number]>;\n\nfunction is3DCoordinates(\n coordinates: MultiLineStringGeometry[\"coordinates\"]\n): coordinates is ReadonlyArray<Line3D> {\n return coordinates[0]?.[0]?.length === 3;\n}\n\nfunction createLineMbr(\n coordinates: MultiLineStringGeometry[\"coordinates\"]\n): readonly [number, number, number, number] {\n const xs: number[] = [];\n const ys: number[] = [];\n\n for (const line of coordinates) {\n for (const point of line) {\n xs.push(point[0]);\n ys.push(point[1]);\n }\n }\n\n if (xs.length === 0) {\n throw new GaiaFormatError(\"MultiLineString must contain at least one point.\");\n }\n\n return [\n Math.min(...xs),\n Math.min(...ys),\n Math.max(...xs),\n Math.max(...ys)\n ];\n}\n\nexport class GaiaLineCodec {\n static readMultiLineString(input: Uint8Array): MultiLineStringGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_MULTILINESTRING);\n const lineCount = cursor.readInt32(true);\n const coordinates: Array<Array<readonly [number, number]>> = [];\n\n for (let lineIndex = 0; lineIndex < lineCount; lineIndex += 1) {\n const entityMark = cursor.readUint8();\n if (entityMark !== GAIA_ENTITY_MARK) {\n throw new GaiaFormatError(\n `Invalid LineString entity mark: expected 0x${GAIA_ENTITY_MARK.toString(16)}, got 0x${entityMark.toString(16)}.`\n );\n }\n\n const lineGeoType = cursor.readInt32(true);\n if (lineGeoType !== GEO_TYPE_LINESTRING) {\n throw new GaiaFormatError(\n `Invalid LineString geoType: expected ${GEO_TYPE_LINESTRING}, got ${lineGeoType}.`\n );\n }\n\n const pointCount = cursor.readInt32(true);\n const line: Array<readonly [number, number]> = [];\n\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex += 1) {\n line.push([cursor.readFloat64(true), cursor.readFloat64(true)]);\n }\n\n coordinates.push(line);\n }\n\n validateGaiaEnd(cursor);\n\n return {\n type: \"MultiLineString\",\n coordinates,\n srid: header.srid,\n bbox: header.mbr,\n hasZ: false,\n geoType: header.geoType\n };\n }\n\n static readMultiLineStringZ(input: Uint8Array): MultiLineStringGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_MULTILINESTRINGZ);\n const lineCount = cursor.readInt32(true);\n const coordinates: Array<Array<readonly [number, number, number]>> = [];\n\n for (let lineIndex = 0; lineIndex < lineCount; lineIndex += 1) {\n const entityMark = cursor.readUint8();\n if (entityMark !== GAIA_ENTITY_MARK) {\n throw new GaiaFormatError(\n `Invalid LineString entity mark: expected 0x${GAIA_ENTITY_MARK.toString(16)}, got 0x${entityMark.toString(16)}.`\n );\n }\n\n const lineGeoType = cursor.readInt32(true);\n if (lineGeoType !== GEO_TYPE_LINESTRINGZ) {\n throw new GaiaFormatError(\n `Invalid LineStringZ geoType: expected ${GEO_TYPE_LINESTRINGZ}, got ${lineGeoType}.`\n );\n }\n\n const pointCount = cursor.readInt32(true);\n const line: Array<readonly [number, number, number]> = [];\n\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex += 1) {\n line.push([\n cursor.readFloat64(true),\n cursor.readFloat64(true),\n cursor.readFloat64(true)\n ]);\n }\n\n coordinates.push(line);\n }\n\n validateGaiaEnd(cursor);\n\n return {\n type: \"MultiLineString\",\n coordinates,\n srid: header.srid,\n bbox: header.mbr,\n hasZ: true,\n geoType: header.geoType\n };\n }\n\n static writeMultiLineString(\n geometry: MultiLineStringGeometry,\n srid: number\n ): Uint8Array {\n if (is3DCoordinates(geometry.coordinates)) {\n throw new GaiaFormatError(\n \"writeMultiLineString expects 2D coordinates.\"\n );\n }\n\n const writer = new BinaryWriter();\n writeGaiaHeader(\n writer,\n srid,\n createLineMbr(geometry.coordinates),\n GEO_TYPE_MULTILINESTRING\n );\n writer.writeInt32(geometry.coordinates.length, true);\n\n for (const line of geometry.coordinates) {\n writer.writeUint8(GAIA_ENTITY_MARK);\n writer.writeInt32(GEO_TYPE_LINESTRING, true);\n writer.writeInt32(line.length, true);\n for (const point of line) {\n writer.writeFloat64(point[0], true);\n writer.writeFloat64(point[1], true);\n }\n }\n\n writer.writeUint8(GAIA_END);\n return writer.toUint8Array();\n }\n\n static writeMultiLineStringZ(\n geometry: MultiLineStringGeometry,\n srid: number\n ): Uint8Array {\n if (!is3DCoordinates(geometry.coordinates)) {\n throw new GaiaFormatError(\n \"writeMultiLineStringZ expects 3D coordinates.\"\n );\n }\n\n const writer = new BinaryWriter();\n writeGaiaHeader(\n writer,\n srid,\n createLineMbr(geometry.coordinates),\n GEO_TYPE_MULTILINESTRINGZ\n );\n writer.writeInt32(geometry.coordinates.length, true);\n\n for (const line of geometry.coordinates) {\n writer.writeUint8(GAIA_ENTITY_MARK);\n writer.writeInt32(GEO_TYPE_LINESTRINGZ, true);\n writer.writeInt32(line.length, true);\n for (const point of line) {\n writer.writeFloat64(point[0], true);\n writer.writeFloat64(point[1], true);\n writer.writeFloat64(point[2], true);\n }\n }\n\n writer.writeUint8(GAIA_END);\n return writer.toUint8Array();\n }\n}\n\n","import { executeStatement, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver } from \"../sql/SqlDriver\";\nimport type { DatasetInfo, DatasetKind } from \"../types\";\nimport { datasetKindToValue, datasetValueToKind } from \"./UdbxTypeMappings\";\n\ninterface SmRegisterRow {\n readonly SmDatasetID: number;\n readonly SmDatasetName: string;\n readonly SmTableName: string;\n readonly SmDatasetType: number;\n readonly SmObjectCount: number;\n readonly SmSRID: number | null;\n readonly geometryType?: number | null;\n}\n\nfunction mapRow(row: SmRegisterRow): DatasetInfo {\n return {\n id: row.SmDatasetID,\n name: row.SmDatasetName,\n kind: datasetValueToKind(row.SmDatasetType),\n tableName: row.SmTableName,\n srid: row.SmSRID ?? null,\n objectCount: row.SmObjectCount,\n geometryType: row.geometryType ?? null\n };\n}\n\nexport class SmRegisterRepository {\n constructor(private readonly driver: SqlDriver) {}\n\n async findAll(): Promise<readonly DatasetInfo[]> {\n const rows = await queryAll<SmRegisterRow>(\n this.driver,\n `SELECT\n SmDatasetID,\n SmDatasetName,\n SmTableName,\n SmDatasetType,\n SmObjectCount,\n SmSRID\n FROM SmRegister\n ORDER BY SmDatasetID`\n );\n\n return rows.map(mapRow);\n }\n\n async findByName(name: string): Promise<DatasetInfo | null> {\n const row = await queryOne<SmRegisterRow>(\n this.driver,\n `SELECT\n SmDatasetID,\n SmDatasetName,\n SmTableName,\n SmDatasetType,\n SmObjectCount,\n SmSRID\n FROM SmRegister\n WHERE SmDatasetName = ?`,\n [name]\n );\n\n return row ? mapRow(row) : null;\n }\n\n async nextDatasetId(): Promise<number> {\n const row = await queryOne<{ nextId: number }>(\n this.driver,\n \"SELECT COALESCE(MAX(SmDatasetID), 0) + 1 AS nextId FROM SmRegister\"\n );\n\n return row?.nextId ?? 1;\n }\n\n async insert(params: {\n readonly name: string;\n readonly kind: DatasetKind;\n readonly srid: number;\n readonly idColumnName: string;\n readonly geometryColumnName: string | null;\n }): Promise<number> {\n const datasetId = await this.nextDatasetId();\n const statement = await this.driver.prepare(\n `INSERT INTO SmRegister (\n SmDatasetID,\n SmDatasetName,\n SmTableName,\n SmDatasetType,\n SmObjectCount,\n SmSRID,\n SmIDColName,\n SmGeoColName,\n SmMaxGeometrySize,\n SmCreateTime,\n SmLastUpdateTime\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?, 0, datetime('now'), datetime('now'))`\n );\n\n await executeStatement(statement, [\n datasetId,\n params.name,\n params.name,\n datasetKindToValue(params.kind),\n params.srid,\n params.idColumnName,\n params.geometryColumnName\n ]);\n\n return datasetId;\n }\n\n async incrementObjectCount(\n datasetId: number,\n geometrySize?: number\n ): Promise<void> {\n if (geometrySize === undefined) {\n const statement = await this.driver.prepare(\n \"UPDATE SmRegister SET SmObjectCount = SmObjectCount + 1 WHERE SmDatasetID = ?\"\n );\n await executeStatement(statement, [datasetId]);\n return;\n }\n\n const statement = await this.driver.prepare(\n `UPDATE SmRegister\n SET SmObjectCount = SmObjectCount + 1,\n SmMaxGeometrySize = CASE\n WHEN SmMaxGeometrySize < ? THEN ?\n ELSE SmMaxGeometrySize\n END\n WHERE SmDatasetID = ?`\n );\n await executeStatement(statement, [geometrySize, geometrySize, datasetId]);\n }\n\n async incrementObjectCountBatch(\n datasetId: number,\n count: number,\n maxGeometrySize: number\n ): Promise<void> {\n const statement = await this.driver.prepare(\n `UPDATE SmRegister\n SET SmObjectCount = SmObjectCount + ?,\n SmMaxGeometrySize = CASE\n WHEN SmMaxGeometrySize < ? THEN ?\n ELSE SmMaxGeometrySize\n END\n WHERE SmDatasetID = ?`\n );\n await executeStatement(statement, [\n count,\n maxGeometrySize,\n maxGeometrySize,\n datasetId\n ]);\n }\n\n async decrementObjectCount(datasetId: number): Promise<void> {\n const statement = await this.driver.prepare(\n \"UPDATE SmRegister SET SmObjectCount = SmObjectCount - 1 WHERE SmDatasetID = ? AND SmObjectCount > 0\"\n );\n await executeStatement(statement, [datasetId]);\n }\n}\n","import type { SqlValue } from \"../sql/SqlDriver\";\nimport type { FieldInfo, QueryOptions } from \"../types\";\n\nexport function normalizeGeometryBlob(\n value: Uint8Array | ArrayBuffer\n): Uint8Array {\n return value instanceof Uint8Array ? value : new Uint8Array(value);\n}\n\nexport function buildListSql(\n tableName: string,\n options?: QueryOptions\n): { sql: string; params: SqlValue[] } {\n const params: SqlValue[] = [];\n const clauses: string[] = [];\n\n if (options?.ids?.length) {\n const placeholders = options.ids.map(() => \"?\").join(\", \");\n clauses.push(`SmID IN (${placeholders})`);\n params.push(...options.ids);\n }\n\n const whereClause = clauses.length > 0 ? ` WHERE ${clauses.join(\" AND \")}` : \"\";\n let sql = `SELECT * FROM \"${tableName}\"${whereClause} ORDER BY SmID`;\n\n if (options?.limit !== undefined) {\n sql += \" LIMIT ?\";\n params.push(options.limit);\n }\n\n if (options?.offset !== undefined) {\n if (options.limit === undefined) {\n sql += \" LIMIT -1\";\n }\n sql += \" OFFSET ?\";\n params.push(options.offset);\n }\n\n return { sql, params };\n}\n\nexport function sqliteColumnType(field: FieldInfo): string {\n switch (field.fieldType) {\n case \"boolean\":\n case \"byte\":\n case \"int16\":\n case \"int32\":\n case \"int64\":\n return \"INTEGER\";\n case \"single\":\n case \"double\":\n return \"REAL\";\n case \"binary\":\n case \"geometry\":\n return \"BLOB\";\n case \"date\":\n case \"char\":\n case \"ntext\":\n case \"text\":\n case \"time\":\n default:\n return \"TEXT\";\n }\n}\n\n","import { GaiaLineCodec } from \"../geometry/gaia/GaiaLineCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n MultiLineStringGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type LineFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<MultiLineStringGeometry, TAttributes>;\n\ninterface LineDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapLineRow<TAttributes extends Record<string, unknown>>(\n row: LineDatasetRow\n): LineFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaLineCodec.readMultiLineString(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class LineDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<LineFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<LineFeature<TAttributes> | null> {\n const row = await queryOne<LineDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapLineRow<TAttributes>(row) : null;\n }\n\n async list(options?: QueryOptions): Promise<readonly LineFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<LineDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapLineRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<LineFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapLineRow<TAttributes>(await statement.getRow<LineDatasetRow>());\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async insert(feature: LineFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaLineCodec.writeMultiLineString(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<LineFeature<TAttributes>> | AsyncIterable<LineFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaLineCodec.writeMultiLineString(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async update(\n id: number,\n changes: {\n geometry?: MultiLineStringGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaLineCodec.writeMultiLineString(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<LineDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"line\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 5, 2, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new LineDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"line\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 5\n });\n }\n}\n\n","import { GaiaLineCodec } from \"../geometry/gaia/GaiaLineCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n MultiLineStringGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type LineZFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<MultiLineStringGeometry, TAttributes>;\n\ninterface LineZDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapLineZRow<TAttributes extends Record<string, unknown>>(\n row: LineZDatasetRow\n): LineZFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaLineCodec.readMultiLineStringZ(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class LineZDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<LineZFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<LineZFeature<TAttributes> | null> {\n const row = await queryOne<LineZDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapLineZRow<TAttributes>(row) : null;\n }\n\n async list(options?: QueryOptions): Promise<readonly LineZFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<LineZDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapLineZRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<LineZFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapLineZRow<TAttributes>(await statement.getRow<LineZDatasetRow>());\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async insert(feature: LineZFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaLineCodec.writeMultiLineStringZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<LineZFeature<TAttributes>> | AsyncIterable<LineZFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaLineCodec.writeMultiLineStringZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async update(\n id: number,\n changes: {\n geometry?: MultiLineStringGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaLineCodec.writeMultiLineStringZ(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<LineZDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"lineZ\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 1005, 3, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new LineZDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"lineZ\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 1005\n });\n }\n}\n","import { GaiaPointCodec } from \"../geometry/gaia/GaiaPointCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n PointGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type PointFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<PointGeometry, TAttributes>;\n\ninterface PointDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapPointRow<TAttributes extends Record<string, unknown>>(\n row: PointDatasetRow\n): PointFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaPointCodec.readPoint(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class PointDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<PointFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<PointFeature<TAttributes> | null> {\n const row = await queryOne<PointDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapPointRow<TAttributes>(row) : null;\n }\n\n async list(options?: QueryOptions): Promise<readonly PointFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<PointDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapPointRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<PointFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapPointRow<TAttributes>(await statement.getRow<PointDatasetRow>());\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async insert(feature: PointFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaPointCodec.writePoint(feature.geometry, feature.geometry.srid ?? this.info.srid ?? 0);\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<PointFeature<TAttributes>> | AsyncIterable<PointFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaPointCodec.writePoint(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async update(\n id: number,\n changes: {\n geometry?: PointGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaPointCodec.writePoint(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<PointDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"point\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 1, 2, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new PointDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"point\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 1\n });\n }\n}\n","import { GaiaPointCodec } from \"../geometry/gaia/GaiaPointCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n PointGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type PointZFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<PointGeometry, TAttributes>;\n\ninterface PointZDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapPointZRow<TAttributes extends Record<string, unknown>>(\n row: PointZDatasetRow\n): PointZFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaPointCodec.readPointZ(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class PointZDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<PointZFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<PointZFeature<TAttributes> | null> {\n const row = await queryOne<PointZDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapPointZRow<TAttributes>(row) : null;\n }\n\n async list(options?: QueryOptions): Promise<readonly PointZFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<PointZDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapPointZRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<PointZFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapPointZRow<TAttributes>(await statement.getRow<PointZDatasetRow>());\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async insert(feature: PointZFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaPointCodec.writePointZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<PointZFeature<TAttributes>> | AsyncIterable<PointZFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaPointCodec.writePointZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async update(\n id: number,\n changes: {\n geometry?: PointGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaPointCodec.writePointZ(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<PointZDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"pointZ\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 1001, 3, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new PointZDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"pointZ\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 1001\n });\n }\n}\n","import type { MultiPolygonGeometry } from \"../../types\";\nimport { BinaryCursor } from \"../../utils/BinaryCursor\";\nimport { BinaryWriter } from \"../../utils/BinaryWriter\";\nimport {\n GAIA_END,\n GEO_TYPE_MULTIPOLYGON,\n GEO_TYPE_MULTIPOLYGONZ\n} from \"./GaiaConstants\";\nimport { GaiaFormatError } from \"./GaiaErrors\";\nimport { readGaiaHeader, validateGaiaEnd } from \"./GaiaHeader\";\nimport { writeGaiaHeader } from \"./GaiaPointCodec\";\n\nconst GAIA_ENTITY_MARK = 0x69;\nconst GEO_TYPE_POLYGON = 3;\nconst GEO_TYPE_POLYGONZ = 1003;\n\ntype Ring2D = ReadonlyArray<readonly [number, number]>;\ntype Polygon2D = ReadonlyArray<Ring2D>;\ntype Ring3D = ReadonlyArray<readonly [number, number, number]>;\ntype Polygon3D = ReadonlyArray<Ring3D>;\n\nfunction is3DCoordinates(\n coordinates: MultiPolygonGeometry[\"coordinates\"]\n): coordinates is ReadonlyArray<Polygon3D> {\n return coordinates[0]?.[0]?.[0]?.length === 3;\n}\n\nfunction createPolygonMbr(\n coordinates: MultiPolygonGeometry[\"coordinates\"]\n): readonly [number, number, number, number] {\n const xs: number[] = [];\n const ys: number[] = [];\n\n for (const polygon of coordinates) {\n for (const ring of polygon) {\n for (const point of ring) {\n xs.push(point[0]);\n ys.push(point[1]);\n }\n }\n }\n\n if (xs.length === 0) {\n throw new GaiaFormatError(\"MultiPolygon must contain at least one point.\");\n }\n\n return [\n Math.min(...xs),\n Math.min(...ys),\n Math.max(...xs),\n Math.max(...ys)\n ];\n}\n\nfunction writeRing2D(writer: BinaryWriter, ring: Ring2D): void {\n writer.writeInt32(ring.length, true);\n for (const point of ring) {\n writer.writeFloat64(point[0], true);\n writer.writeFloat64(point[1], true);\n }\n}\n\nfunction writeRing3D(writer: BinaryWriter, ring: Ring3D): void {\n writer.writeInt32(ring.length, true);\n for (const point of ring) {\n writer.writeFloat64(point[0], true);\n writer.writeFloat64(point[1], true);\n writer.writeFloat64(point[2], true);\n }\n}\n\nfunction readRing2D(cursor: BinaryCursor): Array<readonly [number, number]> {\n const pointCount = cursor.readInt32(true);\n const ring: Array<readonly [number, number]> = [];\n\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex += 1) {\n ring.push([cursor.readFloat64(true), cursor.readFloat64(true)]);\n }\n\n return ring;\n}\n\nfunction readRing3D(\n cursor: BinaryCursor\n): Array<readonly [number, number, number]> {\n const pointCount = cursor.readInt32(true);\n const ring: Array<readonly [number, number, number]> = [];\n\n for (let pointIndex = 0; pointIndex < pointCount; pointIndex += 1) {\n ring.push([\n cursor.readFloat64(true),\n cursor.readFloat64(true),\n cursor.readFloat64(true)\n ]);\n }\n\n return ring;\n}\n\nexport class GaiaPolygonCodec {\n static readMultiPolygon(input: Uint8Array): MultiPolygonGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_MULTIPOLYGON);\n const polygonCount = cursor.readInt32(true);\n const coordinates: Array<Array<Array<readonly [number, number]>>> = [];\n\n for (let polygonIndex = 0; polygonIndex < polygonCount; polygonIndex += 1) {\n const entityMark = cursor.readUint8();\n if (entityMark !== GAIA_ENTITY_MARK) {\n throw new GaiaFormatError(\n `Invalid Polygon entity mark: expected 0x${GAIA_ENTITY_MARK.toString(16)}, got 0x${entityMark.toString(16)}.`\n );\n }\n\n const polygonGeoType = cursor.readInt32(true);\n if (polygonGeoType !== GEO_TYPE_POLYGON) {\n throw new GaiaFormatError(\n `Invalid Polygon geoType: expected ${GEO_TYPE_POLYGON}, got ${polygonGeoType}.`\n );\n }\n\n const ringCount = cursor.readInt32(true);\n if (ringCount < 1) {\n throw new GaiaFormatError(\n `Polygon must contain at least one ring, got ${ringCount}.`\n );\n }\n\n const polygon: Array<Array<readonly [number, number]>> = [];\n for (let ringIndex = 0; ringIndex < ringCount; ringIndex += 1) {\n polygon.push(readRing2D(cursor));\n }\n\n coordinates.push(polygon);\n }\n\n validateGaiaEnd(cursor);\n\n return {\n type: \"MultiPolygon\",\n coordinates,\n srid: header.srid,\n bbox: header.mbr,\n hasZ: false,\n geoType: header.geoType\n };\n }\n\n static readMultiPolygonZ(input: Uint8Array): MultiPolygonGeometry {\n const cursor = new BinaryCursor(input);\n const header = readGaiaHeader(cursor, GEO_TYPE_MULTIPOLYGONZ);\n const polygonCount = cursor.readInt32(true);\n const coordinates: Array<Array<Array<readonly [number, number, number]>>> =\n [];\n\n for (let polygonIndex = 0; polygonIndex < polygonCount; polygonIndex += 1) {\n const entityMark = cursor.readUint8();\n if (entityMark !== GAIA_ENTITY_MARK) {\n throw new GaiaFormatError(\n `Invalid Polygon entity mark: expected 0x${GAIA_ENTITY_MARK.toString(16)}, got 0x${entityMark.toString(16)}.`\n );\n }\n\n const polygonGeoType = cursor.readInt32(true);\n if (polygonGeoType !== GEO_TYPE_POLYGONZ) {\n throw new GaiaFormatError(\n `Invalid PolygonZ geoType: expected ${GEO_TYPE_POLYGONZ}, got ${polygonGeoType}.`\n );\n }\n\n const ringCount = cursor.readInt32(true);\n if (ringCount < 1) {\n throw new GaiaFormatError(\n `Polygon must contain at least one ring, got ${ringCount}.`\n );\n }\n\n const polygon: Array<Array<readonly [number, number, number]>> = [];\n for (let ringIndex = 0; ringIndex < ringCount; ringIndex += 1) {\n polygon.push(readRing3D(cursor));\n }\n\n coordinates.push(polygon);\n }\n\n validateGaiaEnd(cursor);\n\n return {\n type: \"MultiPolygon\",\n coordinates,\n srid: header.srid,\n bbox: header.mbr,\n hasZ: true,\n geoType: header.geoType\n };\n }\n\n static writeMultiPolygon(\n geometry: MultiPolygonGeometry,\n srid: number\n ): Uint8Array {\n if (is3DCoordinates(geometry.coordinates)) {\n throw new GaiaFormatError(\"writeMultiPolygon expects 2D coordinates.\");\n }\n\n const writer = new BinaryWriter();\n writeGaiaHeader(\n writer,\n srid,\n createPolygonMbr(geometry.coordinates),\n GEO_TYPE_MULTIPOLYGON\n );\n writer.writeInt32(geometry.coordinates.length, true);\n\n for (const polygon of geometry.coordinates) {\n writer.writeUint8(GAIA_ENTITY_MARK);\n writer.writeInt32(GEO_TYPE_POLYGON, true);\n writer.writeInt32(polygon.length, true);\n for (const ring of polygon) {\n writeRing2D(writer, ring);\n }\n }\n\n writer.writeUint8(GAIA_END);\n return writer.toUint8Array();\n }\n\n static writeMultiPolygonZ(\n geometry: MultiPolygonGeometry,\n srid: number\n ): Uint8Array {\n if (!is3DCoordinates(geometry.coordinates)) {\n throw new GaiaFormatError(\"writeMultiPolygonZ expects 3D coordinates.\");\n }\n\n const writer = new BinaryWriter();\n writeGaiaHeader(\n writer,\n srid,\n createPolygonMbr(geometry.coordinates),\n GEO_TYPE_MULTIPOLYGONZ\n );\n writer.writeInt32(geometry.coordinates.length, true);\n\n for (const polygon of geometry.coordinates) {\n writer.writeUint8(GAIA_ENTITY_MARK);\n writer.writeInt32(GEO_TYPE_POLYGONZ, true);\n writer.writeInt32(polygon.length, true);\n for (const ring of polygon) {\n writeRing3D(writer, ring);\n }\n }\n\n writer.writeUint8(GAIA_END);\n return writer.toUint8Array();\n }\n}\n\n","import { GaiaPolygonCodec } from \"../geometry/gaia/GaiaPolygonCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n MultiPolygonGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type RegionFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<MultiPolygonGeometry, TAttributes>;\n\ninterface RegionDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapRegionRow<TAttributes extends Record<string, unknown>>(\n row: RegionDatasetRow\n): RegionFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaPolygonCodec.readMultiPolygon(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class RegionDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<RegionFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<RegionFeature<TAttributes> | null> {\n const row = await queryOne<RegionDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapRegionRow<TAttributes>(row) : null;\n }\n\n async list(\n options?: QueryOptions\n ): Promise<readonly RegionFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<RegionDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapRegionRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<RegionFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapRegionRow<TAttributes>(\n await statement.getRow<RegionDatasetRow>()\n );\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async insert(feature: RegionFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaPolygonCodec.writeMultiPolygon(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<RegionFeature<TAttributes>> | AsyncIterable<RegionFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaPolygonCodec.writeMultiPolygon(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async update(\n id: number,\n changes: {\n geometry?: MultiPolygonGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaPolygonCodec.writeMultiPolygon(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<RegionDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"region\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 6, 2, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new RegionDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"region\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 6\n });\n }\n}\n\n","import { GaiaPolygonCodec } from \"../geometry/gaia/GaiaPolygonCodec\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type {\n DatasetInfo,\n Feature,\n FieldInfo,\n MultiPolygonGeometry,\n QueryOptions\n} from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport {\n buildListSql,\n normalizeGeometryBlob,\n sqliteColumnType\n} from \"./vectorDatasetShared\";\n\nexport type RegionZFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = Feature<MultiPolygonGeometry, TAttributes>;\n\ninterface RegionZDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n readonly SmGeometry: Uint8Array | ArrayBuffer;\n}\n\nfunction mapRegionZRow<TAttributes extends Record<string, unknown>>(\n row: RegionZDatasetRow\n): RegionZFeature<TAttributes> {\n const { SmID, SmGeometry, ...attributes } = row;\n\n return {\n id: SmID,\n geometry: GaiaPolygonCodec.readMultiPolygonZ(normalizeGeometryBlob(SmGeometry)),\n attributes: attributes as TAttributes\n };\n}\n\nexport class RegionZDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<RegionZFeature<TAttributes>>\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<RegionZFeature<TAttributes> | null> {\n const row = await queryOne<RegionZDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapRegionZRow<TAttributes>(row) : null;\n }\n\n async list(\n options?: QueryOptions\n ): Promise<readonly RegionZFeature<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<RegionZDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapRegionZRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<RegionZFeature<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapRegionZRow<TAttributes>(\n await statement.getRow<RegionZDatasetRow>()\n );\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async insert(feature: RegionZFeature<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const geometry = GaiaPolygonCodec.writeMultiPolygonZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map((field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null)\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id, geometry.byteLength);\n });\n }\n\n async insertMany(\n features: Iterable<RegionZFeature<TAttributes>> | AsyncIterable<RegionZFeature<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\"SmID\", \"SmUserID\", \"SmGeometry\", ...userFields.map((field) => field.name)];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n let maxGeometrySize = 0;\n\n for await (const feature of features) {\n const geometry = GaiaPolygonCodec.writeMultiPolygonZ(\n feature.geometry,\n feature.geometry.srid ?? this.info.srid ?? 0\n );\n maxGeometrySize = Math.max(maxGeometrySize, geometry.byteLength);\n const params: SqlValue[] = [\n feature.id,\n 0,\n geometry,\n ...userFields.map(\n (field) => (feature.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n maxGeometrySize\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async update(\n id: number,\n changes: {\n geometry?: MultiPolygonGeometry;\n attributes?: Partial<TAttributes>;\n }\n ): Promise<void> {\n if (!changes.geometry && !changes.attributes) {\n return;\n }\n\n const setClauses: string[] = [];\n const params: SqlValue[] = [];\n\n if (changes.geometry) {\n const geometry = GaiaPolygonCodec.writeMultiPolygonZ(\n changes.geometry,\n changes.geometry.srid ?? this.info.srid ?? 0\n );\n setClauses.push('\"SmGeometry\" = ?');\n params.push(geometry);\n }\n\n if (changes.attributes) {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(changes.attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n for (const [key, value] of validEntries) {\n setClauses.push(`\"${key}\" = ?`);\n params.push(value as SqlValue);\n }\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses.join(\", \")} WHERE SmID = ?`;\n params.push(id);\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly srid: number;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<RegionZDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"regionZ\",\n srid: params.srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n await executeSql(\n driver,\n `INSERT INTO geometry_columns (\n f_table_name,\n f_geometry_column,\n geometry_type,\n coord_dimension,\n srid,\n spatial_index_enabled\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n [params.name, \"SmGeometry\", 1006, 3, params.srid, 0]\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new RegionZDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"regionZ\",\n tableName: params.name,\n srid: params.srid,\n objectCount: 0,\n geometryType: 1006\n });\n }\n}\n","import { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport { executeSql, executeStatement, queryAll, queryOne } from \"../sql/SqlHelpers\";\nimport type { SqlDriver, SqlValue } from \"../sql/SqlDriver\";\nimport type { DatasetInfo, FieldInfo, QueryOptions, TabularRecord } from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport { buildListSql, sqliteColumnType } from \"./vectorDatasetShared\";\n\ninterface TabularDatasetRow extends Record<string, unknown> {\n readonly SmID: number;\n}\n\nconst SYSTEM_COLUMN_PREFIX = \"Sm\";\n\nfunction mapTabularRow<TAttributes extends Record<string, unknown>>(\n row: TabularDatasetRow\n): TabularRecord<TAttributes> {\n const { SmID, ...rest } = row;\n\n const attributes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rest)) {\n if (!key.startsWith(SYSTEM_COLUMN_PREFIX)) {\n attributes[key] = value;\n }\n }\n\n return {\n id: SmID,\n attributes: attributes as TAttributes\n };\n}\n\nexport interface TabularDatasetReadable {\n readonly info: DatasetInfo;\n getFields(): Promise<readonly FieldInfo[]>;\n getById(id: number): Promise<TabularRecord | null>;\n list(options?: QueryOptions): Promise<readonly TabularRecord[]>;\n iterate(options?: QueryOptions): AsyncIterable<TabularRecord>;\n count(): Promise<number>;\n}\n\nexport interface TabularDatasetWritable extends TabularDatasetReadable {\n insert(record: TabularRecord): Promise<void>;\n insertMany(\n records: Iterable<TabularRecord> | AsyncIterable<TabularRecord>\n ): Promise<void>;\n update(id: number, attributes: Record<string, unknown>): Promise<void>;\n delete(id: number): Promise<void>;\n}\n\nexport class TabularDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements TabularDatasetWritable\n{\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(driver: SqlDriver, info: DatasetInfo) {\n super(driver, info);\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n async getById(id: number): Promise<TabularRecord<TAttributes> | null> {\n const row = await queryOne<TabularDatasetRow>(\n this.driver,\n `SELECT * FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n\n return row ? mapTabularRow<TAttributes>(row) : null;\n }\n\n async list(\n options?: QueryOptions\n ): Promise<readonly TabularRecord<TAttributes>[]> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const rows = await queryAll<TabularDatasetRow>(this.driver, sql, params);\n return rows.map((row) => mapTabularRow<TAttributes>(row));\n }\n\n async *iterate(\n options?: QueryOptions\n ): AsyncIterable<TabularRecord<TAttributes>> {\n const { sql, params } = buildListSql(this.info.tableName, options);\n const statement = await this.driver.prepare(sql);\n\n try {\n if (params.length > 0) {\n await statement.bind(params);\n }\n\n while (await statement.step()) {\n yield mapTabularRow<TAttributes>(\n await statement.getRow<TabularDatasetRow>()\n );\n }\n } finally {\n await statement.finalize();\n }\n }\n\n async count(): Promise<number> {\n const row = await queryOne<{ readonly count: number }>(\n this.driver,\n `SELECT COUNT(*) AS count FROM \"${this.info.tableName}\"`,\n []\n );\n return row?.count ?? 0;\n }\n\n async insert(record: TabularRecord<TAttributes>): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\n \"SmID\",\n \"SmUserID\",\n ...userFields.map((field) => field.name)\n ];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n const params: SqlValue[] = [\n record.id,\n 0,\n ...userFields.map(\n (field) =>\n (record.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n await this.registerRepository.incrementObjectCount(this.info.id);\n });\n }\n\n async insertMany(\n records: Iterable<TabularRecord<TAttributes>> | AsyncIterable<TabularRecord<TAttributes>>\n ): Promise<void> {\n const userFields = await this.getFields();\n const columnNames = [\n \"SmID\",\n \"SmUserID\",\n ...userFields.map((field) => field.name)\n ];\n const placeholders = columnNames.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${this.info.tableName}\" (${columnNames.map((column) => `\"${column}\"`).join(\", \")}) VALUES (${placeholders})`;\n\n await this.driver.transaction(async () => {\n const statement = await this.driver.prepare(sql);\n try {\n let count = 0;\n\n for await (const record of records) {\n const params: SqlValue[] = [\n record.id,\n 0,\n ...userFields.map(\n (field) =>\n (record.attributes[field.name] as SqlValue | undefined) ?? null\n )\n ];\n\n await statement.bind(params);\n await statement.step();\n await statement.reset();\n count++;\n }\n\n if (count > 0) {\n await this.registerRepository.incrementObjectCountBatch(\n this.info.id,\n count,\n 0\n );\n }\n } finally {\n await statement.finalize();\n }\n });\n }\n\n async update(\n id: number,\n attributes: Record<string, unknown>\n ): Promise<void> {\n const userFields = await this.getFields();\n const fieldNames = new Set(userFields.map((f) => f.name));\n const validEntries = Object.entries(attributes).filter(([key]) =>\n fieldNames.has(key)\n );\n if (validEntries.length === 0) return;\n\n const keys = validEntries.map(([key]) => key);\n const setClauses = keys.map((key) => `\"${key}\" = ?`).join(\", \");\n const sql = `UPDATE \"${this.info.tableName}\" SET ${setClauses} WHERE SmID = ?`;\n const params: SqlValue[] = [\n ...keys.map((key) => attributes[key] as SqlValue),\n id\n ];\n\n await this.driver.transaction(async () => {\n await executeSql(this.driver, sql, params);\n });\n }\n\n async delete(id: number): Promise<void> {\n await this.driver.transaction(async () => {\n await executeSql(\n this.driver,\n `DELETE FROM \"${this.info.tableName}\" WHERE SmID = ?`,\n [id]\n );\n await this.registerRepository.decrementObjectCount(this.info.id);\n });\n }\n\n static async create(\n driver: SqlDriver,\n registerRepository: SmRegisterRepository,\n params: {\n readonly name: string;\n readonly fields?: readonly FieldInfo[];\n }\n ): Promise<TabularDataset> {\n const fields = params.fields ?? [];\n const datasetId = await registerRepository.insert({\n name: params.name,\n kind: \"tabular\",\n srid: 0,\n idColumnName: \"SmID\",\n geometryColumnName: null\n });\n\n const userColumnDefinitions = fields.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" ${sqliteColumnType(field)}${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n ...userColumnDefinitions\n ];\n\n await driver.exec(\n `CREATE TABLE \"${params.name}\" (${createTableParts.join(\", \")})`\n );\n\n if (fields.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(driver);\n await fieldInfoRepository.insertAll(datasetId, fields);\n }\n\n return new TabularDataset(driver, {\n id: datasetId,\n name: params.name,\n kind: \"tabular\",\n tableName: params.name,\n srid: 0,\n objectCount: 0,\n geometryType: null\n });\n }\n}\n","import type { SqlDriver } from \"../sql/SqlDriver\";\nimport type { DatasetInfo, QueryOptions, TextGeometry } from \"../types\";\nimport { BaseDataset } from \"./BaseDataset\";\nimport type { WritableDataset } from \"./Dataset\";\nimport { createNotImplementedError } from \"../utils/errors\";\n\nexport type TextFeature<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n> = {\n readonly id: number;\n readonly geometry: TextGeometry;\n readonly attributes: TAttributes;\n};\n\n/**\n * 文本数据集实现(DatasetKind=\"text\")。\n *\n * <p>对应白皮书 §3.1.5(文本数据集)。\n *\n * <p><b>TODO:</b> GeoText 二进制编解码器待实现。\n */\nexport class TextDataset<\n TAttributes extends Record<string, unknown> = Record<string, unknown>\n >\n extends BaseDataset\n implements WritableDataset<TextFeature<TAttributes>>\n{\n async getById(): Promise<TextFeature<TAttributes> | null> {\n throw createNotImplementedError(\"TextDataset.getById\");\n }\n\n async list(\n _options?: QueryOptions\n ): Promise<readonly TextFeature<TAttributes>[]> {\n throw createNotImplementedError(\"TextDataset.list\");\n }\n\n async *iterate(\n _options?: QueryOptions\n ): AsyncIterable<TextFeature<TAttributes>> {\n throw createNotImplementedError(\"TextDataset.iterate\");\n }\n\n async count(): Promise<number> {\n throw createNotImplementedError(\"TextDataset.count\");\n }\n\n async insert(): Promise<void> {\n throw createNotImplementedError(\"TextDataset.insert\");\n }\n\n async insertMany(): Promise<void> {\n throw createNotImplementedError(\"TextDataset.insertMany\");\n }\n\n async update(): Promise<void> {\n throw createNotImplementedError(\"TextDataset.update\");\n }\n\n async delete(): Promise<void> {\n throw createNotImplementedError(\"TextDataset.delete\");\n }\n}\n","import type { SqlDriver } from \"../sql/SqlDriver\";\n\nexport const UDBX_SYSTEM_TABLES = [\n \"spatial_ref_sys\",\n \"geometry_columns\",\n \"SmDataSourceInfo\",\n \"SmRegister\",\n \"SmFieldInfo\"\n] as const;\n\nexport const UDBX_SCHEMA_STATEMENTS = [\n `CREATE TABLE spatial_ref_sys (\n srid INTEGER NOT NULL PRIMARY KEY,\n auth_name TEXT NOT NULL,\n auth_srid INTEGER NOT NULL,\n ref_sys_name TEXT NOT NULL DEFAULT 'Unknown',\n proj4text TEXT NOT NULL,\n srtext TEXT NOT NULL DEFAULT 'Undefined'\n )`,\n `CREATE TABLE geometry_columns (\n f_table_name TEXT NOT NULL,\n f_geometry_column TEXT NOT NULL,\n geometry_type INTEGER NOT NULL,\n coord_dimension INTEGER NOT NULL,\n srid INTEGER NOT NULL,\n spatial_index_enabled INTEGER NOT NULL,\n CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column)\n )`,\n `CREATE TABLE SmDataSourceInfo (\n SmFlag INTEGER DEFAULT 0 NOT NULL PRIMARY KEY AUTOINCREMENT,\n SmVersion INTEGER,\n SmDsDescription TEXT,\n SmProjectInfo BLOB,\n SmLastUpdateTime DATE DEFAULT CURRENT_TIMESTAMP NOT NULL,\n SmDataFormat INTEGER DEFAULT 0 NOT NULL\n )`,\n `CREATE TABLE SmRegister (\n SmDatasetID INTEGER DEFAULT 0 NOT NULL PRIMARY KEY,\n SmDatasetName TEXT,\n SmTableName TEXT,\n SmOption INTEGER,\n SmEncType INTEGER,\n SmParentDTID INTEGER DEFAULT 0 NOT NULL,\n SmDatasetType INTEGER,\n SmObjectCount INTEGER DEFAULT 0 NOT NULL,\n SmLeft REAL,\n SmRight REAL,\n SmTop REAL,\n SmBottom REAL,\n SmIDColName TEXT,\n SmGeoColName TEXT,\n SmMinZ REAL,\n SmMaxZ REAL,\n SmSRID INTEGER DEFAULT 0,\n SmIndexType INTEGER DEFAULT 1,\n SmToleRanceFuzzy REAL,\n SmToleranceDAngle REAL,\n SmToleranceNodeSnap REAL,\n SmToleranceSmallPolygon REAL,\n SmToleranceGrain REAL,\n SmMaxGeometrySize INTEGER DEFAULT 0 NOT NULL,\n SmOptimizeCount INTEGER DEFAULT 0 NOT NULL,\n SmOptimizeRatio REAL,\n SmDescription TEXT,\n SmExtInfo TEXT,\n SmCreateTime TEXT,\n SmLastUpdateTime TEXT,\n SmProjectInfo BLOB\n )`,\n `CREATE TABLE SmFieldInfo (\n SmID INTEGER DEFAULT 0 NOT NULL PRIMARY KEY AUTOINCREMENT,\n SmDatasetID INTEGER,\n SmFieldName TEXT,\n SmFieldCaption TEXT,\n SmFieldType INTEGER,\n SmFieldFormat TEXT,\n SmFieldSign INTEGER,\n SmFieldDomain TEXT,\n SmFieldUpdatable INTEGER,\n SmFieldbRequired INTEGER,\n SmFieldDefaultValue TEXT,\n SmFieldSize INTEGER\n )`,\n \"INSERT INTO SmDataSourceInfo (SmVersion, SmDataFormat) VALUES (0, 1)\",\n \"INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text, srtext) VALUES (0, 'none', 0, 'Undefined', '', 'Undefined')\",\n `INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text, srtext)\n VALUES (\n 4326,\n 'epsg',\n 4326,\n 'WGS 84',\n '+proj=longlat +datum=WGS84 +no_defs',\n 'GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]'\n )`\n] as const;\n\nexport class UdbxSchemaInitializer {\n static async isInitialized(driver: SqlDriver): Promise<boolean> {\n const statement = await driver.prepare(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\"\n );\n\n try {\n await statement.bind([\"SmDataSourceInfo\"]);\n return statement.step();\n } finally {\n await statement.finalize();\n }\n }\n\n static async ensureInitialized(driver: SqlDriver): Promise<boolean> {\n const initialized = await this.isInitialized(driver);\n if (initialized) {\n return false;\n }\n\n await this.initialize(driver);\n return true;\n }\n\n static async initialize(driver: SqlDriver): Promise<void> {\n await driver.exec(\"PRAGMA journal_mode = WAL\");\n await driver.transaction(async () => {\n for (const statement of UDBX_SCHEMA_STATEMENTS) {\n await driver.exec(statement);\n }\n });\n }\n}\n","import { CadDataset } from \"../dataset/CadDataset\";\nimport { LineDataset } from \"../dataset/LineDataset\";\nimport { LineZDataset } from \"../dataset/LineZDataset\";\nimport { PointDataset } from \"../dataset/PointDataset\";\nimport { PointZDataset } from \"../dataset/PointZDataset\";\nimport { RegionDataset } from \"../dataset/RegionDataset\";\nimport { RegionZDataset } from \"../dataset/RegionZDataset\";\nimport { TabularDataset } from \"../dataset/TabularDataset\";\nimport { TextDataset } from \"../dataset/TextDataset\";\nimport { SmFieldInfoRepository } from \"../schema/SmFieldInfoRepository\";\nimport { UdbxSchemaInitializer } from \"../schema/UdbxSchemaInitializer\";\nimport { SmRegisterRepository } from \"../schema/SmRegisterRepository\";\nimport type { SqlDriver, SqlOpenTarget } from \"../sql/SqlDriver\";\nimport type { DatasetInfo, FieldInfo } from \"../types\";\n\nexport type UdbxRuntime = \"browser\" | \"electron\" | \"unknown\";\nexport type UdbxDataset =\n | PointDataset\n | PointZDataset\n | LineDataset\n | LineZDataset\n | RegionDataset\n | RegionZDataset\n | TabularDataset\n | TextDataset\n | CadDataset;\n\nexport class UdbxDataSource {\n private readonly registerRepository: SmRegisterRepository;\n\n constructor(\n private readonly driver: SqlDriver,\n readonly runtime: UdbxRuntime = \"unknown\"\n ) {\n this.registerRepository = new SmRegisterRepository(driver);\n }\n\n static async open(params: {\n readonly driver: SqlDriver;\n readonly target: SqlOpenTarget;\n readonly runtime?: UdbxRuntime;\n }): Promise<UdbxDataSource> {\n await params.driver.open(params.target);\n return new UdbxDataSource(params.driver, params.runtime ?? \"unknown\");\n }\n\n static async create(params: {\n readonly driver: SqlDriver;\n readonly target: SqlOpenTarget;\n readonly runtime?: UdbxRuntime;\n }): Promise<UdbxDataSource> {\n await params.driver.open(params.target);\n await UdbxSchemaInitializer.initialize(params.driver);\n return new UdbxDataSource(params.driver, params.runtime ?? \"unknown\");\n }\n\n async listDatasets(): Promise<readonly DatasetInfo[]> {\n return this.registerRepository.findAll();\n }\n\n async getDataset(name: string): Promise<UdbxDataset | null> {\n const info = await this.registerRepository.findByName(name);\n\n if (!info) {\n return null;\n }\n\n switch (info.kind) {\n case \"point\":\n return new PointDataset(this.driver, info);\n case \"pointZ\":\n return new PointZDataset(this.driver, info);\n case \"line\":\n return new LineDataset(this.driver, info);\n case \"lineZ\":\n return new LineZDataset(this.driver, info);\n case \"region\":\n return new RegionDataset(this.driver, info);\n case \"regionZ\":\n return new RegionZDataset(this.driver, info);\n case \"tabular\":\n return new TabularDataset(this.driver, info);\n case \"text\":\n return new TextDataset(this.driver, info);\n case \"cad\":\n return new CadDataset(this.driver, info);\n default:\n return null;\n }\n }\n\n async createPointDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<PointDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return PointDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createLineDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<LineDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return LineDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createRegionDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<RegionDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return RegionDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createPointZDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<PointZDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return PointZDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createLineZDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<LineZDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return LineZDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createRegionZDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<RegionZDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name, srid }\n : { name, srid, fields };\n\n return RegionZDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createTabularDataset(\n name: string,\n fields?: readonly FieldInfo[]\n ): Promise<TabularDataset> {\n return this.driver.transaction(async () => {\n const params =\n fields === undefined\n ? { name }\n : { name, fields };\n\n return TabularDataset.create(this.driver, this.registerRepository, params);\n });\n }\n\n async createTextDataset(\n name: string,\n srid: number,\n fields?: readonly FieldInfo[]\n ): Promise<TextDataset> {\n return this.driver.transaction(async () => {\n const fieldList = fields ?? [];\n\n const datasetId = await this.registerRepository.insert({\n name,\n kind: \"text\",\n srid,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fieldList.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" TEXT${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB`,\n `\"SmIndexKey\" POLYGON`,\n ...userColumnDefinitions\n ];\n\n await this.driver.exec(\n `CREATE TABLE \"${name}\" (${createTableParts.join(\", \")})`\n );\n\n if (fieldList.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(this.driver);\n await fieldInfoRepository.insertAll(datasetId, fieldList);\n }\n\n return new TextDataset(this.driver, {\n id: datasetId,\n name,\n kind: \"text\",\n tableName: name,\n srid,\n objectCount: 0,\n geometryType: null\n });\n });\n }\n\n async createCadDataset(\n name: string,\n fields?: readonly FieldInfo[]\n ): Promise<CadDataset> {\n return this.driver.transaction(async () => {\n const fieldList = fields ?? [];\n\n const datasetId = await this.registerRepository.insert({\n name,\n kind: \"cad\",\n srid: 0,\n idColumnName: \"SmID\",\n geometryColumnName: \"SmGeometry\"\n });\n\n const userColumnDefinitions = fieldList.map((field) => {\n const nullability = field.nullable ? \"\" : \" NOT NULL\";\n return `\"${field.name}\" TEXT${nullability}`;\n });\n\n const createTableParts = [\n `\"SmID\" INTEGER NOT NULL PRIMARY KEY`,\n `\"SmUserID\" INTEGER DEFAULT 0 NOT NULL`,\n `\"SmGeometry\" BLOB`,\n ...userColumnDefinitions\n ];\n\n await this.driver.exec(\n `CREATE TABLE \"${name}\" (${createTableParts.join(\", \")})`\n );\n\n if (fieldList.length > 0) {\n const fieldInfoRepository = new SmFieldInfoRepository(this.driver);\n await fieldInfoRepository.insertAll(datasetId, fieldList);\n }\n\n return new CadDataset(this.driver, {\n id: datasetId,\n name,\n kind: \"cad\",\n tableName: name,\n srid: 0,\n objectCount: 0,\n geometryType: null\n });\n });\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n}\n","export class UdbxError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = \"UdbxError\";\n }\n}\n\nexport class UdbxFormatError extends UdbxError {\n constructor(message?: string) {\n super(message);\n this.name = \"UdbxFormatError\";\n }\n}\n\nexport class UdbxNotFoundError extends UdbxError {\n constructor(what: string, id?: number) {\n super(id !== undefined ? `${what} not found (id=${id})` : `${what} not found`);\n this.name = \"UdbxNotFoundError\";\n }\n}\n\nexport class UdbxUnsupportedError extends UdbxError {\n constructor(what: string) {\n super(`Unsupported: ${what}`);\n this.name = \"UdbxUnsupportedError\";\n }\n}\n\nexport class UdbxConstraintError extends UdbxError {\n constructor(what: string) {\n super(`Constraint violation: ${what}`);\n this.name = \"UdbxConstraintError\";\n }\n}\n\nexport class UdbxIOError extends UdbxError {\n constructor(cause?: Error) {\n super(cause ? `IO error: ${cause.message}` : \"IO error\");\n this.name = \"UdbxIOError\";\n }\n}\n","import type { Geometry, MultiLineStringGeometry, MultiPolygonGeometry, PointGeometry } from \"../../types\";\nimport { BinaryCursor } from \"../../utils/BinaryCursor\";\nimport {\n GEO_TYPE_MULTILINESTRING,\n GEO_TYPE_MULTILINESTRINGZ,\n GEO_TYPE_MULTIPOLYGON,\n GEO_TYPE_MULTIPOLYGONZ,\n GEO_TYPE_POINT,\n GEO_TYPE_POINTZ\n} from \"./GaiaConstants\";\nimport { GaiaUnsupportedGeoTypeError } from \"./GaiaErrors\";\nimport { readGaiaHeader } from \"./GaiaHeader\";\nimport { GaiaLineCodec } from \"./GaiaLineCodec\";\nimport { GaiaPointCodec } from \"./GaiaPointCodec\";\nimport { GaiaPolygonCodec } from \"./GaiaPolygonCodec\";\n\ntype GaiaDecoder<TGeometry extends Geometry = Geometry> = (\n input: Uint8Array\n) => TGeometry;\n\ntype GaiaEncoder<TGeometry extends Geometry = Geometry> = (\n geometry: TGeometry,\n srid: number\n) => Uint8Array;\n\ninterface GaiaCodecEntry<TGeometry extends Geometry = Geometry> {\n readonly geoType: number;\n readonly decode: GaiaDecoder<TGeometry>;\n}\n\nconst decodeByGeoType = new Map<number, GaiaDecoder>([\n [GEO_TYPE_POINT, GaiaPointCodec.readPoint],\n [GEO_TYPE_POINTZ, GaiaPointCodec.readPointZ],\n [GEO_TYPE_MULTILINESTRING, GaiaLineCodec.readMultiLineString],\n [GEO_TYPE_MULTILINESTRINGZ, GaiaLineCodec.readMultiLineStringZ],\n [GEO_TYPE_MULTIPOLYGON, GaiaPolygonCodec.readMultiPolygon],\n [GEO_TYPE_MULTIPOLYGONZ, GaiaPolygonCodec.readMultiPolygonZ]\n]);\n\nconst pointCodecs: Record<number, GaiaCodecEntry<PointGeometry>> = {\n [GEO_TYPE_POINT]: {\n geoType: GEO_TYPE_POINT,\n decode: GaiaPointCodec.readPoint\n },\n [GEO_TYPE_POINTZ]: {\n geoType: GEO_TYPE_POINTZ,\n decode: GaiaPointCodec.readPointZ\n }\n};\n\nconst lineCodecs: Record<number, GaiaCodecEntry<MultiLineStringGeometry>> = {\n [GEO_TYPE_MULTILINESTRING]: {\n geoType: GEO_TYPE_MULTILINESTRING,\n decode: GaiaLineCodec.readMultiLineString\n },\n [GEO_TYPE_MULTILINESTRINGZ]: {\n geoType: GEO_TYPE_MULTILINESTRINGZ,\n decode: GaiaLineCodec.readMultiLineStringZ\n }\n};\n\nconst polygonCodecs: Record<number, GaiaCodecEntry<MultiPolygonGeometry>> = {\n [GEO_TYPE_MULTIPOLYGON]: {\n geoType: GEO_TYPE_MULTIPOLYGON,\n decode: GaiaPolygonCodec.readMultiPolygon\n },\n [GEO_TYPE_MULTIPOLYGONZ]: {\n geoType: GEO_TYPE_MULTIPOLYGONZ,\n decode: GaiaPolygonCodec.readMultiPolygonZ\n }\n};\n\nfunction geometryHasZ(\n geometry: Geometry\n): boolean {\n switch (geometry.type) {\n case \"Point\":\n return geometry.coordinates.length === 3;\n case \"MultiLineString\":\n return geometry.coordinates[0]?.[0]?.length === 3;\n case \"MultiPolygon\":\n return geometry.coordinates[0]?.[0]?.[0]?.length === 3;\n case \"Cad\":\n case \"Text\":\n return false;\n default:\n return false;\n }\n}\n\nfunction encodeGeometry(geometry: Geometry, srid: number): Uint8Array {\n switch (geometry.type) {\n case \"Point\":\n return geometryHasZ(geometry)\n ? GaiaPointCodec.writePointZ(geometry, srid)\n : GaiaPointCodec.writePoint(geometry, srid);\n case \"MultiLineString\":\n return geometryHasZ(geometry)\n ? GaiaLineCodec.writeMultiLineStringZ(geometry, srid)\n : GaiaLineCodec.writeMultiLineString(geometry, srid);\n case \"MultiPolygon\":\n return geometryHasZ(geometry)\n ? GaiaPolygonCodec.writeMultiPolygonZ(geometry, srid)\n : GaiaPolygonCodec.writeMultiPolygon(geometry, srid);\n case \"Cad\":\n throw new Error(\"CAD geometry is not supported by GaiaGeometryCodec.\");\n case \"Text\":\n throw new Error(\"Text geometry is not supported by GaiaGeometryCodec.\");\n default:\n throw new Error(`Unsupported geometry type: ${(geometry as Geometry).type}`);\n }\n}\n\nexport class GaiaGeometryCodec {\n static decode(input: Uint8Array): Geometry {\n const header = readGaiaHeader(new BinaryCursor(input));\n const decoder = decodeByGeoType.get(header.geoType);\n\n if (!decoder) {\n throw new GaiaUnsupportedGeoTypeError(header.geoType);\n }\n\n return decoder(input);\n }\n\n static encode(geometry: Geometry, srid: number): Uint8Array {\n return encodeGeometry(geometry, srid);\n }\n}\n","import type {\n Geometry,\n MultiLineStringGeometry,\n MultiPolygonGeometry,\n PointGeometry\n} from \"../../types\";\nimport { GaiaGeometryCodec } from \"../gaia/GaiaGeometryCodec\";\n\ntype JstsGeometry = import(\"jsts/org/locationtech/jts/geom/Geometry\").default;\n\nlet reader: import(\"jsts/org/locationtech/jts/io/GeoJSONReader\").default | null = null;\nlet writer: import(\"jsts/org/locationtech/jts/io/GeoJSONWriter\").default | null = null;\n\nasync function getReader() {\n if (!reader) {\n const { default: GeoJSONReader } = await import(\n \"jsts/org/locationtech/jts/io/GeoJSONReader\"\n );\n const { default: GeometryFactory } = await import(\n \"jsts/org/locationtech/jts/geom/GeometryFactory\"\n );\n reader = new GeoJSONReader(new GeometryFactory());\n }\n return reader;\n}\n\nasync function getWriter() {\n if (!writer) {\n const { default: GeoJSONWriter } = await import(\n \"jsts/org/locationtech/jts/io/GeoJSONWriter\"\n );\n writer = new GeoJSONWriter();\n }\n return writer;\n}\n\nexport async function toJsts(geometry: Geometry): Promise<JstsGeometry> {\n const r = await getReader();\n return r.read(geometry as unknown as Record<string, unknown>);\n}\n\nexport async function fromJsts(jtsGeom: JstsGeometry): Promise<Geometry> {\n const w = await getWriter();\n return w.write(jtsGeom) as unknown as Geometry;\n}\n\nexport async function toJstsPoint(\n geometry: PointGeometry\n): Promise<import(\"jsts/org/locationtech/jts/geom/Point\").default> {\n const r = await getReader();\n return r.read(geometry as unknown as Record<string, unknown>) as import(\"jsts/org/locationtech/jts/geom/Point\").default;\n}\n\nexport async function toJstsMultiLineString(\n geometry: MultiLineStringGeometry\n): Promise<import(\"jsts/org/locationtech/jts/geom/MultiLineString\").default> {\n const r = await getReader();\n return r.read(geometry as unknown as Record<string, unknown>) as import(\"jsts/org/locationtech/jts/geom/MultiLineString\").default;\n}\n\nexport async function toJstsMultiPolygon(\n geometry: MultiPolygonGeometry\n): Promise<import(\"jsts/org/locationtech/jts/geom/MultiPolygon\").default> {\n const r = await getReader();\n return r.read(geometry as unknown as Record<string, unknown>) as import(\"jsts/org/locationtech/jts/geom/MultiPolygon\").default;\n}\n\nexport class JstsGeometryCodec {\n static async decode(input: Uint8Array): Promise<JstsGeometry> {\n const geojson = GaiaGeometryCodec.decode(input);\n return toJsts(geojson);\n }\n\n static async encode(jtsGeom: JstsGeometry, srid: number): Promise<Uint8Array> {\n const geojson = await fromJsts(jtsGeom);\n return GaiaGeometryCodec.encode(geojson, srid);\n }\n}\n"],"mappings":"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","names":["writer","writer","mapRow","statement","GAIA_ENTITY_MARK","is3DCoordinates","writer"]}