velocious 1.0.705 → 1.0.707
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/build/database/drivers/sqlite/index.native.js +57 -30
- package/build/database/drivers/sqlite/native-query-gate.js +73 -0
- package/build/database/record/auditing.js +16 -4
- package/build/database/record/index.js +3 -2
- package/build/src/database/drivers/sqlite/index.native.d.ts +5 -8
- package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.native.js +49 -30
- package/build/src/database/drivers/sqlite/native-query-gate.d.ts +54 -0
- package/build/src/database/drivers/sqlite/native-query-gate.d.ts.map +1 -0
- package/build/src/database/drivers/sqlite/native-query-gate.js +65 -0
- package/build/src/database/record/auditing.d.ts +4 -1
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +14 -5
- package/build/src/database/record/index.d.ts +8 -2
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +4 -3
- package/package.json +1 -1
- package/src/database/drivers/sqlite/index.native.js +57 -30
- package/src/database/drivers/sqlite/native-query-gate.js +73 -0
- package/src/database/record/auditing.js +16 -4
- package/src/database/record/index.js +3 -2
|
@@ -7,29 +7,17 @@ import query from "./query"
|
|
|
7
7
|
// @ts-expect-error
|
|
8
8
|
import * as SQLite from "expo-sqlite"
|
|
9
9
|
|
|
10
|
-
import Mutex from "epic-locks/build/mutex.js"
|
|
11
|
-
|
|
12
10
|
import Base from "./base.js"
|
|
11
|
+
import {nativeDatabaseMutex, runNativeOperation} from "./native-query-gate.js"
|
|
13
12
|
|
|
14
13
|
export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
15
|
-
/**
|
|
16
|
-
* Serializes native queries so concurrent `getAllAsync` calls never race
|
|
17
|
-
* `expo-sqlite`'s shared `NativeStatement` objects (a single connection
|
|
18
|
-
* prepares/executes/finalizes one statement at a time).
|
|
19
|
-
* @type {Mutex}
|
|
20
|
-
*/
|
|
21
|
-
_queryMutex = new Mutex()
|
|
22
|
-
|
|
23
14
|
async connect() {
|
|
24
15
|
const {isBrowser, isNative, isServer} = envSense()
|
|
25
16
|
|
|
26
17
|
if (!isNative) throw new Error(`SQLite native driver running inside non-native environment: ${JSON.stringify({isBrowser, isNative, isServer})}`)
|
|
27
18
|
|
|
28
19
|
const args = this.getArgs()
|
|
29
|
-
|
|
30
|
-
if (!args.name) throw new Error("No name given for SQLite Native")
|
|
31
|
-
|
|
32
|
-
const databaseName = args.name
|
|
20
|
+
const databaseName = this._databaseName()
|
|
33
21
|
|
|
34
22
|
if (args.reset) {
|
|
35
23
|
try {
|
|
@@ -43,7 +31,9 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
43
31
|
}
|
|
44
32
|
}
|
|
45
33
|
|
|
46
|
-
|
|
34
|
+
// expo-sqlite caches native databases by name. A shared cache means closing
|
|
35
|
+
// one driver's handle closes every other driver's handle for that database.
|
|
36
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, {useNewConnection: true})
|
|
47
37
|
await this.registerVersion()
|
|
48
38
|
}
|
|
49
39
|
|
|
@@ -64,14 +54,31 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
64
54
|
return connectArgs
|
|
65
55
|
}
|
|
66
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Returns the configured SQLite database name.
|
|
59
|
+
* @returns {string} - Database name.
|
|
60
|
+
*/
|
|
61
|
+
_databaseName() {
|
|
62
|
+
const databaseName = this.getArgs().name
|
|
63
|
+
|
|
64
|
+
if (!databaseName) throw new Error("No name given for SQLite Native")
|
|
65
|
+
|
|
66
|
+
return databaseName
|
|
67
|
+
}
|
|
68
|
+
|
|
67
69
|
async _close() {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
const databaseName = this._databaseName()
|
|
71
|
+
|
|
72
|
+
await nativeDatabaseMutex(databaseName).sync(async () => {
|
|
73
|
+
const connection = this.connection
|
|
74
|
+
|
|
75
|
+
this.connection = undefined
|
|
76
|
+
await connection?.closeAsync()
|
|
77
|
+
})
|
|
70
78
|
}
|
|
71
79
|
|
|
72
80
|
async deleteDatabaseStorage() {
|
|
73
|
-
const databaseName = this.
|
|
74
|
-
if (!databaseName) throw new Error("No name given for SQLite Native")
|
|
81
|
+
const databaseName = this._databaseName()
|
|
75
82
|
try {
|
|
76
83
|
await SQLite.deleteDatabaseAsync(databaseName)
|
|
77
84
|
} catch (error) {
|
|
@@ -86,15 +93,24 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
86
93
|
* @returns {Promise<Record<string, ReturnType<typeof JSON.parse>>[]>} - Query result rows.
|
|
87
94
|
*/
|
|
88
95
|
async _queryActual(sql, options = {}) {
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
const databaseName = this._databaseName()
|
|
97
|
+
|
|
98
|
+
return await runNativeOperation({
|
|
99
|
+
databaseName,
|
|
100
|
+
getConnection: () => this.connection,
|
|
101
|
+
reopenConnection: async () => {
|
|
102
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, {useNewConnection: true})
|
|
103
|
+
|
|
104
|
+
return this.connection
|
|
105
|
+
},
|
|
106
|
+
operation: async (connection) => {
|
|
107
|
+
if (options.sqliteScript) {
|
|
108
|
+
await connection.execAsync(sql)
|
|
109
|
+
return []
|
|
110
|
+
}
|
|
91
111
|
|
|
92
|
-
|
|
93
|
-
await this.connection.execAsync(sql)
|
|
94
|
-
return []
|
|
112
|
+
return await query(connection, sql)
|
|
95
113
|
}
|
|
96
|
-
|
|
97
|
-
return await query(this.connection, sql)
|
|
98
114
|
})
|
|
99
115
|
}
|
|
100
116
|
|
|
@@ -104,10 +120,21 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
104
120
|
* @returns {Promise<number>} - Affected row count.
|
|
105
121
|
*/
|
|
106
122
|
async _affectedRowsActual(sql) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
123
|
+
const databaseName = this._databaseName()
|
|
124
|
+
|
|
125
|
+
return await runNativeOperation({
|
|
126
|
+
databaseName,
|
|
127
|
+
getConnection: () => this.connection,
|
|
128
|
+
reopenConnection: async () => {
|
|
129
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, {useNewConnection: true})
|
|
130
|
+
|
|
131
|
+
return this.connection
|
|
132
|
+
},
|
|
133
|
+
operation: async (connection) => {
|
|
134
|
+
const result = await connection.runAsync(sql)
|
|
135
|
+
|
|
136
|
+
return result.changes
|
|
137
|
+
}
|
|
111
138
|
})
|
|
112
139
|
}
|
|
113
140
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import Mutex from "epic-locks/build/mutex.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {object} NativeSqliteConnection
|
|
7
|
+
* @property {(sql: string) => Promise<Array<Record<string, ReturnType<typeof JSON.parse>>>>} getAllAsync - Reads rows.
|
|
8
|
+
* @property {(sql: string) => Promise<{changes: number}>} runAsync - Runs a mutation.
|
|
9
|
+
* @property {(sql: string) => Promise<void>} execAsync - Executes a SQL script.
|
|
10
|
+
* @property {() => Promise<void>} closeAsync - Closes the native connection.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** @type {Map<string, Mutex>} */
|
|
14
|
+
const mutexesByDatabaseName = new Map()
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Returns the process-wide native query gate for one SQLite database name.
|
|
18
|
+
* expo-sqlite caches native databases by name, so a gate scoped to a driver
|
|
19
|
+
* instance is not enough: two drivers on the same database can still release
|
|
20
|
+
* each other's shared `NativeStatement` objects.
|
|
21
|
+
* @param {string} databaseName - SQLite database name.
|
|
22
|
+
* @returns {Mutex} Mutex serializing native calls for that database.
|
|
23
|
+
*/
|
|
24
|
+
export function nativeDatabaseMutex(databaseName) {
|
|
25
|
+
let mutex = mutexesByDatabaseName.get(databaseName)
|
|
26
|
+
|
|
27
|
+
if (!mutex) {
|
|
28
|
+
mutex = new Mutex()
|
|
29
|
+
mutexesByDatabaseName.set(databaseName, mutex)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return mutex
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Whether an expo-sqlite error means the native database/statement was released.
|
|
37
|
+
* @param {unknown} error - Thrown error.
|
|
38
|
+
* @returns {boolean} Whether the error is the native-handle lifetime failure.
|
|
39
|
+
*/
|
|
40
|
+
export function isNativeHandleError(error) {
|
|
41
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
42
|
+
const causeMessage = error instanceof Error && error.cause instanceof Error ? error.cause.message : ""
|
|
43
|
+
const text = `${message} ${causeMessage}`
|
|
44
|
+
|
|
45
|
+
return /NativeStatement\.runAsync|NativeDatabase\.prepareAsync/.test(text) && /NullPointerException|already released/.test(text)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Runs one native operation under the per-database gate, reopening once when
|
|
50
|
+
* expo-sqlite reports the shared native handle was released.
|
|
51
|
+
* @template T
|
|
52
|
+
* @param {object} args - Operation args.
|
|
53
|
+
* @param {string} args.databaseName - SQLite database name.
|
|
54
|
+
* @param {() => NativeSqliteConnection | undefined} args.getConnection - Current connection getter.
|
|
55
|
+
* @param {() => Promise<NativeSqliteConnection>} args.reopenConnection - Opens a fresh native connection.
|
|
56
|
+
* @param {(connection: NativeSqliteConnection) => Promise<T>} args.operation - Operation to run.
|
|
57
|
+
* @returns {Promise<T>} Operation result.
|
|
58
|
+
*/
|
|
59
|
+
export async function runNativeOperation({databaseName, getConnection, reopenConnection, operation}) {
|
|
60
|
+
return await nativeDatabaseMutex(databaseName).sync(async () => {
|
|
61
|
+
const connection = getConnection()
|
|
62
|
+
|
|
63
|
+
if (!connection) throw new Error("Not connected yet")
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
return await operation(connection)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (!isNativeHandleError(error)) throw error
|
|
69
|
+
|
|
70
|
+
return await operation(await reopenConnection())
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
@@ -420,14 +420,18 @@ function modelParamKey(modelClass) {
|
|
|
420
420
|
* Table detection and relationship registration happen lazily on first usage.
|
|
421
421
|
* Called synchronously from Model.audited() at module-load time.
|
|
422
422
|
* @param {AuditedModelClass} modelClass - Model class to audit.
|
|
423
|
+
* @param {{except?: string[]}} [options] - Audit options: `except` lists attribute names never written to the audit trail (e.g. high-frequency telemetry columns).
|
|
423
424
|
* @returns {void}
|
|
424
425
|
*/
|
|
425
|
-
function registerAuditing(modelClass) {
|
|
426
|
+
function registerAuditing(modelClass, options = {}) {
|
|
426
427
|
if (Object.prototype.hasOwnProperty.call(modelClass, "_auditLifecycleCallbacksRegistered") && modelClass._auditLifecycleCallbacksRegistered) {
|
|
427
428
|
return
|
|
428
429
|
}
|
|
429
430
|
|
|
430
|
-
|
|
431
|
+
const auditableModelClass = /** @type {AuditedModelClass & {_auditExcludedAttributes?: Set<string>}} */ (modelClass)
|
|
432
|
+
|
|
433
|
+
auditableModelClass._auditLifecycleCallbacksRegistered = true
|
|
434
|
+
auditableModelClass._auditExcludedAttributes = new Set(options.except || [])
|
|
431
435
|
registerAuditRelationship(modelClass)
|
|
432
436
|
modelClass.beforeCreate("captureCreateAuditChanges")
|
|
433
437
|
modelClass.afterCreate("createCreateAudit")
|
|
@@ -801,10 +805,18 @@ function auditChangesForCurrentChanges(record) {
|
|
|
801
805
|
const changes = record.changes()
|
|
802
806
|
/** @type {AuditChanges} */
|
|
803
807
|
const auditedChanges = {}
|
|
804
|
-
const
|
|
808
|
+
const modelClass = /** @type {AuditedModelClass & {_auditExcludedAttributes?: Set<string>}} */ (record.getModelClass())
|
|
809
|
+
const columnNameToAttributeName = modelClass.getColumnNameToAttributeNameMap()
|
|
810
|
+
const excludedAttributes = modelClass._auditExcludedAttributes
|
|
805
811
|
|
|
806
812
|
for (const [attributeName, change] of Object.entries(changes)) {
|
|
807
|
-
|
|
813
|
+
const auditedAttributeName = columnNameToAttributeName[attributeName] || attributeName
|
|
814
|
+
|
|
815
|
+
if (excludedAttributes && (excludedAttributes.has(auditedAttributeName) || excludedAttributes.has(attributeName))) {
|
|
816
|
+
continue
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
auditedChanges[auditedAttributeName] = change[1]
|
|
808
820
|
}
|
|
809
821
|
|
|
810
822
|
return auditedChanges
|
|
@@ -734,10 +734,11 @@ class VelociousDatabaseRecord {
|
|
|
734
734
|
|
|
735
735
|
/**
|
|
736
736
|
* Enables automatic create/update/destroy auditing for this model.
|
|
737
|
+
* @param {{except?: string[]}} [options] - Audit options: `except` lists attribute names that must never be written to the audit trail. Use it for high-frequency telemetry columns (heartbeats, progress counters) whose write volume turns the audit table into a deadlock partner for the parent row.
|
|
737
738
|
* @returns {void}
|
|
738
739
|
*/
|
|
739
|
-
static audited() {
|
|
740
|
-
registerAuditing(this)
|
|
740
|
+
static audited(options = {}) {
|
|
741
|
+
registerAuditing(this, options)
|
|
741
742
|
}
|
|
742
743
|
|
|
743
744
|
/**
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import Mutex from "epic-locks/build/mutex.js";
|
|
2
1
|
import Base from "./base.js";
|
|
3
2
|
export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
4
3
|
connection: any;
|
|
5
|
-
/**
|
|
6
|
-
* Serializes native queries so concurrent `getAllAsync` calls never race
|
|
7
|
-
* `expo-sqlite`'s shared `NativeStatement` objects (a single connection
|
|
8
|
-
* prepares/executes/finalizes one statement at a time).
|
|
9
|
-
* @type {Mutex}
|
|
10
|
-
*/
|
|
11
|
-
_queryMutex: Mutex;
|
|
12
4
|
connect(): Promise<void>;
|
|
13
5
|
connectArgs(): Record<string, any>;
|
|
6
|
+
/**
|
|
7
|
+
* Returns the configured SQLite database name.
|
|
8
|
+
* @returns {string} - Database name.
|
|
9
|
+
*/
|
|
10
|
+
_databaseName(): string;
|
|
14
11
|
_close(): Promise<void>;
|
|
15
12
|
deleteDatabaseStorage(): Promise<void>;
|
|
16
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/sqlite/index.native.js"],"names":[],"mappings":"AASA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/sqlite/index.native.js"],"names":[],"mappings":"AASA,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,CAAC,OAAO,OAAO,oCAAqC,SAAQ,IAAI;IAuB7D,UAAU;IAtBX,OAAO,kBAwBZ;IAED,WAAW,wBAeV;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAQlB;IAEK,MAAM,kBASX;IAEK,qBAAqB,kBAO1B;IAED;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAJX,MAIW,EAAE,OAAO,AAH5B,CACA,EADQ,OAAO,YAAY,EAAE,YAGI,GAFvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAsBpE;IAED;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAHlB,MAGkB,GAFhB,OAAO,CAAC,MAAM,CAAC,CAmB3B;CACF"}
|
|
@@ -4,24 +4,15 @@ import envSense from "env-sense/build/use-env-sense.js";
|
|
|
4
4
|
import query from "./query";
|
|
5
5
|
// @ts-expect-error
|
|
6
6
|
import * as SQLite from "expo-sqlite";
|
|
7
|
-
import Mutex from "epic-locks/build/mutex.js";
|
|
8
7
|
import Base from "./base.js";
|
|
8
|
+
import { nativeDatabaseMutex, runNativeOperation } from "./native-query-gate.js";
|
|
9
9
|
export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
10
|
-
/**
|
|
11
|
-
* Serializes native queries so concurrent `getAllAsync` calls never race
|
|
12
|
-
* `expo-sqlite`'s shared `NativeStatement` objects (a single connection
|
|
13
|
-
* prepares/executes/finalizes one statement at a time).
|
|
14
|
-
* @type {Mutex}
|
|
15
|
-
*/
|
|
16
|
-
_queryMutex = new Mutex();
|
|
17
10
|
async connect() {
|
|
18
11
|
const { isBrowser, isNative, isServer } = envSense();
|
|
19
12
|
if (!isNative)
|
|
20
13
|
throw new Error(`SQLite native driver running inside non-native environment: ${JSON.stringify({ isBrowser, isNative, isServer })}`);
|
|
21
14
|
const args = this.getArgs();
|
|
22
|
-
|
|
23
|
-
throw new Error("No name given for SQLite Native");
|
|
24
|
-
const databaseName = args.name;
|
|
15
|
+
const databaseName = this._databaseName();
|
|
25
16
|
if (args.reset) {
|
|
26
17
|
try {
|
|
27
18
|
await SQLite.deleteDatabaseAsync(databaseName);
|
|
@@ -35,7 +26,9 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
35
26
|
}
|
|
36
27
|
}
|
|
37
28
|
}
|
|
38
|
-
|
|
29
|
+
// expo-sqlite caches native databases by name. A shared cache means closing
|
|
30
|
+
// one driver's handle closes every other driver's handle for that database.
|
|
31
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, { useNewConnection: true });
|
|
39
32
|
await this.registerVersion();
|
|
40
33
|
}
|
|
41
34
|
connectArgs() {
|
|
@@ -53,14 +46,26 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
53
46
|
connectArgs["user"] = args["username"];
|
|
54
47
|
return connectArgs;
|
|
55
48
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Returns the configured SQLite database name.
|
|
51
|
+
* @returns {string} - Database name.
|
|
52
|
+
*/
|
|
53
|
+
_databaseName() {
|
|
61
54
|
const databaseName = this.getArgs().name;
|
|
62
55
|
if (!databaseName)
|
|
63
56
|
throw new Error("No name given for SQLite Native");
|
|
57
|
+
return databaseName;
|
|
58
|
+
}
|
|
59
|
+
async _close() {
|
|
60
|
+
const databaseName = this._databaseName();
|
|
61
|
+
await nativeDatabaseMutex(databaseName).sync(async () => {
|
|
62
|
+
const connection = this.connection;
|
|
63
|
+
this.connection = undefined;
|
|
64
|
+
await connection?.closeAsync();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async deleteDatabaseStorage() {
|
|
68
|
+
const databaseName = this._databaseName();
|
|
64
69
|
try {
|
|
65
70
|
await SQLite.deleteDatabaseAsync(databaseName);
|
|
66
71
|
}
|
|
@@ -76,14 +81,21 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
76
81
|
* @returns {Promise<Record<string, ReturnType<typeof JSON.parse>>[]>} - Query result rows.
|
|
77
82
|
*/
|
|
78
83
|
async _queryActual(sql, options = {}) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
const databaseName = this._databaseName();
|
|
85
|
+
return await runNativeOperation({
|
|
86
|
+
databaseName,
|
|
87
|
+
getConnection: () => this.connection,
|
|
88
|
+
reopenConnection: async () => {
|
|
89
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, { useNewConnection: true });
|
|
90
|
+
return this.connection;
|
|
91
|
+
},
|
|
92
|
+
operation: async (connection) => {
|
|
93
|
+
if (options.sqliteScript) {
|
|
94
|
+
await connection.execAsync(sql);
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
return await query(connection, sql);
|
|
85
98
|
}
|
|
86
|
-
return await query(this.connection, sql);
|
|
87
99
|
});
|
|
88
100
|
}
|
|
89
101
|
/**
|
|
@@ -92,12 +104,19 @@ export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
|
92
104
|
* @returns {Promise<number>} - Affected row count.
|
|
93
105
|
*/
|
|
94
106
|
async _affectedRowsActual(sql) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
const databaseName = this._databaseName();
|
|
108
|
+
return await runNativeOperation({
|
|
109
|
+
databaseName,
|
|
110
|
+
getConnection: () => this.connection,
|
|
111
|
+
reopenConnection: async () => {
|
|
112
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName, { useNewConnection: true });
|
|
113
|
+
return this.connection;
|
|
114
|
+
},
|
|
115
|
+
operation: async (connection) => {
|
|
116
|
+
const result = await connection.runAsync(sql);
|
|
117
|
+
return result.changes;
|
|
118
|
+
}
|
|
100
119
|
});
|
|
101
120
|
}
|
|
102
121
|
}
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL2luZGV4Lm5hdGl2ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sUUFBUSxNQUFNLGtDQUFrQyxDQUFBO0FBRXZELG1CQUFtQjtBQUNuQixPQUFPLEtBQUssTUFBTSxTQUFTLENBQUE7QUFFM0IsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRXJDLE9BQU8sS0FBSyxNQUFNLDJCQUEyQixDQUFBO0FBRTdDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLG9DQUFxQyxTQUFRLElBQUk7SUFDcEU7Ozs7O09BS0c7SUFDSCxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUV6QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxHQUFHLFFBQVEsRUFBRSxDQUFBO1FBRWxELElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFaEosTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUVsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBRTlCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dC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QUMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO1FBQ3ZCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBlbnZTZW5zZSBmcm9tIFwiZW52LXNlbnNlL2J1aWxkL3VzZS1lbnYtc2Vuc2UuanNcIlxuXG4vLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgcXVlcnkgZnJvbSBcIi4vcXVlcnlcIlxuXG4vLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgKiBhcyBTUUxpdGUgZnJvbSBcImV4cG8tc3FsaXRlXCJcblxuaW1wb3J0IE11dGV4IGZyb20gXCJlcGljLWxvY2tzL2J1aWxkL211dGV4LmpzXCJcblxuaW1wb3J0IEJhc2UgZnJvbSBcIi4vYmFzZS5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc1NxbGl0ZU5hdGl2ZSBleHRlbmRzIEJhc2Uge1xuICAvKipcbiAgICogU2VyaWFsaXplcyBuYXRpdmUgcXVlcmllcyBzbyBjb25jdXJyZW50IGBnZXRBbGxBc3luY2AgY2FsbHMgbmV2ZXIgcmFjZVxuICAgKiBgZXhwby1zcWxpdGVgJ3Mgc2hhcmVkIGBOYXRpdmVTdGF0ZW1lbnRgIG9iamVjdHMgKGEgc2luZ2xlIGNvbm5lY3Rpb25cbiAgICogcHJlcGFyZXMvZXhlY3V0ZXMvZmluYWxpemVzIG9uZSBzdGF0ZW1lbnQgYXQgYSB0aW1lKS5cbiAgICogQHR5cGUge011dGV4fVxuICAgKi9cbiAgX3F1ZXJ5TXV0ZXggPSBuZXcgTXV0ZXgoKVxuXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgY29uc3Qge2lzQnJvd3NlciwgaXNOYXRpdmUsIGlzU2VydmVyfSA9IGVudlNlbnNlKClcblxuICAgIGlmICghaXNOYXRpdmUpIHRocm93IG5ldyBFcnJvcihgU1FMaXRlIG5hdGl2ZSBkcml2ZXIgcnVubmluZyBpbnNpZGUgbm9uLW5hdGl2ZSBlbnZpcm9ubWVudDogJHtKU09OLnN0cmluZ2lmeSh7aXNCcm93c2VyLCBpc05hdGl2ZSwgaXNTZXJ2ZXJ9KX1gKVxuXG4gICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0QXJncygpXG5cbiAgICBpZiAoIWFyZ3MubmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gbmFtZSBnaXZlbiBmb3IgU1FMaXRlIE5hdGl2ZVwiKVxuXG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gYXJncy5uYW1lXG5cbiAgICBpZiAoYXJncy5yZXNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgU1FMaXRlLmRlbGV0ZURhdGFiYXNlQXN5bmMoZGF0YWJhc2VOYW1lKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5tYXRjaCgvRGF0YWJhc2UgJyguKyknIG5vdCBmb3VuZC8pKSB7XG4gICAgICAgICAgLy8gSWdub3JlIG5vdCBmb3VuZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhd2FpdCBTUUxpdGUub3BlbkRhdGFiYXNlQXN5bmMoZGF0YWJhc2VOYW1lKVxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWZXJzaW9uKClcbiAgfVxuXG4gIGNvbm5lY3RBcmdzKCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldEFyZ3MoKVxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgYXJncy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IGNvbm5lY3RBcmdzID0ge31cbiAgICBjb25zdCBmb3J3YXJkID0gW1wiZGF0YWJhc2VcIiwgXCJob3N0XCIsIFwicGFzc3dvcmRcIl1cblxuICAgIGZvciAoY29uc3QgZm9yd2FyZFZhbHVlIG9mIGZvcndhcmQpIHtcbiAgICAgIGlmIChmb3J3YXJkVmFsdWUgaW4gYXJncykgY29ubmVjdEFyZ3NbZm9yd2FyZFZhbHVlXSA9IGRpZ2coYXJncywgZm9yd2FyZFZhbHVlKVxuICAgIH1cblxuICAgIGlmIChcInVzZXJuYW1lXCIgaW4gYXJncykgY29ubmVjdEFyZ3NbXCJ1c2VyXCJdID0gYXJnc1tcInVzZXJuYW1lXCJdXG5cbiAgICByZXR1cm4gY29ubmVjdEFyZ3NcbiAgfVxuXG4gIGFzeW5jIF9jbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uY2xvc2VBc3luYygpXG4gICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkXG4gIH1cblxuICBhc3luYyBkZWxldGVEYXRhYmFzZVN0b3JhZ2UoKSB7XG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gdGhpcy5nZXRBcmdzKCkubmFtZVxuICAgIGlmICghZGF0YWJhc2VOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuYW1lIGdpdmVuIGZvciBTUUxpdGUgTmF0aXZlXCIpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNRTGl0ZS5kZWxldGVEYXRhYmFzZUFzeW5jKGRhdGFiYXNlTmFtZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLm1hdGNoKC9EYXRhYmFzZSAnKC4rKScgbm90IGZvdW5kLykpKSB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IGFjdHVhbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnN9IFtvcHRpb25zXSAtIFF1ZXJ5IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PltdPn0gLSBRdWVyeSByZXN1bHQgcm93cy5cbiAgICovXG4gIGFzeW5jIF9xdWVyeUFjdHVhbChzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9xdWVyeU11dGV4LnN5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgeWV0XCIpXG5cbiAgICAgIGlmIChvcHRpb25zLnNxbGl0ZVNjcmlwdCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uZXhlY0FzeW5jKHNxbClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeSh0aGlzLmNvbm5lY3Rpb24sIHNxbClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgbXV0YXRpb24gd2l0aCBhZmZlY3RlZC1yb3cgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBNdXRhdGlvbiBTUUwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gQWZmZWN0ZWQgcm93IGNvdW50LlxuICAgKi9cbiAgYXN5bmMgX2FmZmVjdGVkUm93c0FjdHVhbChzcWwpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcXVlcnlNdXRleC5zeW5jKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkIHlldFwiKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJ1bkFzeW5jKHNxbClcbiAgICAgIHJldHVybiByZXN1bHQuY2hhbmdlc1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL2luZGV4Lm5hdGl2ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sUUFBUSxNQUFNLGtDQUFrQyxDQUFBO0FBRXZELG1CQUFtQjtBQUNuQixPQUFPLEtBQUssTUFBTSxTQUFTLENBQUE7QUFFM0IsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRXJDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5RSxNQUFNLENBQUMsT0FBTyxPQUFPLG9DQUFxQyxTQUFRLElBQUk7SUFDcEUsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQTtRQUVsRCxJQUFJLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWhKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFekMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDaEQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxL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IGZyb20gXCJlbnYtc2Vuc2UvYnVpbGQvdXNlLWVudi1zZW5zZS5qc1wiXG5cbi8vIEB0cy1leHBlY3QtZXJyb3JcbmltcG9ydCBxdWVyeSBmcm9tIFwiLi9xdWVyeVwiXG5cbi8vIEB0cy1leHBlY3QtZXJyb3JcbmltcG9ydCAqIGFzIFNRTGl0ZSBmcm9tIFwiZXhwby1zcWxpdGVcIlxuXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi9iYXNlLmpzXCJcbmltcG9ydCB7bmF0aXZlRGF0YWJhc2VNdXRleCwgcnVuTmF0aXZlT3BlcmF0aW9ufSBmcm9tIFwiLi9uYXRpdmUtcXVlcnktZ2F0ZS5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc1NxbGl0ZU5hdGl2ZSBleHRlbmRzIEJhc2Uge1xuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IHtpc0Jyb3dzZXIsIGlzTmF0aXZlLCBpc1NlcnZlcn0gPSBlbnZTZW5zZSgpXG5cbiAgICBpZiAoIWlzTmF0aXZlKSB0aHJvdyBuZXcgRXJyb3IoYFNRTGl0ZSBuYXRpdmUgZHJpdmVyIHJ1bm5pbmcgaW5zaWRlIG5vbi1uYXRpdmUgZW52aXJvbm1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoe2lzQnJvd3NlciwgaXNOYXRpdmUsIGlzU2VydmVyfSl9YClcblxuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldEFyZ3MoKVxuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHRoaXMuX2RhdGFiYXNlTmFtZSgpXG5cbiAgICBpZiAoYXJncy5yZXNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgU1FMaXRlLmRlbGV0ZURhdGFiYXNlQXN5bmMoZGF0YWJhc2VOYW1lKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5tYXRjaCgvRGF0YWJhc2UgJyguKyknIG5vdCBmb3VuZC8pKSB7XG4gICAgICAgICAgLy8gSWdub3JlIG5vdCBmb3VuZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBvLXNxbGl0ZSBjYWNoZXMgbmF0aXZlIGRhdGFiYXNlcyBieSBuYW1lLiBBIHNoYXJlZCBjYWNoZSBtZWFucyBjbG9zaW5nXG4gICAgLy8gb25lIGRyaXZlcidzIGhhbmRsZSBjbG9zZXMgZXZlcnkgb3RoZXIgZHJpdmVyJ3MgaGFuZGxlIGZvciB0aGF0IGRhdGFiYXNlLlxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGF3YWl0IFNRTGl0ZS5vcGVuRGF0YWJhc2VBc3luYyhkYXRhYmFzZU5hbWUsIHt1c2VOZXdDb25uZWN0aW9uOiB0cnVlfSlcbiAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmVyc2lvbigpXG4gIH1cblxuICBjb25uZWN0QXJncygpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5nZXRBcmdzKClcbiAgICAvKipcbiAgICAgKiBDb25uZWN0IGFyZ3MuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjb25uZWN0QXJncyA9IHt9XG4gICAgY29uc3QgZm9yd2FyZCA9IFtcImRhdGFiYXNlXCIsIFwiaG9zdFwiLCBcInBhc3N3b3JkXCJdXG5cbiAgICBmb3IgKGNvbnN0IGZvcndhcmRWYWx1ZSBvZiBmb3J3YXJkKSB7XG4gICAgICBpZiAoZm9yd2FyZFZhbHVlIGluIGFyZ3MpIGNvbm5lY3RBcmdzW2ZvcndhcmRWYWx1ZV0gPSBkaWdnKGFyZ3MsIGZvcndhcmRWYWx1ZSlcbiAgICB9XG5cbiAgICBpZiAoXCJ1c2VybmFtZVwiIGluIGFyZ3MpIGNvbm5lY3RBcmdzW1widXNlclwiXSA9IGFyZ3NbXCJ1c2VybmFtZVwiXVxuXG4gICAgcmV0dXJuIGNvbm5lY3RBcmdzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJlZCBTUUxpdGUgZGF0YWJhc2UgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBEYXRhYmFzZSBuYW1lLlxuICAgKi9cbiAgX2RhdGFiYXNlTmFtZSgpIHtcbiAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSB0aGlzLmdldEFyZ3MoKS5uYW1lXG5cbiAgICBpZiAoIWRhdGFiYXNlTmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gbmFtZSBnaXZlbiBmb3IgU1FMaXRlIE5hdGl2ZVwiKVxuXG4gICAgcmV0dXJuIGRhdGFiYXNlTmFtZVxuICB9XG5cbiAgYXN5bmMgX2Nsb3NlKCkge1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHRoaXMuX2RhdGFiYXNlTmFtZSgpXG5cbiAgICBhd2FpdCBuYXRpdmVEYXRhYmFzZU11dGV4KGRhdGFiYXNlTmFtZSkuc3luYyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uXG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgYXdhaXQgY29ubmVjdGlvbj8uY2xvc2VBc3luYygpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURhdGFiYXNlU3RvcmFnZSgpIHtcbiAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSB0aGlzLl9kYXRhYmFzZU5hbWUoKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBTUUxpdGUuZGVsZXRlRGF0YWJhc2VBc3luYyhkYXRhYmFzZU5hbWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5tYXRjaCgvRGF0YWJhc2UgJyguKyknIG5vdCBmb3VuZC8pKSkgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBhY3R1YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBbb3B0aW9uc10gLSBRdWVyeSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj5bXT59IC0gUXVlcnkgcmVzdWx0IHJvd3MuXG4gICAqL1xuICBhc3luYyBfcXVlcnlBY3R1YWwoc3FsLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSB0aGlzLl9kYXRhYmFzZU5hbWUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJ1bk5hdGl2ZU9wZXJhdGlvbih7XG4gICAgICBkYXRhYmFzZU5hbWUsXG4gICAgICBnZXRDb25uZWN0aW9uOiAoKSA9PiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICByZW9wZW5Db25uZWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGF3YWl0IFNRTGl0ZS5vcGVuRGF0YWJhc2VBc3luYyhkYXRhYmFzZU5hbWUsIHt1c2VOZXdDb25uZWN0aW9uOiB0cnVlfSlcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gICAgICB9LFxuICAgICAgb3BlcmF0aW9uOiBhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5zcWxpdGVTY3JpcHQpIHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLmV4ZWNBc3luYyhzcWwpXG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoY29ubmVjdGlvbiwgc3FsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBtdXRhdGlvbiB3aXRoIGFmZmVjdGVkLXJvdyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIE11dGF0aW9uIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBBZmZlY3RlZCByb3cgY291bnQuXG4gICAqL1xuICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkge1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHRoaXMuX2RhdGFiYXNlTmFtZSgpXG5cbiAgICByZXR1cm4gYXdhaXQgcnVuTmF0aXZlT3BlcmF0aW9uKHtcbiAgICAgIGRhdGFiYXNlTmFtZSxcbiAgICAgIGdldENvbm5lY3Rpb246ICgpID0+IHRoaXMuY29ubmVjdGlvbixcbiAgICAgIHJlb3BlbkNvbm5lY3Rpb246IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gYXdhaXQgU1FMaXRlLm9wZW5EYXRhYmFzZUFzeW5jKGRhdGFiYXNlTmFtZSwge3VzZU5ld0Nvbm5lY3Rpb246IHRydWV9KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgICAgIH0sXG4gICAgICBvcGVyYXRpb246IGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24ucnVuQXN5bmMoc3FsKVxuXG4gICAgICAgIHJldHVybiByZXN1bHQuY2hhbmdlc1xuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import Mutex from "epic-locks/build/mutex.js";
|
|
2
|
+
export type NativeSqliteConnection = {
|
|
3
|
+
/**
|
|
4
|
+
* - Reads rows.
|
|
5
|
+
*/
|
|
6
|
+
getAllAsync: (sql: string) => Promise<Array<Record<string, ReturnType<typeof JSON.parse>>>>;
|
|
7
|
+
/**
|
|
8
|
+
* - Runs a mutation.
|
|
9
|
+
*/
|
|
10
|
+
runAsync: (sql: string) => Promise<{
|
|
11
|
+
changes: number;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* - Executes a SQL script.
|
|
15
|
+
*/
|
|
16
|
+
execAsync: (sql: string) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* - Closes the native connection.
|
|
19
|
+
*/
|
|
20
|
+
closeAsync: () => Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Returns the process-wide native query gate for one SQLite database name.
|
|
24
|
+
* expo-sqlite caches native databases by name, so a gate scoped to a driver
|
|
25
|
+
* instance is not enough: two drivers on the same database can still release
|
|
26
|
+
* each other's shared `NativeStatement` objects.
|
|
27
|
+
* @param {string} databaseName - SQLite database name.
|
|
28
|
+
* @returns {Mutex} Mutex serializing native calls for that database.
|
|
29
|
+
*/
|
|
30
|
+
export declare function nativeDatabaseMutex(databaseName: string): Mutex;
|
|
31
|
+
/**
|
|
32
|
+
* Whether an expo-sqlite error means the native database/statement was released.
|
|
33
|
+
* @param {unknown} error - Thrown error.
|
|
34
|
+
* @returns {boolean} Whether the error is the native-handle lifetime failure.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isNativeHandleError(error: unknown): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Runs one native operation under the per-database gate, reopening once when
|
|
39
|
+
* expo-sqlite reports the shared native handle was released.
|
|
40
|
+
* @template T
|
|
41
|
+
* @param {object} args - Operation args.
|
|
42
|
+
* @param {string} args.databaseName - SQLite database name.
|
|
43
|
+
* @param {() => NativeSqliteConnection | undefined} args.getConnection - Current connection getter.
|
|
44
|
+
* @param {() => Promise<NativeSqliteConnection>} args.reopenConnection - Opens a fresh native connection.
|
|
45
|
+
* @param {(connection: NativeSqliteConnection) => Promise<T>} args.operation - Operation to run.
|
|
46
|
+
* @returns {Promise<T>} Operation result.
|
|
47
|
+
*/
|
|
48
|
+
export declare function runNativeOperation<T>({ databaseName, getConnection, reopenConnection, operation }: {
|
|
49
|
+
databaseName: string;
|
|
50
|
+
getConnection: () => NativeSqliteConnection | undefined;
|
|
51
|
+
reopenConnection: () => Promise<NativeSqliteConnection>;
|
|
52
|
+
operation: (connection: NativeSqliteConnection) => Promise<T>;
|
|
53
|
+
}): Promise<T>;
|
|
54
|
+
//# sourceMappingURL=native-query-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-query-gate.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/sqlite/native-query-gate.js"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,2BAA2B,CAAA;AAG1C,YAAkB,sBAAsB,GACxC;;;;IAA2F,WAAW,EAA3F,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACzF;;;;IAAwD,QAAQ,EAArD,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC,CACtD;;;;IAA2C,SAAS,EAAzC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CACzC;;;;IAAgC,UAAU,EAA/B,MAAM,OAAO,CAAC,IAAI,CAAC,CAChC;CAAA,CAAA;AAKD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAHrC,MAGqC,GAFnC,KAAK,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAH9B,OAG8B,GAF5B,OAAO,CAQnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAR3B,CAAC,EAQ2B,EAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAC,EANhG;IAAqB,YAAY,EAAzB,MAAM,CACd;IAAuD,aAAa,EAA5D,MAAM,sBAAsB,GAAG,SAAS,CAChD;IAAoD,gBAAgB,EAA5D,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAC7C;IAAiE,SAAS,EAAlE,CAAC,UAAU,EAAE,sBAAsB,KAAK,OAAO,CAAC,CAAC,CAAC,CAC1D;CAEgG,GAFtF,OAAO,CAAC,CAAC,CAAC,CAgBtB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import Mutex from "epic-locks/build/mutex.js";
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {object} NativeSqliteConnection
|
|
5
|
+
* @property {(sql: string) => Promise<Array<Record<string, ReturnType<typeof JSON.parse>>>>} getAllAsync - Reads rows.
|
|
6
|
+
* @property {(sql: string) => Promise<{changes: number}>} runAsync - Runs a mutation.
|
|
7
|
+
* @property {(sql: string) => Promise<void>} execAsync - Executes a SQL script.
|
|
8
|
+
* @property {() => Promise<void>} closeAsync - Closes the native connection.
|
|
9
|
+
*/
|
|
10
|
+
/** @type {Map<string, Mutex>} */
|
|
11
|
+
const mutexesByDatabaseName = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Returns the process-wide native query gate for one SQLite database name.
|
|
14
|
+
* expo-sqlite caches native databases by name, so a gate scoped to a driver
|
|
15
|
+
* instance is not enough: two drivers on the same database can still release
|
|
16
|
+
* each other's shared `NativeStatement` objects.
|
|
17
|
+
* @param {string} databaseName - SQLite database name.
|
|
18
|
+
* @returns {Mutex} Mutex serializing native calls for that database.
|
|
19
|
+
*/
|
|
20
|
+
export function nativeDatabaseMutex(databaseName) {
|
|
21
|
+
let mutex = mutexesByDatabaseName.get(databaseName);
|
|
22
|
+
if (!mutex) {
|
|
23
|
+
mutex = new Mutex();
|
|
24
|
+
mutexesByDatabaseName.set(databaseName, mutex);
|
|
25
|
+
}
|
|
26
|
+
return mutex;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether an expo-sqlite error means the native database/statement was released.
|
|
30
|
+
* @param {unknown} error - Thrown error.
|
|
31
|
+
* @returns {boolean} Whether the error is the native-handle lifetime failure.
|
|
32
|
+
*/
|
|
33
|
+
export function isNativeHandleError(error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
35
|
+
const causeMessage = error instanceof Error && error.cause instanceof Error ? error.cause.message : "";
|
|
36
|
+
const text = `${message} ${causeMessage}`;
|
|
37
|
+
return /NativeStatement\.runAsync|NativeDatabase\.prepareAsync/.test(text) && /NullPointerException|already released/.test(text);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Runs one native operation under the per-database gate, reopening once when
|
|
41
|
+
* expo-sqlite reports the shared native handle was released.
|
|
42
|
+
* @template T
|
|
43
|
+
* @param {object} args - Operation args.
|
|
44
|
+
* @param {string} args.databaseName - SQLite database name.
|
|
45
|
+
* @param {() => NativeSqliteConnection | undefined} args.getConnection - Current connection getter.
|
|
46
|
+
* @param {() => Promise<NativeSqliteConnection>} args.reopenConnection - Opens a fresh native connection.
|
|
47
|
+
* @param {(connection: NativeSqliteConnection) => Promise<T>} args.operation - Operation to run.
|
|
48
|
+
* @returns {Promise<T>} Operation result.
|
|
49
|
+
*/
|
|
50
|
+
export async function runNativeOperation({ databaseName, getConnection, reopenConnection, operation }) {
|
|
51
|
+
return await nativeDatabaseMutex(databaseName).sync(async () => {
|
|
52
|
+
const connection = getConnection();
|
|
53
|
+
if (!connection)
|
|
54
|
+
throw new Error("Not connected yet");
|
|
55
|
+
try {
|
|
56
|
+
return await operation(connection);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (!isNativeHandleError(error))
|
|
60
|
+
throw error;
|
|
61
|
+
return await operation(await reopenConnection());
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXF1ZXJ5LWdhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9zcWxpdGUvbmF0aXZlLXF1ZXJ5LWdhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sS0FBSyxNQUFNLDJCQUEyQixDQUFBO0FBRTdDOzs7Ozs7R0FNRztBQUVILGlDQUFpQztBQUNqQyxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFdkM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxZQUFZO0lBQzlDLElBQUksS0FBSyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUVuRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQTtRQUNuQixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQUs7SUFDdkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDdEcsTUFBTSxJQUFJLEdBQUcsR0FBRyxPQUFPLElBQUksWUFBWSxFQUFFLENBQUE7SUFFekMsT0FBTyx3REFBd0QsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksdUNBQXVDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2xJLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxFQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFDO0lBQ2pHLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDN0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxFQUFFLENBQUE7UUFFbEMsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFFckQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxLQUFLLENBQUE7WUFFNUMsT0FBTyxNQUFNLFNBQVMsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUNsRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBNdXRleCBmcm9tIFwiZXBpYy1sb2Nrcy9idWlsZC9tdXRleC5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTmF0aXZlU3FsaXRlQ29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoc3FsOiBzdHJpbmcpID0+IFByb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pj59IGdldEFsbEFzeW5jIC0gUmVhZHMgcm93cy5cbiAqIEBwcm9wZXJ0eSB7KHNxbDogc3RyaW5nKSA9PiBQcm9taXNlPHtjaGFuZ2VzOiBudW1iZXJ9Pn0gcnVuQXN5bmMgLSBSdW5zIGEgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkgeyhzcWw6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gZXhlY0FzeW5jIC0gRXhlY3V0ZXMgYSBTUUwgc2NyaXB0LlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZUFzeW5jIC0gQ2xvc2VzIHRoZSBuYXRpdmUgY29ubmVjdGlvbi5cbiAqL1xuXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIE11dGV4Pn0gKi9cbmNvbnN0IG11dGV4ZXNCeURhdGFiYXNlTmFtZSA9IG5ldyBNYXAoKVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHByb2Nlc3Mtd2lkZSBuYXRpdmUgcXVlcnkgZ2F0ZSBmb3Igb25lIFNRTGl0ZSBkYXRhYmFzZSBuYW1lLlxuICogZXhwby1zcWxpdGUgY2FjaGVzIG5hdGl2ZSBkYXRhYmFzZXMgYnkgbmFtZSwgc28gYSBnYXRlIHNjb3BlZCB0byBhIGRyaXZlclxuICogaW5zdGFuY2UgaXMgbm90IGVub3VnaDogdHdvIGRyaXZlcnMgb24gdGhlIHNhbWUgZGF0YWJhc2UgY2FuIHN0aWxsIHJlbGVhc2VcbiAqIGVhY2ggb3RoZXIncyBzaGFyZWQgYE5hdGl2ZVN0YXRlbWVudGAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBTUUxpdGUgZGF0YWJhc2UgbmFtZS5cbiAqIEByZXR1cm5zIHtNdXRleH0gTXV0ZXggc2VyaWFsaXppbmcgbmF0aXZlIGNhbGxzIGZvciB0aGF0IGRhdGFiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlRGF0YWJhc2VNdXRleChkYXRhYmFzZU5hbWUpIHtcbiAgbGV0IG11dGV4ID0gbXV0ZXhlc0J5RGF0YWJhc2VOYW1lLmdldChkYXRhYmFzZU5hbWUpXG5cbiAgaWYgKCFtdXRleCkge1xuICAgIG11dGV4ID0gbmV3IE11dGV4KClcbiAgICBtdXRleGVzQnlEYXRhYmFzZU5hbWUuc2V0KGRhdGFiYXNlTmFtZSwgbXV0ZXgpXG4gIH1cblxuICByZXR1cm4gbXV0ZXhcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGV4cG8tc3FsaXRlIGVycm9yIG1lYW5zIHRoZSBuYXRpdmUgZGF0YWJhc2Uvc3RhdGVtZW50IHdhcyByZWxlYXNlZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBUaHJvd24gZXJyb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZXJyb3IgaXMgdGhlIG5hdGl2ZS1oYW5kbGUgbGlmZXRpbWUgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlSGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICBjb25zdCBjYXVzZU1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jYXVzZS5tZXNzYWdlIDogXCJcIlxuICBjb25zdCB0ZXh0ID0gYCR7bWVzc2FnZX0gJHtjYXVzZU1lc3NhZ2V9YFxuXG4gIHJldHVybiAvTmF0aXZlU3RhdGVtZW50XFwucnVuQXN5bmN8TmF0aXZlRGF0YWJhc2VcXC5wcmVwYXJlQXN5bmMvLnRlc3QodGV4dCkgJiYgL051bGxQb2ludGVyRXhjZXB0aW9ufGFscmVhZHkgcmVsZWFzZWQvLnRlc3QodGV4dClcbn1cblxuLyoqXG4gKiBSdW5zIG9uZSBuYXRpdmUgb3BlcmF0aW9uIHVuZGVyIHRoZSBwZXItZGF0YWJhc2UgZ2F0ZSwgcmVvcGVuaW5nIG9uY2Ugd2hlblxuICogZXhwby1zcWxpdGUgcmVwb3J0cyB0aGUgc2hhcmVkIG5hdGl2ZSBoYW5kbGUgd2FzIHJlbGVhc2VkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3BlcmF0aW9uIGFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kYXRhYmFzZU5hbWUgLSBTUUxpdGUgZGF0YWJhc2UgbmFtZS5cbiAqIEBwYXJhbSB7KCkgPT4gTmF0aXZlU3FsaXRlQ29ubmVjdGlvbiB8IHVuZGVmaW5lZH0gYXJncy5nZXRDb25uZWN0aW9uIC0gQ3VycmVudCBjb25uZWN0aW9uIGdldHRlci5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxOYXRpdmVTcWxpdGVDb25uZWN0aW9uPn0gYXJncy5yZW9wZW5Db25uZWN0aW9uIC0gT3BlbnMgYSBmcmVzaCBuYXRpdmUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7KGNvbm5lY3Rpb246IE5hdGl2ZVNxbGl0ZUNvbm5lY3Rpb24pID0+IFByb21pc2U8VD59IGFyZ3Mub3BlcmF0aW9uIC0gT3BlcmF0aW9uIHRvIHJ1bi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTmF0aXZlT3BlcmF0aW9uKHtkYXRhYmFzZU5hbWUsIGdldENvbm5lY3Rpb24sIHJlb3BlbkNvbm5lY3Rpb24sIG9wZXJhdGlvbn0pIHtcbiAgcmV0dXJuIGF3YWl0IG5hdGl2ZURhdGFiYXNlTXV0ZXgoZGF0YWJhc2VOYW1lKS5zeW5jKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgeWV0XCIpXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbihjb25uZWN0aW9uKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTmF0aXZlSGFuZGxlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuXG4gICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKGF3YWl0IHJlb3BlbkNvbm5lY3Rpb24oKSlcbiAgICB9XG4gIH0pXG59XG4iXX0=
|
|
@@ -81,9 +81,12 @@ declare const AuditEvents: AuditEventsType;
|
|
|
81
81
|
* Table detection and relationship registration happen lazily on first usage.
|
|
82
82
|
* Called synchronously from Model.audited() at module-load time.
|
|
83
83
|
* @param {AuditedModelClass} modelClass - Model class to audit.
|
|
84
|
+
* @param {{except?: string[]}} [options] - Audit options: `except` lists attribute names never written to the audit trail (e.g. high-frequency telemetry columns).
|
|
84
85
|
* @returns {void}
|
|
85
86
|
*/
|
|
86
|
-
declare function registerAuditing(modelClass: AuditedModelClass
|
|
87
|
+
declare function registerAuditing(modelClass: AuditedModelClass, options?: {
|
|
88
|
+
except?: string[];
|
|
89
|
+
}): void;
|
|
87
90
|
/**
|
|
88
91
|
* Initializes audit metadata for audited model classes.
|
|
89
92
|
* @param {typeof import("./index.js").default} modelClass - Model class to initialize.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditing.d.ts","sourceRoot":"","sources":["../../../../src/database/record/auditing.js"],"names":[],"mappings":"AAQG,YAAkB,eAAe,GACjC;;;;IAA4E,IAAI,EAArE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAC1E;;;;IAAsG,OAAO,EAAlG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,KAAK,MAAM,IAAI,CACpG;;;;IAAuB,KAAK,EAAjB,MAAM,IAAI,CACvB;CAAA,CAAA;AAGE,YAAyD,YAAY,GAA3D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAc;AAKrE,YAAkB,iBAAiB,GACnC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAA4B,OAAO,EAAxB,MAAM,GAAG,MAAM,CAC1B;;;;IAAgC,cAAc,EAAnC,YAAY,GAAG,IAAI,CAC9B;;;;IAAiE,MAAM,EAA5D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAC/D;;;;IAAyC,MAAM,EAApC,OAAO,YAAY,EAAE,OAAO,CACzC;CAAA,CAAA;AAIE,YAAgE,aAAa,GAAnE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAe;AAK7E,YAAkB,eAAe,GACjC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAiC,cAAc,AAA/C,CACA,EADW,YAAY,GAAG,IAAI,CAC9B;;;;IAAkE,MAAM,AAAxE,CACF,EADa,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CACjE;CAAA,CAAA;AAIE,YAKG,iBAAiB,GALV,cAAc,YAAY,EAAE,OAAO,GAAG;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAClD,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,cAAc,CAAA;CACjC,CAAmB;AAKpB,YAAkB,cAAc,GAChC;;;;IAAoB,SAAS,EAAlB,OAAO,CAClB;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAAgD,UAAU,EAA/C,cAAc,YAAY,EAAE,OAAO,CAChD;CAAA,CAAA;AAuBD,8BAA8B;AAC9B,QAAA,MAAM,WAAW,EADN,eAoDV,CAAA;AA4RD
|
|
1
|
+
{"version":3,"file":"auditing.d.ts","sourceRoot":"","sources":["../../../../src/database/record/auditing.js"],"names":[],"mappings":"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"}
|