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.
package/README.md ADDED
@@ -0,0 +1,250 @@
1
+ # udbx4ts
2
+
3
+ TypeScript UDBX runtime — 在 Web 浏览器和 Electron 中读写 UDBX 空间数据库。
4
+
5
+ ## 概述
6
+
7
+ UDBX 是基于 SQLite 的空间数据库格式,兼容 SpatiaLite 的 GAIA 二进制几何编码。`udbx4ts` 提供纯 TypeScript 实现,支持:
8
+
9
+ - **浏览器**:基于 sql.js (WASM) + OPFS,在 Web Worker 中运行
10
+ - **Electron**:基于 better-sqlite3,在主进程中直接访问
11
+ - **零外部依赖**(核心层),最小化打包体积
12
+
13
+ ## 功能
14
+
15
+ | 功能 | 浏览器 | Electron |
16
+ |------|--------|----------|
17
+ | 打开/创建 UDBX 文件 | OPFS / 内存 | 本地文件 |
18
+ | 数据集 CRUD | Point / Line / Region / Tabular / PointZ / LineZ / RegionZ / Cad | Point / Line / Region / Tabular / PointZ / LineZ / RegionZ / Cad |
19
+ | 流式读取 (AsyncIterable) | 分页代理 | 原生流式 |
20
+ | 批量写入 (prepared statement) | 支持 | 支持 |
21
+ | 几何编解码 (GAIA) | Point / MultiLineString / MultiPolygon | Point / MultiLineString / MultiPolygon |
22
+
23
+ ## 安装
24
+
25
+ ```bash
26
+ npm install udbx4ts
27
+ ```
28
+
29
+ ### 浏览器
30
+
31
+ ```typescript
32
+ import { createBrowserUdbx } from "udbx4ts/web";
33
+ ```
34
+
35
+ 浏览器运行时需要 sql.js WASM,通过 `peerDependency` 声明。
36
+
37
+ ### Electron
38
+
39
+ ```typescript
40
+ import { createElectronUdbx } from "udbx4ts/electron";
41
+ ```
42
+
43
+ Electron 运行时需要 `better-sqlite3`,通过 `peerDependency` 声明。
44
+
45
+ ```bash
46
+ npm install better-sqlite3
47
+ ```
48
+
49
+ ## 快速开始
50
+
51
+ ### 浏览器
52
+
53
+ 1. 创建 Web Worker 并安装运行时:
54
+
55
+ ```typescript
56
+ // worker.ts
57
+ import { installSqliteWasmWorkerRuntime } from "udbx4ts/web";
58
+
59
+ installSqliteWasmWorkerRuntime(self, {
60
+ openTarget: {
61
+ opfsPath: "udbx/workspace.udbx",
62
+ memoryName: "udbx-fallback"
63
+ }
64
+ });
65
+ ```
66
+
67
+ 2. 在主线程中使用:
68
+
69
+ ```typescript
70
+ // main.ts
71
+ import { createBrowserUdbx } from "udbx4ts/web";
72
+
73
+ const worker = new Worker(new URL("./worker.ts", import.meta.url), { type: "module" });
74
+ const ds = await createBrowserUdbx(worker, { kind: "memory" });
75
+
76
+ // 创建点数据集
77
+ const points = await ds.createPointDataset("cities", 4326, [
78
+ { name: "NAME", fieldType: "string", nullable: true }
79
+ ]);
80
+
81
+ // 插入要素
82
+ await points.insert({
83
+ id: 1,
84
+ geometry: { type: "Point", coordinates: [116.4, 39.9], srid: 4326 },
85
+ attributes: { NAME: "Beijing" }
86
+ });
87
+
88
+ // 查询
89
+ const features = await points.list();
90
+ for (const f of features) {
91
+ console.log(f.id, f.geometry.coordinates, f.attributes);
92
+ }
93
+ ```
94
+
95
+ ### Electron
96
+
97
+ ```typescript
98
+ // main process
99
+ import { createElectronUdbx } from "udbx4ts/electron";
100
+
101
+ // 打开已有文件
102
+ const ds = await createElectronUdbx({ path: "/path/to/file.udbx" });
103
+
104
+ // 或创建新文件
105
+ const ds = await createElectronUdbx({ path: "/path/to/new.udbx" }); // 自动创建
106
+
107
+ // 使用 API
108
+ const datasets = await ds.listDatasets();
109
+ const regions = await ds.createRegionDataset("parcels", 4326, [
110
+ { name: "AREA", fieldType: "double", nullable: true }
111
+ ]);
112
+ ```
113
+
114
+ ## API 概览
115
+
116
+ ### UdbxDataSource
117
+
118
+ 数据源入口,管理数据集的创建、打开和列举。
119
+
120
+ ```typescript
121
+ interface UdbxDataSource {
122
+ listDatasets(): Promise<readonly DatasetInfo[]>;
123
+ getDataset(name: string): Promise<UdbxDataset>;
124
+ createPointDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<PointDataset>;
125
+ createLineDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<LineDataset>;
126
+ createRegionDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<RegionDataset>;
127
+ createPointZDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<PointZDataset>;
128
+ createLineZDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<LineZDataset>;
129
+ createRegionZDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<RegionZDataset>;
130
+ createCadDataset(name: string, srid: number, fields?: FieldInfo[]): Promise<CadDataset>;
131
+ createTabularDataset(name: string, fields?: FieldInfo[]): Promise<TabularDataset>;
132
+ close(): Promise<void>;
133
+ }
134
+ ```
135
+
136
+ ### 数据集类型
137
+
138
+ | 类型 | 几何 | Feature 类型 |
139
+ |------|------|-------------|
140
+ | `PointDataset` | Point (GAIA type 1) | `Feature<PointGeometry>` |
141
+ | `LineDataset` | MultiLineString (GAIA type 5) | `Feature<MultiLineStringGeometry>` |
142
+ | `RegionDataset` | MultiPolygon (GAIA type 6) | `Feature<MultiPolygonGeometry>` |
143
+ | `PointZDataset` | Point Z (GAIA type 1 + Z) | `Feature<PointGeometry>` |
144
+ | `LineZDataset` | MultiLineString Z (GAIA type 5 + Z) | `Feature<MultiLineStringGeometry>` |
145
+ | `RegionZDataset` | MultiPolygon Z (GAIA type 6 + Z) | `Feature<MultiPolygonGeometry>` |
146
+ | `CadDataset` | CAD Geometry | `Feature<CadGeometry>` |
147
+ | `TabularDataset` | 无几何 | `TabularRecord` |
148
+
149
+ ### 数据集操作
150
+
151
+ 所有数据集支持:
152
+
153
+ - `getById(id)` — 按 ID 查询单条记录
154
+ - `list(options?)` — 列出记录(支持 limit/offset/filter)
155
+ - `iterate(options?)` — 异步迭代器,流式读取
156
+ - `insert(feature)` — 插入单条记录
157
+ - `insertMany(features)` — 批量插入(使用 prepared statement 优化)
158
+ - `getFields()` — 获取字段元信息
159
+ - `count()` — 获取记录总数
160
+ - `update(id, changes)` — 更新记录(所有数据集类型均支持)
161
+ - `delete(id)` — 删除记录(所有数据集类型均支持)
162
+
163
+ ### 几何类型
164
+
165
+ ```typescript
166
+ interface PointGeometry {
167
+ type: "Point";
168
+ coordinates: [number, number] | [number, number, number];
169
+ }
170
+
171
+ interface MultiLineStringGeometry {
172
+ type: "MultiLineString";
173
+ coordinates: [number, number][][] | [number, number, number][][];
174
+ }
175
+
176
+ interface MultiPolygonGeometry {
177
+ type: "MultiPolygon";
178
+ coordinates: [number, number][][][] | [number, number, number][][][];
179
+ }
180
+ ```
181
+
182
+ ### 字段类型
183
+
184
+ ```typescript
185
+ type FieldType = "boolean" | "byte" | "int16" | "int32" | "int64" | "single" | "double" | "date" | "time" | "datetime" | "binary" | "text" | "ntext" | "geometry";
186
+
187
+ interface FieldInfo {
188
+ name: string;
189
+ fieldType: FieldType;
190
+ nullable: boolean;
191
+ defaultValue?: unknown;
192
+ }
193
+ ```
194
+
195
+ ## 示例
196
+
197
+ - [`examples/browser/`](./examples/browser/) — 浏览器示例(Vite + Web Worker)
198
+ - [`examples/electron/`](./examples/electron/) — Electron 示例(主进程 + IPC)
199
+
200
+ ## 开发
201
+
202
+ ```bash
203
+ # 安装依赖
204
+ pnpm install
205
+
206
+ # 运行测试(99 tests)
207
+ pnpm test
208
+
209
+ # 类型检查
210
+ pnpm typecheck
211
+
212
+ # 构建
213
+ pnpm build
214
+
215
+ # 浏览器示例
216
+ pnpm dev:browser
217
+
218
+ # Electron 示例
219
+ cd examples/electron && npm start
220
+ ```
221
+
222
+ ## 架构
223
+
224
+ ```
225
+ src/
226
+ ├── core/ # 核心层(运行时无关)
227
+ │ ├── dataset/ # 数据集实现(Point/Line/Region/Tabular)
228
+ │ ├── datasource/ # UdbxDataSource 入口
229
+ │ ├── geometry/gaia/ # GAIA 二进制编解码
230
+ │ ├── schema/ # UDBX 元数据表(SmRegister/SmFieldInfo)
231
+ │ ├── sql/ # SqlDriver 接口 + SQL helpers
232
+ │ └── types/ # 类型定义
233
+ ├── shared-runtime/ # 共享 RPC 协议
234
+ ├── runtime-browser/ # 浏览器运行时(sql.js + OPFS + Worker)
235
+ └── runtime-electron/ # Electron 运行时(better-sqlite3)
236
+ ```
237
+
238
+ ## License
239
+
240
+ Private
241
+
242
+ ## udbx4spec 规范合规
243
+
244
+ 本项目严格遵循 `udbx4spec/` 中定义的跨语言规范。关键约束:
245
+
246
+ - **API 命名**:所有公开 API 必须与 `udbx4spec/docs/01-naming-conventions.md` 对齐
247
+ - **数据模型**:几何模型必须符合 `udbx4spec/docs/02-geometry-model.md`
248
+ - **数据集类型**:`DatasetKind` 枚举值必须与 `udbx4spec/docs/03-dataset-taxonomy.md` 同步
249
+ - **字段类型**:`FieldType` 枚举值必须与 `udbx4spec/docs/04-field-taxonomy.md` 同步(14 种)
250
+ - **变更流程**:任何 API 变更、新增数据集类型或字段类型,必须先在 udbx4spec 中定义,然后在各语言实现中同步
@@ -0,0 +1,387 @@
1
+ type DatasetKind = "point" | "line" | "region" | "tabular" | "pointZ" | "lineZ" | "regionZ" | "text" | "cad";
2
+
3
+ interface DatasetInfo {
4
+ readonly id: number;
5
+ readonly name: string;
6
+ readonly kind: DatasetKind;
7
+ readonly tableName: string;
8
+ readonly srid: number | null;
9
+ readonly objectCount: number;
10
+ readonly geometryType: number | null;
11
+ }
12
+
13
+ interface GeometryBase {
14
+ readonly srid?: number;
15
+ readonly bbox?: readonly [number, number, number, number];
16
+ readonly hasZ?: boolean;
17
+ readonly geoType?: number;
18
+ }
19
+ interface PointGeometry extends GeometryBase {
20
+ readonly type: "Point";
21
+ readonly coordinates: [number, number] | [number, number, number];
22
+ }
23
+ interface MultiLineStringGeometry extends GeometryBase {
24
+ readonly type: "MultiLineString";
25
+ readonly coordinates: ReadonlyArray<ReadonlyArray<readonly [number, number]>> | ReadonlyArray<ReadonlyArray<readonly [number, number, number]>>;
26
+ }
27
+ interface MultiPolygonGeometry extends GeometryBase {
28
+ readonly type: "MultiPolygon";
29
+ readonly coordinates: ReadonlyArray<ReadonlyArray<ReadonlyArray<readonly [number, number]>>> | ReadonlyArray<ReadonlyArray<ReadonlyArray<readonly [number, number, number]>>>;
30
+ }
31
+ interface CadGeometry extends GeometryBase {
32
+ readonly type: "Cad";
33
+ readonly coordinates: readonly number[];
34
+ }
35
+ interface TextGeometry extends GeometryBase {
36
+ readonly type: "Text";
37
+ readonly text: string;
38
+ readonly x: number;
39
+ readonly y: number;
40
+ readonly rotation?: number;
41
+ }
42
+ type Geometry = PointGeometry | MultiLineStringGeometry | MultiPolygonGeometry | CadGeometry | TextGeometry;
43
+
44
+ interface Feature<TGeometry extends Geometry = Geometry, TAttributes extends Record<string, unknown> = Record<string, unknown>> {
45
+ readonly id: number;
46
+ readonly geometry: TGeometry;
47
+ readonly attributes: TAttributes;
48
+ }
49
+
50
+ type FieldType = "boolean" | "byte" | "int16" | "int32" | "int64" | "single" | "double" | "date" | "binary" | "geometry" | "char" | "ntext" | "text" | "time";
51
+
52
+ interface FieldInfo {
53
+ readonly name: string;
54
+ readonly fieldType: FieldType;
55
+ readonly alias?: string;
56
+ readonly required?: boolean;
57
+ readonly nullable?: boolean;
58
+ readonly defaultValue?: unknown;
59
+ }
60
+
61
+ interface QueryOptions {
62
+ readonly ids?: readonly number[];
63
+ readonly limit?: number;
64
+ readonly offset?: number;
65
+ }
66
+
67
+ interface TabularRecord<TAttributes extends Record<string, unknown> = Record<string, unknown>> {
68
+ readonly id: number;
69
+ readonly attributes: TAttributes;
70
+ }
71
+
72
+ type SqlValue = null | string | number | bigint | Uint8Array | ArrayBuffer;
73
+ type SqlOpenTarget = {
74
+ readonly kind: "file";
75
+ readonly path: string;
76
+ } | {
77
+ readonly kind: "buffer";
78
+ readonly data: Uint8Array;
79
+ } | {
80
+ readonly kind: "opfs";
81
+ readonly path: string;
82
+ } | {
83
+ readonly kind: "memory";
84
+ readonly name?: string;
85
+ };
86
+ interface SqlStatement {
87
+ bind(params?: readonly SqlValue[]): Promise<void>;
88
+ step(): Promise<boolean>;
89
+ getRow<T = Record<string, unknown>>(): Promise<T>;
90
+ reset(): Promise<void>;
91
+ finalize(): Promise<void>;
92
+ }
93
+ interface SqlDriver {
94
+ open(target: SqlOpenTarget): Promise<void>;
95
+ close(): Promise<void>;
96
+ exec(sql: string): Promise<void>;
97
+ prepare(sql: string): Promise<SqlStatement>;
98
+ transaction<T>(operation: () => Promise<T>): Promise<T>;
99
+ }
100
+
101
+ declare class SmFieldInfoRepository {
102
+ private readonly driver;
103
+ constructor(driver: SqlDriver);
104
+ findByDatasetId(datasetId: number): Promise<readonly FieldInfo[]>;
105
+ insertAll(datasetId: number, fields: readonly FieldInfo[]): Promise<void>;
106
+ }
107
+
108
+ interface Dataset {
109
+ readonly info: DatasetInfo;
110
+ getFields(): Promise<readonly FieldInfo[]>;
111
+ }
112
+ interface ReadableDataset<TFeature extends Feature = Feature> extends Dataset {
113
+ getById(id: number): Promise<TFeature | null>;
114
+ list(options?: QueryOptions): Promise<readonly TFeature[]>;
115
+ iterate(options?: QueryOptions): AsyncIterable<TFeature>;
116
+ count(): Promise<number>;
117
+ }
118
+ interface WritableDataset<TFeature extends Feature = Feature> extends ReadableDataset<TFeature> {
119
+ insert(feature: TFeature): Promise<void>;
120
+ insertMany(features: Iterable<TFeature> | AsyncIterable<TFeature>): Promise<void>;
121
+ update(id: number, changes: {
122
+ geometry?: TFeature["geometry"];
123
+ attributes?: Partial<TFeature["attributes"]>;
124
+ }): Promise<void>;
125
+ delete(id: number): Promise<void>;
126
+ }
127
+
128
+ declare abstract class BaseDataset implements Dataset {
129
+ protected readonly driver: SqlDriver;
130
+ readonly info: DatasetInfo;
131
+ protected readonly fieldInfoRepository: SmFieldInfoRepository;
132
+ constructor(driver: SqlDriver, info: DatasetInfo);
133
+ getFields(): Promise<readonly FieldInfo[]>;
134
+ }
135
+
136
+ type CadFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = {
137
+ readonly id: number;
138
+ readonly geometry: CadGeometry;
139
+ readonly attributes: TAttributes;
140
+ };
141
+ declare class CadDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<CadFeature<TAttributes>> {
142
+ getById(): Promise<CadFeature<TAttributes> | null>;
143
+ list(): Promise<readonly CadFeature<TAttributes>[]>;
144
+ iterate(): AsyncIterable<CadFeature<TAttributes>>;
145
+ count(): Promise<number>;
146
+ insert(): Promise<void>;
147
+ insertMany(): Promise<void>;
148
+ update(): Promise<void>;
149
+ delete(): Promise<void>;
150
+ }
151
+
152
+ declare class SmRegisterRepository {
153
+ private readonly driver;
154
+ constructor(driver: SqlDriver);
155
+ findAll(): Promise<readonly DatasetInfo[]>;
156
+ findByName(name: string): Promise<DatasetInfo | null>;
157
+ nextDatasetId(): Promise<number>;
158
+ insert(params: {
159
+ readonly name: string;
160
+ readonly kind: DatasetKind;
161
+ readonly srid: number;
162
+ readonly idColumnName: string;
163
+ readonly geometryColumnName: string | null;
164
+ }): Promise<number>;
165
+ incrementObjectCount(datasetId: number, geometrySize?: number): Promise<void>;
166
+ incrementObjectCountBatch(datasetId: number, count: number, maxGeometrySize: number): Promise<void>;
167
+ decrementObjectCount(datasetId: number): Promise<void>;
168
+ }
169
+
170
+ type LineFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<MultiLineStringGeometry, TAttributes>;
171
+ declare class LineDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<LineFeature<TAttributes>> {
172
+ private readonly registerRepository;
173
+ constructor(driver: SqlDriver, info: DatasetInfo);
174
+ getById(id: number): Promise<LineFeature<TAttributes> | null>;
175
+ list(options?: QueryOptions): Promise<readonly LineFeature<TAttributes>[]>;
176
+ iterate(options?: QueryOptions): AsyncIterable<LineFeature<TAttributes>>;
177
+ insert(feature: LineFeature<TAttributes>): Promise<void>;
178
+ insertMany(features: Iterable<LineFeature<TAttributes>> | AsyncIterable<LineFeature<TAttributes>>): Promise<void>;
179
+ count(): Promise<number>;
180
+ update(id: number, changes: {
181
+ geometry?: MultiLineStringGeometry;
182
+ attributes?: Partial<TAttributes>;
183
+ }): Promise<void>;
184
+ delete(id: number): Promise<void>;
185
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
186
+ readonly name: string;
187
+ readonly srid: number;
188
+ readonly fields?: readonly FieldInfo[];
189
+ }): Promise<LineDataset>;
190
+ }
191
+
192
+ type LineZFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<MultiLineStringGeometry, TAttributes>;
193
+ declare class LineZDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<LineZFeature<TAttributes>> {
194
+ private readonly registerRepository;
195
+ constructor(driver: SqlDriver, info: DatasetInfo);
196
+ getById(id: number): Promise<LineZFeature<TAttributes> | null>;
197
+ list(options?: QueryOptions): Promise<readonly LineZFeature<TAttributes>[]>;
198
+ iterate(options?: QueryOptions): AsyncIterable<LineZFeature<TAttributes>>;
199
+ count(): Promise<number>;
200
+ insert(feature: LineZFeature<TAttributes>): Promise<void>;
201
+ insertMany(features: Iterable<LineZFeature<TAttributes>> | AsyncIterable<LineZFeature<TAttributes>>): Promise<void>;
202
+ update(id: number, changes: {
203
+ geometry?: MultiLineStringGeometry;
204
+ attributes?: Partial<TAttributes>;
205
+ }): Promise<void>;
206
+ delete(id: number): Promise<void>;
207
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
208
+ readonly name: string;
209
+ readonly srid: number;
210
+ readonly fields?: readonly FieldInfo[];
211
+ }): Promise<LineZDataset>;
212
+ }
213
+
214
+ type PointFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<PointGeometry, TAttributes>;
215
+ declare class PointDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<PointFeature<TAttributes>> {
216
+ private readonly registerRepository;
217
+ constructor(driver: SqlDriver, info: DatasetInfo);
218
+ getById(id: number): Promise<PointFeature<TAttributes> | null>;
219
+ list(options?: QueryOptions): Promise<readonly PointFeature<TAttributes>[]>;
220
+ iterate(options?: QueryOptions): AsyncIterable<PointFeature<TAttributes>>;
221
+ insert(feature: PointFeature<TAttributes>): Promise<void>;
222
+ insertMany(features: Iterable<PointFeature<TAttributes>> | AsyncIterable<PointFeature<TAttributes>>): Promise<void>;
223
+ count(): Promise<number>;
224
+ update(id: number, changes: {
225
+ geometry?: PointGeometry;
226
+ attributes?: Partial<TAttributes>;
227
+ }): Promise<void>;
228
+ delete(id: number): Promise<void>;
229
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
230
+ readonly name: string;
231
+ readonly srid: number;
232
+ readonly fields?: readonly FieldInfo[];
233
+ }): Promise<PointDataset>;
234
+ }
235
+
236
+ type PointZFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<PointGeometry, TAttributes>;
237
+ declare class PointZDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<PointZFeature<TAttributes>> {
238
+ private readonly registerRepository;
239
+ constructor(driver: SqlDriver, info: DatasetInfo);
240
+ getById(id: number): Promise<PointZFeature<TAttributes> | null>;
241
+ list(options?: QueryOptions): Promise<readonly PointZFeature<TAttributes>[]>;
242
+ iterate(options?: QueryOptions): AsyncIterable<PointZFeature<TAttributes>>;
243
+ count(): Promise<number>;
244
+ insert(feature: PointZFeature<TAttributes>): Promise<void>;
245
+ insertMany(features: Iterable<PointZFeature<TAttributes>> | AsyncIterable<PointZFeature<TAttributes>>): Promise<void>;
246
+ update(id: number, changes: {
247
+ geometry?: PointGeometry;
248
+ attributes?: Partial<TAttributes>;
249
+ }): Promise<void>;
250
+ delete(id: number): Promise<void>;
251
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
252
+ readonly name: string;
253
+ readonly srid: number;
254
+ readonly fields?: readonly FieldInfo[];
255
+ }): Promise<PointZDataset>;
256
+ }
257
+
258
+ type RegionFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<MultiPolygonGeometry, TAttributes>;
259
+ declare class RegionDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<RegionFeature<TAttributes>> {
260
+ private readonly registerRepository;
261
+ constructor(driver: SqlDriver, info: DatasetInfo);
262
+ getById(id: number): Promise<RegionFeature<TAttributes> | null>;
263
+ list(options?: QueryOptions): Promise<readonly RegionFeature<TAttributes>[]>;
264
+ iterate(options?: QueryOptions): AsyncIterable<RegionFeature<TAttributes>>;
265
+ insert(feature: RegionFeature<TAttributes>): Promise<void>;
266
+ insertMany(features: Iterable<RegionFeature<TAttributes>> | AsyncIterable<RegionFeature<TAttributes>>): Promise<void>;
267
+ count(): Promise<number>;
268
+ update(id: number, changes: {
269
+ geometry?: MultiPolygonGeometry;
270
+ attributes?: Partial<TAttributes>;
271
+ }): Promise<void>;
272
+ delete(id: number): Promise<void>;
273
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
274
+ readonly name: string;
275
+ readonly srid: number;
276
+ readonly fields?: readonly FieldInfo[];
277
+ }): Promise<RegionDataset>;
278
+ }
279
+
280
+ type RegionZFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = Feature<MultiPolygonGeometry, TAttributes>;
281
+ declare class RegionZDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<RegionZFeature<TAttributes>> {
282
+ private readonly registerRepository;
283
+ constructor(driver: SqlDriver, info: DatasetInfo);
284
+ getById(id: number): Promise<RegionZFeature<TAttributes> | null>;
285
+ list(options?: QueryOptions): Promise<readonly RegionZFeature<TAttributes>[]>;
286
+ iterate(options?: QueryOptions): AsyncIterable<RegionZFeature<TAttributes>>;
287
+ count(): Promise<number>;
288
+ insert(feature: RegionZFeature<TAttributes>): Promise<void>;
289
+ insertMany(features: Iterable<RegionZFeature<TAttributes>> | AsyncIterable<RegionZFeature<TAttributes>>): Promise<void>;
290
+ update(id: number, changes: {
291
+ geometry?: MultiPolygonGeometry;
292
+ attributes?: Partial<TAttributes>;
293
+ }): Promise<void>;
294
+ delete(id: number): Promise<void>;
295
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
296
+ readonly name: string;
297
+ readonly srid: number;
298
+ readonly fields?: readonly FieldInfo[];
299
+ }): Promise<RegionZDataset>;
300
+ }
301
+
302
+ interface TabularDatasetReadable {
303
+ readonly info: DatasetInfo;
304
+ getFields(): Promise<readonly FieldInfo[]>;
305
+ getById(id: number): Promise<TabularRecord | null>;
306
+ list(options?: QueryOptions): Promise<readonly TabularRecord[]>;
307
+ iterate(options?: QueryOptions): AsyncIterable<TabularRecord>;
308
+ count(): Promise<number>;
309
+ }
310
+ interface TabularDatasetWritable extends TabularDatasetReadable {
311
+ insert(record: TabularRecord): Promise<void>;
312
+ insertMany(records: Iterable<TabularRecord> | AsyncIterable<TabularRecord>): Promise<void>;
313
+ update(id: number, attributes: Record<string, unknown>): Promise<void>;
314
+ delete(id: number): Promise<void>;
315
+ }
316
+ declare class TabularDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements TabularDatasetWritable {
317
+ private readonly registerRepository;
318
+ constructor(driver: SqlDriver, info: DatasetInfo);
319
+ getById(id: number): Promise<TabularRecord<TAttributes> | null>;
320
+ list(options?: QueryOptions): Promise<readonly TabularRecord<TAttributes>[]>;
321
+ iterate(options?: QueryOptions): AsyncIterable<TabularRecord<TAttributes>>;
322
+ count(): Promise<number>;
323
+ insert(record: TabularRecord<TAttributes>): Promise<void>;
324
+ insertMany(records: Iterable<TabularRecord<TAttributes>> | AsyncIterable<TabularRecord<TAttributes>>): Promise<void>;
325
+ update(id: number, attributes: Record<string, unknown>): Promise<void>;
326
+ delete(id: number): Promise<void>;
327
+ static create(driver: SqlDriver, registerRepository: SmRegisterRepository, params: {
328
+ readonly name: string;
329
+ readonly fields?: readonly FieldInfo[];
330
+ }): Promise<TabularDataset>;
331
+ }
332
+
333
+ type TextFeature<TAttributes extends Record<string, unknown> = Record<string, unknown>> = {
334
+ readonly id: number;
335
+ readonly geometry: TextGeometry;
336
+ readonly attributes: TAttributes;
337
+ };
338
+ /**
339
+ * 文本数据集实现(DatasetKind="text")。
340
+ *
341
+ * <p>对应白皮书 §3.1.5(文本数据集)。
342
+ *
343
+ * <p><b>TODO:</b> GeoText 二进制编解码器待实现。
344
+ */
345
+ declare class TextDataset<TAttributes extends Record<string, unknown> = Record<string, unknown>> extends BaseDataset implements WritableDataset<TextFeature<TAttributes>> {
346
+ getById(): Promise<TextFeature<TAttributes> | null>;
347
+ list(_options?: QueryOptions): Promise<readonly TextFeature<TAttributes>[]>;
348
+ iterate(_options?: QueryOptions): AsyncIterable<TextFeature<TAttributes>>;
349
+ count(): Promise<number>;
350
+ insert(): Promise<void>;
351
+ insertMany(): Promise<void>;
352
+ update(): Promise<void>;
353
+ delete(): Promise<void>;
354
+ }
355
+
356
+ type UdbxRuntime = "browser" | "electron" | "unknown";
357
+ type UdbxDataset = PointDataset | PointZDataset | LineDataset | LineZDataset | RegionDataset | RegionZDataset | TabularDataset | TextDataset | CadDataset;
358
+ declare class UdbxDataSource {
359
+ private readonly driver;
360
+ readonly runtime: UdbxRuntime;
361
+ private readonly registerRepository;
362
+ constructor(driver: SqlDriver, runtime?: UdbxRuntime);
363
+ static open(params: {
364
+ readonly driver: SqlDriver;
365
+ readonly target: SqlOpenTarget;
366
+ readonly runtime?: UdbxRuntime;
367
+ }): Promise<UdbxDataSource>;
368
+ static create(params: {
369
+ readonly driver: SqlDriver;
370
+ readonly target: SqlOpenTarget;
371
+ readonly runtime?: UdbxRuntime;
372
+ }): Promise<UdbxDataSource>;
373
+ listDatasets(): Promise<readonly DatasetInfo[]>;
374
+ getDataset(name: string): Promise<UdbxDataset | null>;
375
+ createPointDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<PointDataset>;
376
+ createLineDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<LineDataset>;
377
+ createRegionDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<RegionDataset>;
378
+ createPointZDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<PointZDataset>;
379
+ createLineZDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<LineZDataset>;
380
+ createRegionZDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<RegionZDataset>;
381
+ createTabularDataset(name: string, fields?: readonly FieldInfo[]): Promise<TabularDataset>;
382
+ createTextDataset(name: string, srid: number, fields?: readonly FieldInfo[]): Promise<TextDataset>;
383
+ createCadDataset(name: string, fields?: readonly FieldInfo[]): Promise<CadDataset>;
384
+ close(): Promise<void>;
385
+ }
386
+
387
+ export { type TabularRecord as A, BaseDataset as B, CadDataset as C, type DatasetKind as D, TextDataset as E, type FieldType as F, type Geometry as G, type TextFeature as H, type TextGeometry as I, type UdbxDataset as J, type UdbxRuntime as K, LineDataset as L, type MultiLineStringGeometry as M, type PointGeometry as P, type QueryOptions as Q, type ReadableDataset as R, type SqlDriver as S, TabularDataset as T, UdbxDataSource as U, type WritableDataset as W, type MultiPolygonGeometry as a, type CadFeature as b, type CadGeometry as c, type Dataset as d, type DatasetInfo as e, type Feature as f, type FieldInfo as g, type GeometryBase as h, type LineFeature as i, LineZDataset as j, type LineZFeature as k, PointDataset as l, type PointFeature as m, PointZDataset as n, type PointZFeature as o, RegionDataset as p, type RegionFeature as q, RegionZDataset as r, type RegionZFeature as s, SmFieldInfoRepository as t, SmRegisterRepository as u, type SqlOpenTarget as v, type SqlStatement as w, type SqlValue as x, type TabularDatasetReadable as y, type TabularDatasetWritable as z };