xdriver 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/com.js +4 -11
- package/lib/connection.d.ts +37 -0
- package/lib/connection.js +190 -0
- package/lib/const.d.ts +9 -9
- package/lib/const.js +18 -18
- package/lib/database.d.ts +17 -30
- package/lib/database.js +50 -134
- package/lib/index.d.ts +12 -3
- package/lib/index.js +137 -3
- package/lib/table.d.ts +48 -12
- package/lib/table.js +235 -76
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/lib/driver.d.ts +0 -14
- package/lib/driver.js +0 -59
package/lib/com.js
CHANGED
|
@@ -17,13 +17,6 @@ export function _copy(src, target) {
|
|
|
17
17
|
}
|
|
18
18
|
return target;
|
|
19
19
|
}
|
|
20
|
-
var LogLevel;
|
|
21
|
-
(function (LogLevel) {
|
|
22
|
-
LogLevel[LogLevel["debug"] = 0] = "debug";
|
|
23
|
-
LogLevel[LogLevel["warn"] = 1] = "warn";
|
|
24
|
-
LogLevel[LogLevel["info"] = 2] = "info";
|
|
25
|
-
LogLevel[LogLevel["error"] = 3] = "error";
|
|
26
|
-
})(LogLevel || (LogLevel = {}));
|
|
27
20
|
export class Logger {
|
|
28
21
|
constructor(catalog) {
|
|
29
22
|
this.catalog = catalog;
|
|
@@ -40,19 +33,19 @@ export class Logger {
|
|
|
40
33
|
return `[${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}]`;
|
|
41
34
|
}
|
|
42
35
|
debug(msg, ...args) {
|
|
43
|
-
this.print(console.debug, `%c${this.getFormatDate()} [DEBUG] <${this.catalog}> ${msg}`,
|
|
36
|
+
this.print(console.debug, `%c${this.getFormatDate()} [DEBUG] <${this.catalog}> ${msg}`, "color: gray;", ...args);
|
|
44
37
|
}
|
|
45
38
|
warn(msg, ...args) {
|
|
46
|
-
this.print(console.warn, `%c${this.getFormatDate()} [WARN] <${this.catalog}> ${msg}`,
|
|
39
|
+
this.print(console.warn, `%c${this.getFormatDate()} [WARN] <${this.catalog}> ${msg}`, "color: #FFCC00;", ...args);
|
|
47
40
|
}
|
|
48
41
|
info(msg, ...args) {
|
|
49
42
|
this.print(console.info, `${this.getFormatDate()} [INFO] <${this.catalog}> ${msg}`, ...args);
|
|
50
43
|
}
|
|
51
44
|
error(msg, ...args) {
|
|
52
|
-
this.print(console.error, `%c${this.getFormatDate()} [ERROR] <${this.catalog}> ${msg}`,
|
|
45
|
+
this.print(console.error, `%c${this.getFormatDate()} [ERROR] <${this.catalog}> ${msg}`, "color: #EF4444;", ...args);
|
|
53
46
|
}
|
|
54
47
|
success(msg, ...args) {
|
|
55
|
-
this.print(console.log, `%c${this.getFormatDate()} [SUCCESS] <${this.catalog}> ${msg}`,
|
|
48
|
+
this.print(console.log, `%c${this.getFormatDate()} [SUCCESS] <${this.catalog}> ${msg}`, "color: #10B981;", ...args);
|
|
56
49
|
}
|
|
57
50
|
static getLogger(catalog = 'default') {
|
|
58
51
|
return new Logger(catalog);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { IndexdbStatus } from "./const";
|
|
2
|
+
import Table, { ITable, TableMeta } from "./table";
|
|
3
|
+
interface EventMap {
|
|
4
|
+
process: (this: Connection, status: IndexdbStatus) => void;
|
|
5
|
+
success: (this: Connection, connect: IDBDatabase) => void;
|
|
6
|
+
blocked: (this: Connection, event: IDBVersionChangeEvent) => void;
|
|
7
|
+
change: (connect: IDBDatabase, event: IDBVersionChangeEvent) => void;
|
|
8
|
+
error: (evt: Event) => void;
|
|
9
|
+
close: () => void;
|
|
10
|
+
}
|
|
11
|
+
type EventKey = keyof EventMap;
|
|
12
|
+
export default class Connection {
|
|
13
|
+
name: string;
|
|
14
|
+
version: number;
|
|
15
|
+
idbDatabase?: IDBDatabase;
|
|
16
|
+
readonly tableMap: Map<string, Table>;
|
|
17
|
+
private eventMap;
|
|
18
|
+
constructor(database?: string, version?: number);
|
|
19
|
+
on<T extends EventKey>(event: T, handle: EventMap[T]): this;
|
|
20
|
+
get connected(): boolean;
|
|
21
|
+
connect(name?: string, version?: number, upgrade?: (idbDatabase: IDBDatabase, event: IDBVersionChangeEvent) => any): Promise<any>;
|
|
22
|
+
drop(): Promise<Event>;
|
|
23
|
+
close(): void;
|
|
24
|
+
createTable(tableName: string, meta?: Omit<TableMeta, 'name'> & {
|
|
25
|
+
overwrite?: boolean;
|
|
26
|
+
}, idbDatabase?: IDBDatabase): Promise<Table>;
|
|
27
|
+
createTables(tables: Array<string | (TableMeta & {
|
|
28
|
+
overwrite?: boolean;
|
|
29
|
+
})>, meta: (Omit<ITable, "name"> & {
|
|
30
|
+
overwrite?: boolean;
|
|
31
|
+
}) | undefined, idbDatabase: IDBDatabase): Promise<Table[]>;
|
|
32
|
+
dropTable(tableName: string): boolean;
|
|
33
|
+
table(tableName: string): Table;
|
|
34
|
+
exists(table: string): boolean;
|
|
35
|
+
getTables(): Table[];
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { IndexdbStatus, innerDB } from "./const";
|
|
11
|
+
import Table from "./table";
|
|
12
|
+
import { Logger } from './com';
|
|
13
|
+
const logger = Logger.getLogger('Database');
|
|
14
|
+
export default class Connection {
|
|
15
|
+
constructor(database = 'default', version = 1) {
|
|
16
|
+
this.eventMap = {};
|
|
17
|
+
this.name = database;
|
|
18
|
+
this.version = version;
|
|
19
|
+
this.tableMap = new Map();
|
|
20
|
+
}
|
|
21
|
+
on(event, handle) {
|
|
22
|
+
this.eventMap[event] = handle;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
get connected() {
|
|
26
|
+
return this.idbDatabase != void 0;
|
|
27
|
+
}
|
|
28
|
+
connect(name, version, upgrade) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
var _a;
|
|
31
|
+
if ((!name || version == void 0) && this.connected) {
|
|
32
|
+
return Promise.resolve(this);
|
|
33
|
+
}
|
|
34
|
+
this.name = name || this.name;
|
|
35
|
+
this.version = version || this.version;
|
|
36
|
+
logger.debug(`Connect to database ${this.name} ${this.version}`);
|
|
37
|
+
const request = innerDB.open(this.name, version);
|
|
38
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ING);
|
|
39
|
+
request.onblocked = (evt) => {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
logger.warn(`onblocked change from ${evt.oldVersion} to ${evt.newVersion}`, evt);
|
|
42
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
|
|
43
|
+
(_b = this.eventMap.blocked) === null || _b === void 0 ? void 0 : _b.call(this, evt);
|
|
44
|
+
};
|
|
45
|
+
let returnVal = void 0;
|
|
46
|
+
request.onupgradeneeded = (event) => {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
logger.info(`Version change from <${event.oldVersion}> to <${event.newVersion}>`, event);
|
|
49
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.VERSION_CHANGE);
|
|
50
|
+
const target = event.target;
|
|
51
|
+
this.idbDatabase = target.result;
|
|
52
|
+
(_b = this.eventMap.change) === null || _b === void 0 ? void 0 : _b.call(this, this.idbDatabase, event);
|
|
53
|
+
returnVal = upgrade === null || upgrade === void 0 ? void 0 : upgrade(this.idbDatabase, event);
|
|
54
|
+
};
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
request.onerror = (e) => {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
logger.error('onerror', e);
|
|
59
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ERROR);
|
|
60
|
+
(_b = this.eventMap.error) === null || _b === void 0 ? void 0 : _b.call(this, e);
|
|
61
|
+
reject(e);
|
|
62
|
+
};
|
|
63
|
+
request.onsuccess = (e) => {
|
|
64
|
+
var _a, _b;
|
|
65
|
+
logger.debug(`Connect Success`, e);
|
|
66
|
+
const target = e.target;
|
|
67
|
+
let connect = target.result;
|
|
68
|
+
this.idbDatabase = connect;
|
|
69
|
+
let objectStoreNames = connect.objectStoreNames;
|
|
70
|
+
if (objectStoreNames.length) {
|
|
71
|
+
let transaction = connect.transaction(objectStoreNames);
|
|
72
|
+
for (let i = 0; i < objectStoreNames.length; i++) {
|
|
73
|
+
let table = objectStoreNames.item(i);
|
|
74
|
+
if (!table)
|
|
75
|
+
continue;
|
|
76
|
+
let objectStore = transaction.objectStore(table);
|
|
77
|
+
let { indexNames, keyPath: primaryKey, name, autoIncrement = true } = objectStore;
|
|
78
|
+
let indexes = [];
|
|
79
|
+
for (let j = 0; indexNames && j < indexNames.length; j++) {
|
|
80
|
+
let indexName = indexNames.item(j);
|
|
81
|
+
if (!indexName)
|
|
82
|
+
continue;
|
|
83
|
+
let { keyPath, name, multiEntry, unique } = objectStore.index(indexName);
|
|
84
|
+
indexes.push({ name, column: keyPath, unique, multiEntry });
|
|
85
|
+
}
|
|
86
|
+
this.tableMap.set(name, new Table({
|
|
87
|
+
name,
|
|
88
|
+
primaryKey: primaryKey == null ? void 0 : primaryKey,
|
|
89
|
+
autoIncrement,
|
|
90
|
+
indexes
|
|
91
|
+
}, this.idbDatabase));
|
|
92
|
+
}
|
|
93
|
+
transaction.commit();
|
|
94
|
+
}
|
|
95
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_SUCCESS);
|
|
96
|
+
(_b = this.eventMap.success) === null || _b === void 0 ? void 0 : _b.call(this, this.idbDatabase);
|
|
97
|
+
resolve(returnVal || this);
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
drop() {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
let request = innerDB.deleteDatabase(this.name);
|
|
105
|
+
request.onerror = function (event) {
|
|
106
|
+
reject(event);
|
|
107
|
+
};
|
|
108
|
+
request.onsuccess = function (event) {
|
|
109
|
+
resolve(event);
|
|
110
|
+
};
|
|
111
|
+
this.close();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
close() {
|
|
115
|
+
var _a, _b, _c;
|
|
116
|
+
if (this.connected) {
|
|
117
|
+
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
|
|
118
|
+
(_b = this.idbDatabase) === null || _b === void 0 ? void 0 : _b.close();
|
|
119
|
+
(_c = this.eventMap.close) === null || _c === void 0 ? void 0 : _c.call(this);
|
|
120
|
+
this.idbDatabase = void 0;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
createTable(tableName_1) {
|
|
124
|
+
return __awaiter(this, arguments, void 0, function* (tableName, meta = {}, idbDatabase) {
|
|
125
|
+
var _a, _b;
|
|
126
|
+
const { overwrite = false } = meta;
|
|
127
|
+
if (!overwrite && this.exists(tableName)) {
|
|
128
|
+
throw new Error(`Table ${tableName} is exists`);
|
|
129
|
+
}
|
|
130
|
+
const metadata = Object.assign(Object.assign({}, meta), { name: tableName });
|
|
131
|
+
let { name = '', primaryKey = 'id', autoIncrement = true, indexes = [], rows = [] } = metadata;
|
|
132
|
+
const store = (_a = (idbDatabase || this.idbDatabase)) === null || _a === void 0 ? void 0 : _a.createObjectStore(name, { keyPath: primaryKey, autoIncrement });
|
|
133
|
+
let idxes = indexes.map(({ name, column, unique, multiEntry }) => {
|
|
134
|
+
store === null || store === void 0 ? void 0 : store.createIndex(name, column, { unique, multiEntry });
|
|
135
|
+
return { name, column, unique, multiEntry };
|
|
136
|
+
});
|
|
137
|
+
(_b = metadata.rows) === null || _b === void 0 ? void 0 : _b.forEach(row => store === null || store === void 0 ? void 0 : store.add(row));
|
|
138
|
+
let table = new Table({ name, primaryKey, autoIncrement, indexes: idxes }, idbDatabase || this.idbDatabase);
|
|
139
|
+
this.tableMap.set(name, table);
|
|
140
|
+
return table;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
createTables(tables_1) {
|
|
144
|
+
return __awaiter(this, arguments, void 0, function* (tables, meta = {}, idbDatabase) {
|
|
145
|
+
return new Promise((resolve) => {
|
|
146
|
+
const createTables = (idbDatabase) => __awaiter(this, void 0, void 0, function* () {
|
|
147
|
+
let list = yield Promise.all(tables.map(table => {
|
|
148
|
+
if (typeof table === 'string') {
|
|
149
|
+
return this.createTable(table, meta, idbDatabase);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return this.createTable(table.name, Object.assign(Object.assign({}, meta), table), idbDatabase);
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
resolve(list);
|
|
156
|
+
});
|
|
157
|
+
if (idbDatabase) {
|
|
158
|
+
createTables(idbDatabase);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.connect(this.name, ++this.version, createTables);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
dropTable(tableName) {
|
|
167
|
+
var _a;
|
|
168
|
+
if (this.exists(tableName)) {
|
|
169
|
+
(_a = this.idbDatabase) === null || _a === void 0 ? void 0 : _a.deleteObjectStore(tableName);
|
|
170
|
+
this.tableMap.delete(tableName);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
logger.error(`Table ${tableName} is not exists`);
|
|
174
|
+
throw new Error(`Table ${tableName} is not exists`);
|
|
175
|
+
}
|
|
176
|
+
table(tableName) {
|
|
177
|
+
const table = this.tableMap.get(tableName);
|
|
178
|
+
if (!table) {
|
|
179
|
+
logger.error(`Table ${tableName} is not exists`);
|
|
180
|
+
throw new Error(`Table ${tableName} is not exists`);
|
|
181
|
+
}
|
|
182
|
+
return table;
|
|
183
|
+
}
|
|
184
|
+
exists(table) {
|
|
185
|
+
return this.tableMap.has(table);
|
|
186
|
+
}
|
|
187
|
+
getTables() {
|
|
188
|
+
return [...this.tableMap.values()];
|
|
189
|
+
}
|
|
190
|
+
}
|
package/lib/const.d.ts
CHANGED
|
@@ -9,13 +9,13 @@ export declare enum IndexdbStatus {
|
|
|
9
9
|
VERSION_CHANGE = 99
|
|
10
10
|
}
|
|
11
11
|
export declare class KeyRange {
|
|
12
|
-
static leq(
|
|
13
|
-
static lt(
|
|
14
|
-
static geq(
|
|
15
|
-
static gt(
|
|
16
|
-
static between(
|
|
17
|
-
static gt_lt(
|
|
18
|
-
static gt_leq(
|
|
19
|
-
static geq_lt(
|
|
20
|
-
static eq(
|
|
12
|
+
static leq(val: any): IDBKeyRange;
|
|
13
|
+
static lt(val: any): IDBKeyRange;
|
|
14
|
+
static geq(val: any): IDBKeyRange;
|
|
15
|
+
static gt(val: any): IDBKeyRange;
|
|
16
|
+
static between(low: any, upper: any): IDBKeyRange;
|
|
17
|
+
static gt_lt(low: any, upper: any): IDBKeyRange;
|
|
18
|
+
static gt_leq(low: any, upper: any): IDBKeyRange;
|
|
19
|
+
static geq_lt(low: any, upper: any): IDBKeyRange;
|
|
20
|
+
static eq(val: any): IDBKeyRange;
|
|
21
21
|
}
|
package/lib/const.js
CHANGED
|
@@ -11,31 +11,31 @@ export var IndexdbStatus;
|
|
|
11
11
|
IndexdbStatus[IndexdbStatus["VERSION_CHANGE"] = 99] = "VERSION_CHANGE";
|
|
12
12
|
})(IndexdbStatus || (IndexdbStatus = {}));
|
|
13
13
|
export class KeyRange {
|
|
14
|
-
static leq(
|
|
15
|
-
return IDBKeyRange.upperBound(
|
|
14
|
+
static leq(val) {
|
|
15
|
+
return IDBKeyRange.upperBound(val);
|
|
16
16
|
}
|
|
17
|
-
static lt(
|
|
18
|
-
return IDBKeyRange.upperBound(
|
|
17
|
+
static lt(val) {
|
|
18
|
+
return IDBKeyRange.upperBound(val, true);
|
|
19
19
|
}
|
|
20
|
-
static geq(
|
|
21
|
-
return IDBKeyRange.lowerBound(
|
|
20
|
+
static geq(val) {
|
|
21
|
+
return IDBKeyRange.lowerBound(val);
|
|
22
22
|
}
|
|
23
|
-
static gt(
|
|
24
|
-
return IDBKeyRange.lowerBound(
|
|
23
|
+
static gt(val) {
|
|
24
|
+
return IDBKeyRange.lowerBound(val, true);
|
|
25
25
|
}
|
|
26
|
-
static between(
|
|
27
|
-
return IDBKeyRange.bound(
|
|
26
|
+
static between(low, upper) {
|
|
27
|
+
return IDBKeyRange.bound(low, upper);
|
|
28
28
|
}
|
|
29
|
-
static gt_lt(
|
|
30
|
-
return IDBKeyRange.bound(
|
|
29
|
+
static gt_lt(low, upper) {
|
|
30
|
+
return IDBKeyRange.bound(low, upper, true, true);
|
|
31
31
|
}
|
|
32
|
-
static gt_leq(
|
|
33
|
-
return IDBKeyRange.bound(
|
|
32
|
+
static gt_leq(low, upper) {
|
|
33
|
+
return IDBKeyRange.bound(low, upper, true, false);
|
|
34
34
|
}
|
|
35
|
-
static geq_lt(
|
|
36
|
-
return IDBKeyRange.bound(
|
|
35
|
+
static geq_lt(low, upper) {
|
|
36
|
+
return IDBKeyRange.bound(low, upper, false, true);
|
|
37
37
|
}
|
|
38
|
-
static eq(
|
|
39
|
-
return IDBKeyRange.only(
|
|
38
|
+
static eq(val) {
|
|
39
|
+
return IDBKeyRange.only(val);
|
|
40
40
|
}
|
|
41
41
|
}
|
package/lib/database.d.ts
CHANGED
|
@@ -1,31 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import Connection from "./connection";
|
|
2
|
+
import { Row, Pagination, RowPacket } from "./table";
|
|
3
|
+
export default class Database extends Connection {
|
|
4
|
+
query<R extends Row>(table: string, query?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
|
|
5
|
+
select<R extends Row>(table: string, key?: IDBValidKey | IDBKeyRange, index?: string, count?: number): Promise<RowPacket<R>>;
|
|
6
|
+
queryByKey<R extends Row>(table: string, key: IDBValidKey | IDBKeyRange): Promise<RowPacket<R>>;
|
|
7
|
+
queryByIndex<R extends Row>(table: string, indexName: string, key?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
|
|
8
|
+
queryById<R extends Row>(table: string, id: any | Array<any>, indexName?: string): Promise<R>;
|
|
9
|
+
count(table: string, key: IDBValidKey | IDBKeyRange): Promise<number>;
|
|
10
|
+
insert(table: string, data: Array<Record<string, any>>): Promise<IDBValidKey[]>;
|
|
11
|
+
update(table: string, modify: Row, key?: IDBValidKey | IDBKeyRange | null): Promise<IDBValidKey>;
|
|
12
|
+
delete(table: string, key: IDBValidKey | IDBKeyRange): Promise<any[]>;
|
|
13
|
+
truncate(table: string): Promise<void>;
|
|
14
|
+
getPagination<R extends Row>(table: string, pageSize?: number): Promise<Pagination<R>>;
|
|
15
|
+
scan<R extends Row>(table: string, key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection, indexName?: string): Promise<RowPacket<R>>;
|
|
16
|
+
getAllData<R extends Row>(table: string): Promise<Array<R>>;
|
|
17
|
+
paginate<R extends Row>(table: string, pageNo?: number, pageSize?: number, key?: IDBValidKey | IDBKeyRange, indexName?: string): Promise<RowPacket<R>>;
|
|
10
18
|
}
|
|
11
|
-
type EventKey = keyof EventMap;
|
|
12
|
-
export default class Database {
|
|
13
|
-
private name;
|
|
14
|
-
private version;
|
|
15
|
-
database?: IDBDatabase;
|
|
16
|
-
readonly tableMap: Map<string, Table>;
|
|
17
|
-
private eventMap;
|
|
18
|
-
constructor(database: string, version?: number);
|
|
19
|
-
on<T extends EventKey>(event: T, handle: EventMap[T]): this;
|
|
20
|
-
get connected(): boolean;
|
|
21
|
-
connect(name?: string, version?: number): Promise<Database>;
|
|
22
|
-
drop(): Promise<unknown>;
|
|
23
|
-
close(): void;
|
|
24
|
-
createTable(tableName: string, meta?: Omit<Metadata, 'name'>): Table;
|
|
25
|
-
createTables(tables: Array<string>, meta?: Omit<Metadata, 'name' | 'rows'>): Table[];
|
|
26
|
-
dropTable(tableName: string): boolean;
|
|
27
|
-
table(tableName: string): Table | undefined;
|
|
28
|
-
exists(table: string): boolean;
|
|
29
|
-
getTables(): MapIterator<Table>;
|
|
30
|
-
}
|
|
31
|
-
export {};
|
package/lib/database.js
CHANGED
|
@@ -1,146 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
this.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.name = name || this.name;
|
|
25
|
-
this.version = version || this.version;
|
|
26
|
-
const request = innerDB.open(this.name, version);
|
|
27
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ING);
|
|
28
|
-
request.onerror = (e) => {
|
|
29
|
-
var _a, _b;
|
|
30
|
-
logger.error('onerror', e);
|
|
31
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ERROR);
|
|
32
|
-
(_b = this.eventMap.error) === null || _b === void 0 ? void 0 : _b.call(this, e);
|
|
33
|
-
};
|
|
34
|
-
request.onblocked = (evt) => {
|
|
35
|
-
var _a, _b;
|
|
36
|
-
logger.warn(`onblocked change from ${evt.oldVersion} to ${evt.newVersion}`, evt);
|
|
37
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
|
|
38
|
-
(_b = this.eventMap.blocked) === null || _b === void 0 ? void 0 : _b.call(this, evt);
|
|
39
|
-
};
|
|
40
|
-
return new Promise((resolve, reject) => {
|
|
41
|
-
request.onupgradeneeded = (event) => {
|
|
42
|
-
var _a, _b;
|
|
43
|
-
logger.info(`Version change from <${event.oldVersion}> to <${event.newVersion}>`, event);
|
|
44
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.VERSION_CHANGE);
|
|
45
|
-
const target = event.target;
|
|
46
|
-
this.database = target.result;
|
|
47
|
-
(_b = this.eventMap.change) === null || _b === void 0 ? void 0 : _b.call(this, this.database);
|
|
48
|
-
};
|
|
49
|
-
request.onsuccess = (e) => {
|
|
50
|
-
var _a, _b;
|
|
51
|
-
logger.info(`Connect Success`, e);
|
|
52
|
-
const target = e.target;
|
|
53
|
-
let connect = target.result;
|
|
54
|
-
this.database = connect;
|
|
55
|
-
let objectStoreNames = connect.objectStoreNames;
|
|
56
|
-
if (objectStoreNames.length) {
|
|
57
|
-
let transaction = connect.transaction(objectStoreNames);
|
|
58
|
-
for (let i = 0; i < objectStoreNames.length; i++) {
|
|
59
|
-
let table = objectStoreNames.item(i);
|
|
60
|
-
if (!table)
|
|
61
|
-
continue;
|
|
62
|
-
let objectStore = transaction.objectStore(table);
|
|
63
|
-
let { indexNames, keyPath: primaryKey, name, autoIncrement = true } = objectStore;
|
|
64
|
-
let indexes = [];
|
|
65
|
-
for (let j = 0; indexNames && j < indexNames.length; j++) {
|
|
66
|
-
let indexName = indexNames.item(j);
|
|
67
|
-
if (!indexName)
|
|
68
|
-
continue;
|
|
69
|
-
let { keyPath, name, multiEntry, unique } = objectStore.index(indexName);
|
|
70
|
-
indexes.push({ name, column: keyPath, unique, multiEntry });
|
|
71
|
-
}
|
|
72
|
-
this.tableMap.set(name, new Table({ name, primaryKey: primaryKey == null ? void 0 : primaryKey, autoIncrement, indexes }, this.database));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_SUCCESS);
|
|
76
|
-
(_b = this.eventMap.success) === null || _b === void 0 ? void 0 : _b.call(this, this.database);
|
|
77
|
-
resolve(this);
|
|
78
|
-
};
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import Connection from "./connection";
|
|
11
|
+
export default class Database extends Connection {
|
|
12
|
+
query(table, query, count = 1000) {
|
|
13
|
+
return this.table(table).query(query, count);
|
|
14
|
+
}
|
|
15
|
+
select(table, key, index, count = 1000) {
|
|
16
|
+
return this.table(table).select(key, count, index);
|
|
17
|
+
}
|
|
18
|
+
queryByKey(table, key) {
|
|
19
|
+
return this.table(table).queryByKey(key);
|
|
20
|
+
}
|
|
21
|
+
queryByIndex(table, indexName, key, count) {
|
|
22
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
return this.table(table).queryByIndex(indexName, key, count);
|
|
79
24
|
});
|
|
80
25
|
}
|
|
81
|
-
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
request.onerror = function (event) {
|
|
85
|
-
reject(event);
|
|
86
|
-
};
|
|
87
|
-
request.onsuccess = function (event) {
|
|
88
|
-
resolve(event);
|
|
89
|
-
};
|
|
90
|
-
this.close();
|
|
26
|
+
queryById(table, id, indexName) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
return this.table(table).queryById(id, indexName);
|
|
91
29
|
});
|
|
92
30
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (this.connected) {
|
|
96
|
-
(_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
|
|
97
|
-
(_b = this.database) === null || _b === void 0 ? void 0 : _b.close();
|
|
98
|
-
(_c = this.eventMap.close) === null || _c === void 0 ? void 0 : _c.call(this);
|
|
99
|
-
this.database = void 0;
|
|
100
|
-
}
|
|
31
|
+
count(table, key) {
|
|
32
|
+
return this.table(table).count(key);
|
|
101
33
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (this.exists(tableName)) {
|
|
105
|
-
throw new Error(`Table ${tableName} is exists`);
|
|
106
|
-
}
|
|
107
|
-
const metadata = Object.assign(Object.assign({}, meta), { name: tableName });
|
|
108
|
-
let { name = '', primaryKey = 'id', autoIncrement = true, indexes = [], rows = [] } = metadata;
|
|
109
|
-
const store = (_a = this.database) === null || _a === void 0 ? void 0 : _a.createObjectStore(name, { keyPath: primaryKey, autoIncrement });
|
|
110
|
-
let idxes = indexes.map(({ name, column, unique, multiEntry }) => {
|
|
111
|
-
store === null || store === void 0 ? void 0 : store.createIndex(name, column, { unique, multiEntry });
|
|
112
|
-
return { name, column, unique, multiEntry };
|
|
113
|
-
});
|
|
114
|
-
(_b = metadata.rows) === null || _b === void 0 ? void 0 : _b.forEach(row => store === null || store === void 0 ? void 0 : store.add(row));
|
|
115
|
-
let tab = new Table({ name, primaryKey, autoIncrement, indexes: idxes }, this.database);
|
|
116
|
-
this.tableMap.set(name, tab);
|
|
117
|
-
return tab;
|
|
34
|
+
insert(table, data) {
|
|
35
|
+
return this.table(table).insert(data);
|
|
118
36
|
}
|
|
119
|
-
|
|
120
|
-
return
|
|
121
|
-
return this.createTable(table, meta);
|
|
122
|
-
});
|
|
37
|
+
update(table, modify, key) {
|
|
38
|
+
return this.table(table).update(modify, key);
|
|
123
39
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (this.exists(tableName)) {
|
|
127
|
-
(_a = this.database) === null || _a === void 0 ? void 0 : _a.deleteObjectStore(tableName);
|
|
128
|
-
this.tableMap.delete(tableName);
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
return false;
|
|
40
|
+
delete(table, key) {
|
|
41
|
+
return this.table(table).delete(key);
|
|
132
42
|
}
|
|
133
|
-
table
|
|
134
|
-
|
|
135
|
-
if (!table) {
|
|
136
|
-
logger.error(`Table ${tableName} is not exists`);
|
|
137
|
-
}
|
|
138
|
-
return table;
|
|
43
|
+
truncate(table) {
|
|
44
|
+
return this.table(table).truncate();
|
|
139
45
|
}
|
|
140
|
-
|
|
141
|
-
return this.
|
|
46
|
+
getPagination(table, pageSize = 10) {
|
|
47
|
+
return this.table(table).getPagination(pageSize, 1);
|
|
142
48
|
}
|
|
143
|
-
|
|
144
|
-
return this
|
|
49
|
+
scan(table_1, key_1) {
|
|
50
|
+
return __awaiter(this, arguments, void 0, function* (table, key, direction = 'next', indexName) {
|
|
51
|
+
return this.table(table).scan(key, direction, indexName);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
getAllData(table) {
|
|
55
|
+
return this.table(table).getAllData();
|
|
56
|
+
}
|
|
57
|
+
paginate(table_1) {
|
|
58
|
+
return __awaiter(this, arguments, void 0, function* (table, pageNo = 1, pageSize = 10, key, indexName) {
|
|
59
|
+
return this.table(table).paginate(pageNo, pageSize, key, indexName);
|
|
60
|
+
});
|
|
145
61
|
}
|
|
146
62
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { IndexdbStatus, KeyRange } from "./const";
|
|
2
|
-
import Driver from "./driver";
|
|
3
2
|
import Database from "./database";
|
|
4
|
-
import
|
|
5
|
-
|
|
3
|
+
import Connection from "./connection";
|
|
4
|
+
import Table, { TableMeta } from "./table";
|
|
5
|
+
export { IndexdbStatus, KeyRange, Connection, Table };
|
|
6
|
+
declare class Driver {
|
|
7
|
+
private readonly name;
|
|
8
|
+
private version;
|
|
9
|
+
private readonly tables;
|
|
10
|
+
constructor(name: string, version?: number);
|
|
11
|
+
defineTables(...tables: Array<TableMeta>): this;
|
|
12
|
+
private hasChange;
|
|
13
|
+
connect(version?: number): Promise<Database>;
|
|
14
|
+
}
|
|
6
15
|
export default Driver;
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,140 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { IndexdbStatus, innerDB, KeyRange } from "./const";
|
|
3
11
|
import Database from "./database";
|
|
12
|
+
import Connection from "./connection";
|
|
4
13
|
import Table from "./table";
|
|
5
|
-
|
|
14
|
+
import { Logger } from "./com";
|
|
15
|
+
export { IndexdbStatus, KeyRange, Connection, Table };
|
|
16
|
+
const logger = Logger.getLogger("Driver");
|
|
17
|
+
class Driver {
|
|
18
|
+
constructor(name, version = 0) {
|
|
19
|
+
this.tables = [];
|
|
20
|
+
this.name = name;
|
|
21
|
+
this.version = version;
|
|
22
|
+
}
|
|
23
|
+
defineTables(...tables) {
|
|
24
|
+
this.tables.push(...tables);
|
|
25
|
+
logger.debug(`Define tables: ${tables.map(t => t.name).join(', ')}`);
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
hasChange(database) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
var _a;
|
|
31
|
+
const existTables = database.getTables();
|
|
32
|
+
const defineTables = this.tables;
|
|
33
|
+
if (existTables.length !== defineTables.length) {
|
|
34
|
+
logger.warn(`Table count is changed.`);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
let change = false;
|
|
38
|
+
for (let table of defineTables) {
|
|
39
|
+
if (!existTables.some(t => t.name === table.name)) {
|
|
40
|
+
logger.warn(`Table ${table.name} is added, create it.`);
|
|
41
|
+
change = true;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (change) {
|
|
46
|
+
return change;
|
|
47
|
+
}
|
|
48
|
+
for (let existTable of existTables) {
|
|
49
|
+
const tableMeta = defineTables.find(t => t.name === existTable.name);
|
|
50
|
+
if (!tableMeta) {
|
|
51
|
+
logger.warn(`Table ${existTable.name} is removed, drop it.`);
|
|
52
|
+
change = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
let existIndexes = existTable.indexes || [];
|
|
56
|
+
for (let existIndex of existIndexes) {
|
|
57
|
+
const metaIndex = (_a = tableMeta.indexes) === null || _a === void 0 ? void 0 : _a.find(i => i.name === existIndex.name);
|
|
58
|
+
if (!metaIndex) {
|
|
59
|
+
logger.warn(`Table ${existTable.name} index ${existIndex.name} is removed, drop it.`);
|
|
60
|
+
change = true;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (change) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
for (let metaIndex of tableMeta.indexes || []) {
|
|
68
|
+
const index = existIndexes.find(i => i.name === metaIndex.name);
|
|
69
|
+
if (!index) {
|
|
70
|
+
logger.warn(`Table ${existTable.name} index ${metaIndex.name} is added, create it.`);
|
|
71
|
+
change = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (change) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return change;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
connect(version) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
const databases = yield innerDB.databases();
|
|
85
|
+
const existsDB = databases.find(db => db.name === this.name);
|
|
86
|
+
if (existsDB) {
|
|
87
|
+
logger.info(`Database ${this.name} exists`);
|
|
88
|
+
this.version = existsDB.version || this.version;
|
|
89
|
+
}
|
|
90
|
+
if (version) {
|
|
91
|
+
this.version = Math.max(this.version, version);
|
|
92
|
+
}
|
|
93
|
+
logger.debug(`Connect to database ${this.name} ${this.version}`);
|
|
94
|
+
const database = new Database(this.name, this.version);
|
|
95
|
+
database.on('change', (idbDatabase, event) => {
|
|
96
|
+
const existTables = [...idbDatabase.objectStoreNames];
|
|
97
|
+
if (existTables.length) {
|
|
98
|
+
for (let tableName of existTables) {
|
|
99
|
+
let existTable = this.tables.find(t => t.name === tableName);
|
|
100
|
+
if (!existTable) {
|
|
101
|
+
logger.warn(`Table ${tableName} is removed, drop it.`);
|
|
102
|
+
database.dropTable(tableName);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const transaction = event.target.transaction;
|
|
106
|
+
if (!transaction) {
|
|
107
|
+
logger.warn(`Transaction not support`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
let objectStore = transaction.objectStore(tableName);
|
|
111
|
+
if (!objectStore) {
|
|
112
|
+
logger.warn(`Table ${tableName} not exists`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
let { indexNames } = objectStore;
|
|
116
|
+
for (let indexName of indexNames) {
|
|
117
|
+
objectStore.deleteIndex(indexName);
|
|
118
|
+
}
|
|
119
|
+
for (let index of existTable.indexes || []) {
|
|
120
|
+
objectStore.createIndex(index.name, index.column, Object.assign({}, index));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (let table of this.tables) {
|
|
125
|
+
if (existTables.indexOf(table.name) < 0) {
|
|
126
|
+
logger.info(`Table ${table.name} is not exist, create it.`);
|
|
127
|
+
database.createTable(table.name, table);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
yield database.connect();
|
|
132
|
+
if (yield this.hasChange(database)) {
|
|
133
|
+
database.close();
|
|
134
|
+
yield database.connect(this.name, ++this.version);
|
|
135
|
+
}
|
|
136
|
+
return database;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
6
140
|
export default Driver;
|
package/lib/table.d.ts
CHANGED
|
@@ -12,9 +12,43 @@ export type ITable = {
|
|
|
12
12
|
};
|
|
13
13
|
export type Row = Record<string, any>;
|
|
14
14
|
export type Rows = Array<Row>;
|
|
15
|
-
export type
|
|
15
|
+
export type TableMeta = ITable & {
|
|
16
16
|
rows?: Rows;
|
|
17
17
|
};
|
|
18
|
+
export declare class RowPacket<T extends Row> extends Array<T> {
|
|
19
|
+
constructor(rows?: Array<T>);
|
|
20
|
+
distinct(column?: string | ((row: T) => any)): Array<T>;
|
|
21
|
+
mapping<K, T>(keyFn: (row: T, index: number, array: Array<T>) => K): Map<K, T>;
|
|
22
|
+
mapping<K, V>(keyFn: (row: T, index: number, array: Array<T>) => K, valFn: (row: T, index: number, array: Array<T>) => V): Map<K, V>;
|
|
23
|
+
group<K, V>(key: keyof T | ((row: T, index: number, array: Array<T>) => K)): Map<K, Array<T>>;
|
|
24
|
+
group<K, V>(key: keyof T | ((row: T, index: number, array: Array<T>) => K), valFn: (row: T, index: number, array: Array<T>) => V): Map<K, Array<V>>;
|
|
25
|
+
max(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): {
|
|
26
|
+
value: number;
|
|
27
|
+
rows: Array<T>;
|
|
28
|
+
};
|
|
29
|
+
min(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): {
|
|
30
|
+
value: number;
|
|
31
|
+
rows: Array<T>;
|
|
32
|
+
};
|
|
33
|
+
sum(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): number;
|
|
34
|
+
average(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): number;
|
|
35
|
+
}
|
|
36
|
+
export declare class Pagination<T extends Row> {
|
|
37
|
+
private readonly _data;
|
|
38
|
+
private readonly _pageSize;
|
|
39
|
+
private _pageIndex;
|
|
40
|
+
private readonly _total;
|
|
41
|
+
constructor(data: Array<T>, pageSize?: number, pageIndex?: number);
|
|
42
|
+
get totalPage(): number;
|
|
43
|
+
get total(): number;
|
|
44
|
+
get pageIndex(): number;
|
|
45
|
+
get pageSize(): number;
|
|
46
|
+
get hasNext(): boolean;
|
|
47
|
+
get hasPrev(): boolean;
|
|
48
|
+
get data(): Array<any>;
|
|
49
|
+
prev(): boolean;
|
|
50
|
+
next(): boolean;
|
|
51
|
+
}
|
|
18
52
|
export default class Table implements ITable {
|
|
19
53
|
readonly name: string;
|
|
20
54
|
readonly primaryKey: string | string[];
|
|
@@ -22,19 +56,21 @@ export default class Table implements ITable {
|
|
|
22
56
|
readonly indexes: Array<Index>;
|
|
23
57
|
readonly database?: IDBDatabase;
|
|
24
58
|
constructor(table: ITable | string, database?: IDBDatabase);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
59
|
+
get meta(): TableMeta;
|
|
60
|
+
insert(data: Row | Rows): Promise<Array<IDBValidKey>>;
|
|
61
|
+
update(modify: Row, key?: IDBValidKey | IDBKeyRange | null): Promise<IDBValidKey>;
|
|
28
62
|
delete(key: IDBValidKey | IDBKeyRange): Promise<any[]>;
|
|
29
|
-
|
|
63
|
+
truncate(): Promise<void>;
|
|
30
64
|
dropIndex(name: string): void;
|
|
31
65
|
keys(key?: IDBValidKey | IDBKeyRange | null, count?: number): Promise<IDBValidKey[]>;
|
|
32
66
|
count(key?: IDBValidKey | IDBKeyRange): Promise<number>;
|
|
33
|
-
query(key?: IDBValidKey | IDBKeyRange, count?: number): Promise<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
67
|
+
query<R extends Row>(key?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
|
|
68
|
+
queryByIndex<R extends Row>(indexName: string, key?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
|
|
69
|
+
select<R extends Row>(key?: IDBValidKey | IDBKeyRange, count?: number, indexName?: string): Promise<RowPacket<R>>;
|
|
70
|
+
queryByKey<R extends Row>(key: IDBValidKey | IDBKeyRange): Promise<RowPacket<R>>;
|
|
71
|
+
paginate<R extends Row>(pageNo?: number, pageSize?: number, key?: IDBValidKey | IDBKeyRange, indexName?: string): Promise<RowPacket<R>>;
|
|
72
|
+
queryById<R extends Row>(id: any | Array<any>, indexName?: string): Promise<R>;
|
|
73
|
+
scan<R extends Row>(key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection, indexName?: string): Promise<RowPacket<R>>;
|
|
74
|
+
getAllData<R extends Row>(): Promise<Array<R>>;
|
|
75
|
+
getPagination<R extends Row>(pageSize?: number, pageIndex?: number): Promise<Pagination<R>>;
|
|
40
76
|
}
|
package/lib/table.js
CHANGED
|
@@ -7,15 +7,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
10
|
+
import { Logger } from "./com";
|
|
11
|
+
const logger = Logger.getLogger('Table');
|
|
11
12
|
const _getObjectStore = (table, mode = 'readonly') => {
|
|
12
13
|
var _a;
|
|
13
14
|
const trans = (_a = table.database) === null || _a === void 0 ? void 0 : _a.transaction(table.name, mode);
|
|
14
15
|
if (!trans) {
|
|
15
16
|
throw new Error('database not open');
|
|
16
17
|
}
|
|
17
|
-
trans.oncomplete = (
|
|
18
|
-
|
|
18
|
+
trans.oncomplete = (event) => {
|
|
19
|
+
logger.debug(`Table ${table.name} transaction success`, event);
|
|
20
|
+
};
|
|
21
|
+
trans.onerror = (event) => {
|
|
22
|
+
logger.error(`Table ${table.name} transaction error`, event);
|
|
23
|
+
};
|
|
19
24
|
return trans.objectStore(table.name);
|
|
20
25
|
};
|
|
21
26
|
const _request = (request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -28,19 +33,163 @@ const _request = (request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
28
33
|
};
|
|
29
34
|
});
|
|
30
35
|
});
|
|
36
|
+
export class RowPacket extends Array {
|
|
37
|
+
constructor(rows = []) {
|
|
38
|
+
super(...rows);
|
|
39
|
+
}
|
|
40
|
+
distinct(column) {
|
|
41
|
+
if (!column) {
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
let set = new Set();
|
|
45
|
+
return this.filter(row => {
|
|
46
|
+
let union = null;
|
|
47
|
+
if (column !== void 0) {
|
|
48
|
+
union = typeof column === 'function' ? column(row) : row[column];
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
union = row;
|
|
52
|
+
}
|
|
53
|
+
if (!set.has(union)) {
|
|
54
|
+
set.add(union);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
mapping(keyFn, valFn) {
|
|
61
|
+
if (!keyFn)
|
|
62
|
+
throw new Error('Undefined group by field');
|
|
63
|
+
let mapping = new Map();
|
|
64
|
+
this.forEach((item, index, array) => {
|
|
65
|
+
let unionKey = keyFn.call(this, item, index, array);
|
|
66
|
+
if (mapping.has(unionKey)) {
|
|
67
|
+
throw new Error(`${unionKey} duplicate error`);
|
|
68
|
+
}
|
|
69
|
+
mapping.set(unionKey, valFn ? valFn(item, index, array) : item);
|
|
70
|
+
});
|
|
71
|
+
return mapping;
|
|
72
|
+
}
|
|
73
|
+
group(key, valFn) {
|
|
74
|
+
if (!key)
|
|
75
|
+
throw new Error('Undefined group by field');
|
|
76
|
+
let group = new Map();
|
|
77
|
+
this.forEach((item, index, array) => {
|
|
78
|
+
var _a;
|
|
79
|
+
let unionKey = typeof key === 'function' ? key.call(this, item, index, array) : item[key];
|
|
80
|
+
let value = valFn ? valFn(item, index, this) : item;
|
|
81
|
+
if (!group.has(unionKey)) {
|
|
82
|
+
group.set(unionKey, [value]);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
(_a = group.get(unionKey)) === null || _a === void 0 ? void 0 : _a.push(value);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return group;
|
|
89
|
+
}
|
|
90
|
+
max(keyFn) {
|
|
91
|
+
let max = 0;
|
|
92
|
+
let maxRows = [];
|
|
93
|
+
this.forEach((item, index, array) => {
|
|
94
|
+
let unionKey = typeof keyFn === 'function' ? keyFn.call(this, item, index, array) : item[keyFn];
|
|
95
|
+
if (unionKey > max) {
|
|
96
|
+
max = unionKey;
|
|
97
|
+
maxRows = [item];
|
|
98
|
+
}
|
|
99
|
+
else if (unionKey === max) {
|
|
100
|
+
maxRows.push(item);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
value: max,
|
|
105
|
+
rows: maxRows
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
min(keyFn) {
|
|
109
|
+
let min = 0;
|
|
110
|
+
let minRows = [];
|
|
111
|
+
this.forEach((item, index, array) => {
|
|
112
|
+
let unionKey = typeof keyFn === 'function' ? keyFn.call(this, item, index, array) : item[keyFn];
|
|
113
|
+
if (unionKey < min) {
|
|
114
|
+
min = unionKey;
|
|
115
|
+
minRows = [item];
|
|
116
|
+
}
|
|
117
|
+
else if (unionKey === min) {
|
|
118
|
+
minRows.push(item);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
value: min,
|
|
123
|
+
rows: minRows
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
sum(keyFn) {
|
|
127
|
+
return this.reduce((sum, item, index, array) => {
|
|
128
|
+
return sum + (typeof keyFn === 'function' ? keyFn.call(this, item, index, array) : item[keyFn]);
|
|
129
|
+
}, 0);
|
|
130
|
+
}
|
|
131
|
+
average(keyFn) {
|
|
132
|
+
return this.sum(keyFn) / this.length;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export class Pagination {
|
|
136
|
+
constructor(data, pageSize = 10, pageIndex = 1) {
|
|
137
|
+
this._data = data;
|
|
138
|
+
this._pageSize = pageSize < 1 ? 10 : pageSize;
|
|
139
|
+
this._pageIndex = pageIndex < 0 ? 1 : pageIndex;
|
|
140
|
+
this._total = data.length;
|
|
141
|
+
}
|
|
142
|
+
get totalPage() {
|
|
143
|
+
return Math.ceil(this._total / this._pageSize);
|
|
144
|
+
}
|
|
145
|
+
get total() {
|
|
146
|
+
return this._total;
|
|
147
|
+
}
|
|
148
|
+
get pageIndex() {
|
|
149
|
+
return this._pageIndex;
|
|
150
|
+
}
|
|
151
|
+
get pageSize() {
|
|
152
|
+
return this._pageSize;
|
|
153
|
+
}
|
|
154
|
+
get hasNext() {
|
|
155
|
+
return this._pageIndex * this._pageSize < this._total;
|
|
156
|
+
}
|
|
157
|
+
get hasPrev() {
|
|
158
|
+
return this._pageIndex > 1;
|
|
159
|
+
}
|
|
160
|
+
get data() {
|
|
161
|
+
let start = (this._pageIndex - 1) * this._pageSize;
|
|
162
|
+
let end = start + this._pageSize;
|
|
163
|
+
return this._data.slice(start, end);
|
|
164
|
+
}
|
|
165
|
+
prev() {
|
|
166
|
+
if (this.hasPrev) {
|
|
167
|
+
this._pageIndex--;
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
next() {
|
|
173
|
+
if (this.hasNext) {
|
|
174
|
+
this._pageIndex++;
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
31
180
|
export default class Table {
|
|
32
181
|
constructor(table, database) {
|
|
33
182
|
this.primaryKey = "id";
|
|
34
183
|
this.autoIncrement = false;
|
|
35
184
|
this.indexes = [];
|
|
36
|
-
let
|
|
185
|
+
let tableMeta;
|
|
37
186
|
if (typeof table === 'string') {
|
|
38
|
-
|
|
187
|
+
tableMeta = { name: table };
|
|
39
188
|
}
|
|
40
189
|
else {
|
|
41
|
-
|
|
190
|
+
tableMeta = Object.assign({}, table);
|
|
42
191
|
}
|
|
43
|
-
const { name = '', primaryKey = 'id', autoIncrement = true, indexes = [] } =
|
|
192
|
+
const { name = '', primaryKey = 'id', autoIncrement = true, indexes = [] } = tableMeta;
|
|
44
193
|
this.name = name;
|
|
45
194
|
this.primaryKey = primaryKey;
|
|
46
195
|
this.autoIncrement = autoIncrement;
|
|
@@ -49,6 +198,14 @@ export default class Table {
|
|
|
49
198
|
return Object.assign({ unique: false, multiEntry: false }, idx);
|
|
50
199
|
});
|
|
51
200
|
}
|
|
201
|
+
get meta() {
|
|
202
|
+
return {
|
|
203
|
+
name: this.name,
|
|
204
|
+
primaryKey: this.primaryKey,
|
|
205
|
+
autoIncrement: this.autoIncrement,
|
|
206
|
+
indexes: this.indexes
|
|
207
|
+
};
|
|
208
|
+
}
|
|
52
209
|
insert(data) {
|
|
53
210
|
return __awaiter(this, void 0, void 0, function* () {
|
|
54
211
|
const store = _getObjectStore(this, 'readwrite');
|
|
@@ -61,34 +218,12 @@ export default class Table {
|
|
|
61
218
|
return results;
|
|
62
219
|
});
|
|
63
220
|
}
|
|
64
|
-
update(modify, key
|
|
221
|
+
update(modify, key) {
|
|
65
222
|
return __awaiter(this, void 0, void 0, function* () {
|
|
66
223
|
const store = _getObjectStore(this, 'readwrite');
|
|
67
|
-
|
|
68
|
-
return _request(store.put(modify, key));
|
|
69
|
-
}
|
|
70
|
-
let rows = yield _request(store.getAll(key, count));
|
|
71
|
-
rows = _instance(rows, Array) ? rows : [rows];
|
|
72
|
-
let results = [];
|
|
73
|
-
for (let row of rows) {
|
|
74
|
-
let rs = yield _request(store.put(_copy(modify, row)));
|
|
75
|
-
results.push(rs);
|
|
76
|
-
}
|
|
77
|
-
return results;
|
|
224
|
+
return _request(store.put(modify, key));
|
|
78
225
|
});
|
|
79
226
|
}
|
|
80
|
-
merge(row) {
|
|
81
|
-
let { primaryKey } = this;
|
|
82
|
-
let keys = Array.isArray(primaryKey) ? primaryKey : [primaryKey];
|
|
83
|
-
let keyArray = [];
|
|
84
|
-
for (let key of keys) {
|
|
85
|
-
keyArray.push(row[key]);
|
|
86
|
-
}
|
|
87
|
-
if (keyArray.length) {
|
|
88
|
-
return this.update(row, keyArray);
|
|
89
|
-
}
|
|
90
|
-
return this.insert(row);
|
|
91
|
-
}
|
|
92
227
|
delete(key) {
|
|
93
228
|
return __awaiter(this, void 0, void 0, function* () {
|
|
94
229
|
if (!key) {
|
|
@@ -100,7 +235,7 @@ export default class Table {
|
|
|
100
235
|
return rows;
|
|
101
236
|
});
|
|
102
237
|
}
|
|
103
|
-
|
|
238
|
+
truncate() {
|
|
104
239
|
return _request(_getObjectStore(this, 'readwrite').clear());
|
|
105
240
|
}
|
|
106
241
|
dropIndex(name) {
|
|
@@ -113,66 +248,90 @@ export default class Table {
|
|
|
113
248
|
return _request(_getObjectStore(this).count(key));
|
|
114
249
|
}
|
|
115
250
|
query(key, count) {
|
|
116
|
-
return
|
|
251
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
252
|
+
let rows = yield _request(_getObjectStore(this).getAll(key, count));
|
|
253
|
+
return new RowPacket(rows);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
queryByIndex(indexName, key, count) {
|
|
257
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
+
const store = _getObjectStore(this);
|
|
259
|
+
const index = store.index(indexName);
|
|
260
|
+
let rows = yield _request(index.getAll(key || null, count));
|
|
261
|
+
return new RowPacket(rows);
|
|
262
|
+
});
|
|
117
263
|
}
|
|
118
|
-
select(key, count,
|
|
119
|
-
if (!
|
|
264
|
+
select(key, count, indexName) {
|
|
265
|
+
if (!indexName) {
|
|
120
266
|
return this.query(key, count);
|
|
121
267
|
}
|
|
122
|
-
return this.queryByIndex(
|
|
268
|
+
return this.queryByIndex(indexName, key, count);
|
|
123
269
|
}
|
|
124
270
|
queryByKey(key) {
|
|
125
|
-
return _request(_getObjectStore(this).get(key));
|
|
126
|
-
}
|
|
127
|
-
fetch(key, direction) {
|
|
128
271
|
return __awaiter(this, void 0, void 0, function* () {
|
|
272
|
+
let rows = yield _request(_getObjectStore(this).get(key));
|
|
273
|
+
return new RowPacket(rows);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
paginate() {
|
|
277
|
+
return __awaiter(this, arguments, void 0, function* (pageNo = 1, pageSize = 10, key, indexName) {
|
|
129
278
|
const store = _getObjectStore(this);
|
|
130
|
-
let
|
|
131
|
-
|
|
132
|
-
|
|
279
|
+
let request;
|
|
280
|
+
let count = pageSize * pageNo;
|
|
281
|
+
if (indexName) {
|
|
282
|
+
const index = store.index(indexName);
|
|
283
|
+
request = index.getAll(key, count);
|
|
133
284
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
rows.push(cursor.value);
|
|
137
|
-
cursor.continue();
|
|
285
|
+
else {
|
|
286
|
+
request = store.getAll(key, count);
|
|
138
287
|
}
|
|
139
|
-
|
|
288
|
+
let rows = yield _request(request);
|
|
289
|
+
return new RowPacket(rows.slice(pageSize * (pageNo - 1), pageSize * pageNo));
|
|
140
290
|
});
|
|
141
291
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
deplete(key_1) {
|
|
148
|
-
return __awaiter(this, arguments, void 0, function* (key, direction = 'next') {
|
|
149
|
-
const store = _getObjectStore(this, 'readwrite');
|
|
150
|
-
const cursor = yield _request(store.openCursor(key, direction));
|
|
151
|
-
if (!cursor) {
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
let rows = [];
|
|
155
|
-
while (cursor.value) {
|
|
156
|
-
rows.push(cursor.value);
|
|
157
|
-
cursor.continue();
|
|
158
|
-
}
|
|
159
|
-
return rows;
|
|
292
|
+
queryById(id, indexName) {
|
|
293
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
294
|
+
const [result] = yield this.select(IDBKeyRange.only(id), 1, indexName);
|
|
295
|
+
return result;
|
|
160
296
|
});
|
|
161
297
|
}
|
|
162
|
-
|
|
163
|
-
return __awaiter(this, arguments, void 0, function* (
|
|
298
|
+
scan(key_1) {
|
|
299
|
+
return __awaiter(this, arguments, void 0, function* (key, direction = 'next', indexName) {
|
|
164
300
|
const store = _getObjectStore(this);
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return [];
|
|
301
|
+
let request;
|
|
302
|
+
if (!indexName) {
|
|
303
|
+
request = store.openCursor(key, direction);
|
|
169
304
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
rows.push(cursor.value);
|
|
173
|
-
cursor.continue();
|
|
305
|
+
else {
|
|
306
|
+
request = store.index(indexName).openCursor(key, direction);
|
|
174
307
|
}
|
|
175
|
-
return
|
|
308
|
+
return new Promise((resolve, reject) => {
|
|
309
|
+
let packets = new RowPacket([]);
|
|
310
|
+
request.onsuccess = function (event) {
|
|
311
|
+
const req = event.target;
|
|
312
|
+
const cursor = req.result;
|
|
313
|
+
if (cursor) {
|
|
314
|
+
packets.push(cursor.value);
|
|
315
|
+
cursor.continue();
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
resolve(packets);
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
request.onerror = function (event) {
|
|
322
|
+
reject(event);
|
|
323
|
+
};
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
getAllData() {
|
|
328
|
+
const store = _getObjectStore(this);
|
|
329
|
+
return _request(store.getAll());
|
|
330
|
+
}
|
|
331
|
+
getPagination() {
|
|
332
|
+
return __awaiter(this, arguments, void 0, function* (pageSize = 10, pageIndex = 1) {
|
|
333
|
+
const rows = yield this.getAllData();
|
|
334
|
+
return new Pagination(rows, pageSize, pageIndex);
|
|
176
335
|
});
|
|
177
336
|
}
|
|
178
337
|
}
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/com.ts","../src/
|
|
1
|
+
{"root":["../src/com.ts","../src/connection.ts","../src/const.ts","../src/database.ts","../src/index.ts","../src/table.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
package/lib/driver.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import Database from "./database";
|
|
2
|
-
import { Row, Rows } from "./table";
|
|
3
|
-
export default class Driver extends Database {
|
|
4
|
-
insert(table: string, data: Array<Record<string, any>>): Promise<any[]> | undefined;
|
|
5
|
-
query(table: string, query?: IDBValidKey | IDBKeyRange, count?: number): Promise<Rows> | undefined;
|
|
6
|
-
select(table: string, key?: IDBValidKey | IDBKeyRange, index?: string, count?: number): Promise<Rows> | undefined;
|
|
7
|
-
selectByKey(table: string, key: IDBValidKey | IDBKeyRange): Promise<Row> | undefined;
|
|
8
|
-
count(table: string, key: IDBValidKey | IDBKeyRange): Promise<number> | undefined;
|
|
9
|
-
update(table: string, modify: Row, key?: IDBValidKey | IDBKeyRange | null, count?: number): Promise<IDBValidKey> | undefined;
|
|
10
|
-
merge(table: string, row: Row | Rows): Promise<IDBValidKey> | Promise<any[]> | undefined;
|
|
11
|
-
delete(table: string, key: IDBValidKey | IDBKeyRange): Promise<any[]> | undefined;
|
|
12
|
-
truncate(table: string): Promise<undefined> | undefined;
|
|
13
|
-
static connect(database: string, version: number | undefined, initialize: (driver: Driver) => void): Promise<Driver>;
|
|
14
|
-
}
|
package/lib/driver.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import Database from "./database";
|
|
11
|
-
export default class Driver extends Database {
|
|
12
|
-
insert(table, data) {
|
|
13
|
-
var _a;
|
|
14
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.insert(data);
|
|
15
|
-
}
|
|
16
|
-
query(table, query, count = 1000) {
|
|
17
|
-
var _a;
|
|
18
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.query(query, count);
|
|
19
|
-
}
|
|
20
|
-
select(table, key, index, count = 1000) {
|
|
21
|
-
var _a;
|
|
22
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.select(key, count, index);
|
|
23
|
-
}
|
|
24
|
-
selectByKey(table, key) {
|
|
25
|
-
var _a;
|
|
26
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.queryByKey(key);
|
|
27
|
-
}
|
|
28
|
-
count(table, key) {
|
|
29
|
-
var _a;
|
|
30
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.count(key);
|
|
31
|
-
}
|
|
32
|
-
update(table, modify, key, count) {
|
|
33
|
-
var _a;
|
|
34
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.update(modify, key, count);
|
|
35
|
-
}
|
|
36
|
-
merge(table, row) {
|
|
37
|
-
var _a;
|
|
38
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.merge(row);
|
|
39
|
-
}
|
|
40
|
-
delete(table, key) {
|
|
41
|
-
var _a;
|
|
42
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.delete(key);
|
|
43
|
-
}
|
|
44
|
-
truncate(table) {
|
|
45
|
-
var _a;
|
|
46
|
-
return (_a = this.table(table)) === null || _a === void 0 ? void 0 : _a.clear();
|
|
47
|
-
}
|
|
48
|
-
static connect(database_1) {
|
|
49
|
-
return __awaiter(this, arguments, void 0, function* (database, version = 1, initialize) {
|
|
50
|
-
const driver = new Driver(database, version);
|
|
51
|
-
driver.on('change', () => {
|
|
52
|
-
initialize(driver);
|
|
53
|
-
});
|
|
54
|
-
yield driver.connect();
|
|
55
|
-
return driver;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
;
|
|
59
|
-
}
|