@op-engineering/op-sqlite 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,6 +37,10 @@ You can find the [benchmarking code in the example app](https://github.com/OP-En
37
37
 
38
38
  Memory consumption is also is also 1/4 compared to `react-native-quick-sqlite`. This query used to take 1.2gb of peak memory usage, now runs in 250mbs.
39
39
 
40
+ # Encryption
41
+
42
+ If you need to encrypt your entire database, there is [`op-sqlcipher`](https://github.com/OP-Engineering/op-sqlcipher), which is a fork of this library which uses [SQLCipher](https://github.com/sqlcipher/sqlcipher). It completely encrypts all the database with minimal overhead. Bear in mind, however, it is a fork maintained by a third-party.
43
+
40
44
  # DB Paths
41
45
 
42
46
  The library creates/opens databases by appending the passed name plus, the [library directory on iOS](https://github.com/OP-Engineering/op-sqlite/blob/main/ios/OPSQLite.mm#L51) and the [database directory on Android](https://github.com/OP-Engineering/op-sqlite/blob/main/android/src/main/java/com/op/sqlite/OPSQLiteBridge.java#L18). If you are migrating from `react-native-quick-sqlite` you will have to move your library using one of the many react-native fs libraries.
@@ -239,16 +243,18 @@ db.execute(
239
243
  'CREATE TABLE BlobTable ( id INT PRIMARY KEY, name TEXT NOT NULL, content BLOB) STRICT;'
240
244
  );
241
245
 
242
- let buffer = new ArrayBuffer(24);
243
- let content = new Uint8Array(buffer, 4, 16);
244
- // @ts-ignore
245
- crypto.getRandomValues(content);
246
+ let binaryData = new Uint8Array(2);
247
+ binaryData[0] = 42;
246
248
 
247
249
  db.execute(`INSERT OR REPLACE INTO BlobTable VALUES (?, ?, ?);`, [
248
250
  1,
249
251
  'myTestBlob',
250
- buffer,
252
+ binaryData,
251
253
  ]);
254
+
255
+ const result = db.execute('SELECT content FROM BlobTable');
256
+
257
+ const finalUint8 = new Uint8Array(result.rows!._array[0].content);
252
258
  ```
253
259
 
254
260
  ### Attach or Detach other databases
package/cpp/bridge.cpp CHANGED
@@ -330,7 +330,7 @@ BridgeResult sqliteExecute(std::string const dbName,
330
330
  {
331
331
  const char *column_value = reinterpret_cast<const char *>(sqlite3_column_text(statement, i));
332
332
  int byteLen = sqlite3_column_bytes(statement, i);
333
- // Specify length too; in case string contains NULL in the middle (which SQLite supports!)
333
+ // Specify length too; in case string contains NULL in the middle
334
334
  row.values.push_back(JSVariant(std::string(column_value, byteLen)));
335
335
  break;
336
336
  }
@@ -340,6 +340,8 @@ BridgeResult sqliteExecute(std::string const dbName,
340
340
  int blob_size = sqlite3_column_bytes(statement, i);
341
341
  const void *blob = sqlite3_column_blob(statement, i);
342
342
  uint8_t *data = new uint8_t[blob_size];
343
+ // You cannot share raw memory between native and JS
344
+ // always copy the data
343
345
  memcpy(data, blob, blob_size);
344
346
  row.values.push_back(JSVariant(ArrayBuffer {
345
347
  .data = std::shared_ptr<uint8_t>{data},
package/cpp/utils.cpp CHANGED
@@ -30,19 +30,17 @@ jsi::Value toJSI(jsi::Runtime &rt, JSVariant value) {
30
30
  {
31
31
  return jsi::String::createFromUtf8(rt, std::get<std::string>(value));
32
32
  }
33
- // else if (std::holds_alternative<const char*>(value))
34
- // {
35
- // return jsi::String::createFromAscii(rt, std::get<const char*>(value));
36
- // }
37
33
  else if (std::holds_alternative<ArrayBuffer>(value))
38
34
  {
39
35
  auto jsBuffer = std::get<ArrayBuffer>(value);
40
36
  jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
41
37
  jsi::Object o = array_buffer_ctor.callAsConstructor(rt, (int)jsBuffer.size).getObject(rt);
42
38
  jsi::ArrayBuffer buf = o.getArrayBuffer(rt);
43
- // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564.
39
+ // You cannot share raw memory between native and JS
40
+ // always copy the data
41
+ // see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564.
44
42
  memcpy(buf.data(rt), jsBuffer.data.get(), jsBuffer.size);
45
- return buf;
43
+ return o;
46
44
  }
47
45
 
48
46
  return jsi::Value::null();
@@ -97,13 +95,17 @@ std::vector<JSVariant> toVariantVec(jsi::Runtime &rt, jsi::Value const &params)
97
95
  else if (value.isObject())
98
96
  {
99
97
  auto obj = value.asObject(rt);
100
- auto isArray = obj.isArray(rt);
101
- auto isFunction = obj.isFunction(rt);
102
- auto isArrayBuffer = obj.isArrayBuffer(rt);
103
98
  if (obj.isArrayBuffer(rt)) {
104
99
  auto buffer = obj.getArrayBuffer(rt);
100
+
101
+ uint8_t *data = new uint8_t[buffer.size(rt)];
102
+ // You cannot share raw memory between native and JS
103
+ // always copy the data
104
+ // see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564.
105
+ memcpy(data, buffer.data(rt), buffer.size(rt));
106
+
105
107
  res.push_back(JSVariant(ArrayBuffer {
106
- .data = std::shared_ptr<uint8_t>{buffer.data(rt)},
108
+ .data = std::shared_ptr<uint8_t>{data},
107
109
  .size = buffer.size(rt)
108
110
  }));
109
111
  } else {
@@ -150,16 +152,13 @@ jsi::Value createResult(jsi::Runtime &rt,
150
152
  res.setProperty(rt, "rows", std::move(rows));
151
153
  }
152
154
 
153
- if(metadata != nullptr)
154
- {
155
- size_t column_count = metadata->size();
156
- auto column_array = jsi::Array(rt, column_count);
157
- for (int i = 0; i < column_count; i++) {
158
- auto column = metadata->at(i);
159
- column_array.setValueAtIndex(rt, i, jsi::Object::createFromHostObject(rt, std::make_shared<DynamicHostObject>(column)));
160
- }
161
- res.setProperty(rt, "metadata", std::move(column_array));
155
+ size_t column_count = metadata->size();
156
+ auto column_array = jsi::Array(rt, column_count);
157
+ for (int i = 0; i < column_count; i++) {
158
+ auto column = metadata->at(i);
159
+ column_array.setValueAtIndex(rt, i, jsi::Object::createFromHostObject(rt, std::make_shared<DynamicHostObject>(column)));
162
160
  }
161
+ res.setProperty(rt, "metadata", std::move(column_array));
163
162
 
164
163
  return std::move(res);
165
164
  }
@@ -46,21 +46,27 @@ const locks = {};
46
46
  // Enhance some host functions
47
47
 
48
48
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
49
- const enhanceQueryResult = result => {
49
+ function enhanceQueryResult(result) {
50
50
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
51
51
  if (result.rows == null) {
52
52
  result.rows = {
53
53
  _array: [],
54
54
  length: 0,
55
- item: idx => result.rows._array[idx]
55
+ item: idx => {
56
+ var _result$rows;
57
+ return (_result$rows = result.rows) === null || _result$rows === void 0 ? void 0 : _result$rows._array[idx];
58
+ }
56
59
  };
57
60
  } else {
58
- result.rows.item = idx => result.rows._array[idx];
61
+ result.rows.item = idx => {
62
+ var _result$rows2;
63
+ return (_result$rows2 = result.rows) === null || _result$rows2 === void 0 ? void 0 : _result$rows2._array[idx];
64
+ };
59
65
  }
60
- };
66
+ }
61
67
  const _open = OPSQLite.open;
62
68
  OPSQLite.open = (dbName, location, inMemory) => {
63
- _open(dbName, location);
69
+ _open(dbName, location, !!inMemory);
64
70
  locks[dbName] = {
65
71
  queue: [],
66
72
  inProgress: false
@@ -73,13 +79,25 @@ OPSQLite.close = dbName => {
73
79
  };
74
80
  const _execute = OPSQLite.execute;
75
81
  OPSQLite.execute = (dbName, query, params) => {
76
- const result = _execute(dbName, query, params);
82
+ const sanitizedParams = params === null || params === void 0 ? void 0 : params.map(p => {
83
+ if (ArrayBuffer.isView(p)) {
84
+ return p.buffer;
85
+ }
86
+ return p;
87
+ });
88
+ const result = _execute(dbName, query, sanitizedParams);
77
89
  enhanceQueryResult(result);
78
90
  return result;
79
91
  };
80
92
  const _executeAsync = OPSQLite.executeAsync;
81
93
  OPSQLite.executeAsync = async (dbName, query, params) => {
82
- const res = await _executeAsync(dbName, query, params);
94
+ const sanitizedParams = params === null || params === void 0 ? void 0 : params.map(p => {
95
+ if (ArrayBuffer.isView(p)) {
96
+ return p.buffer;
97
+ }
98
+ return p;
99
+ });
100
+ const res = await _executeAsync(dbName, query, sanitizedParams);
83
101
  enhanceQueryResult(res);
84
102
  return res;
85
103
  };
@@ -166,6 +184,9 @@ const startNextTransaction = dbName => {
166
184
  if (locks[dbName].queue.length) {
167
185
  locks[dbName].inProgress = true;
168
186
  const tx = locks[dbName].queue.shift();
187
+ if (!tx) {
188
+ throw new Error('Could not get a operation on datebase');
189
+ }
169
190
  setImmediate(() => {
170
191
  tx.start();
171
192
  });
@@ -1 +1 @@
1
- {"version":3,"names":["global","__OPSQLiteProxy","OPSQLiteModule","NativeModules","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void> | void\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nconst enhanceQueryResult = (result: QueryResult): void => {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows._array[idx];\n }\n};\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const result = _execute(dbName, query, params);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const res = await _executeAsync(dbName, query, params);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void> | void) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void> | void) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["global","__OPSQLiteProxy","OPSQLiteModule","NativeModules","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n };\n};\n"],"mappings":";;;;;;AAAA;AAOA,IAAIA,MAAM,CAACC,eAAe,IAAI,IAAI,EAAE;EAClC,MAAMC,cAAc,GAAGC,0BAAa,CAACC,QAAQ;EAE7C,IAAIF,cAAc,IAAI,IAAI,EAAE;IAC1B,MAAM,IAAIG,KAAK,CAAC,sDAAsD,CAAC;EACzE;;EAEA;EACA,IAAIL,MAAM,CAACM,kBAAkB,IAAI,IAAI,IAAIJ,cAAc,CAACK,OAAO,IAAI,IAAI,EAAE;IACvE,MAAM,IAAIF,KAAK,CACb,iQAAiQ,CAClQ;EACH;;EAEA;EACA,MAAMG,MAAM,GAAGN,cAAc,CAACK,OAAO,EAAE;EACvC,IAAIC,MAAM,KAAK,IAAI,EAAE;IACnB,MAAM,IAAIH,KAAK,CACZ,iJAAgJG,MAAO,EAAC,CAC1J;EACH;;EAEA;EACA,IAAIR,MAAM,CAACC,eAAe,IAAI,IAAI,EAAE;IAClC,MAAM,IAAII,KAAK,CACb,yIAAyI,CAC1I;EACH;AACF;AAEA,MAAMI,KAAK,GAAGT,MAAM,CAACC,eAAe;AAC7B,MAAMG,QAAQ,GAAGK,KAAgB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAyHA,MAAMC,KAGL,GAAG,CAAC,CAAC;;AAEN;;AAEA;AACA,SAASC,kBAAkB,CAACH,MAAmB,EAAQ;EACrD;EACA,IAAIA,MAAM,CAACI,IAAI,IAAI,IAAI,EAAE;IACvBJ,MAAM,CAACI,IAAI,GAAG;MACZC,MAAM,EAAE,EAAE;MACVC,MAAM,EAAE,CAAC;MACTC,IAAI,EAAGC,GAAW;QAAA;QAAA,uBAAKR,MAAM,CAACI,IAAI,iDAAX,aAAaC,MAAM,CAACG,GAAG,CAAC;MAAA;IACjD,CAAC;EACH,CAAC,MAAM;IACLR,MAAM,CAACI,IAAI,CAACG,IAAI,GAAIC,GAAW;MAAA;MAAA,wBAAKR,MAAM,CAACI,IAAI,kDAAX,cAAaC,MAAM,CAACG,GAAG,CAAC;IAAA;EAC9D;AACF;AAEA,MAAMC,KAAK,GAAGb,QAAQ,CAACc,IAAI;AAC3Bd,QAAQ,CAACc,IAAI,GAAG,CAACC,MAAc,EAAEC,QAAiB,EAAEC,QAAkB,KAAK;EACzEJ,KAAK,CAACE,MAAM,EAAEC,QAAQ,EAAE,CAAC,CAACC,QAAQ,CAAC;EAEnCX,KAAK,CAACS,MAAM,CAAC,GAAG;IACdG,KAAK,EAAE,EAAE;IACTC,UAAU,EAAE;EACd,CAAC;AACH,CAAC;AAED,MAAMC,MAAM,GAAGpB,QAAQ,CAACqB,KAAK;AAC7BrB,QAAQ,CAACqB,KAAK,GAAIN,MAAc,IAAK;EACnCK,MAAM,CAACL,MAAM,CAAC;EACd,OAAOT,KAAK,CAACS,MAAM,CAAC;AACtB,CAAC;AAED,MAAMO,QAAQ,GAAGtB,QAAQ,CAACuB,OAAO;AACjCvB,QAAQ,CAACuB,OAAO,GAAG,CACjBR,MAAc,EACdS,KAAa,EACbC,MAA0B,KACV;EAChB,MAAMC,eAAe,GAAGD,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEE,GAAG,CAAEC,CAAC,IAAK;IACzC,IAAIC,WAAW,CAACC,MAAM,CAACF,CAAC,CAAC,EAAE;MACzB,OAAOA,CAAC,CAACG,MAAM;IACjB;IAEA,OAAOH,CAAC;EACV,CAAC,CAAC;EAEF,MAAMxB,MAAM,GAAGkB,QAAQ,CAACP,MAAM,EAAES,KAAK,EAAEE,eAAe,CAAC;EACvDnB,kBAAkB,CAACH,MAAM,CAAC;EAC1B,OAAOA,MAAM;AACf,CAAC;AAED,MAAM4B,aAAa,GAAGhC,QAAQ,CAACiC,YAAY;AAC3CjC,QAAQ,CAACiC,YAAY,GAAG,OACtBlB,MAAc,EACdS,KAAa,EACbC,MAA0B,KACD;EACzB,MAAMC,eAAe,GAAGD,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEE,GAAG,CAAEC,CAAC,IAAK;IACzC,IAAIC,WAAW,CAACC,MAAM,CAACF,CAAC,CAAC,EAAE;MACzB,OAAOA,CAAC,CAACG,MAAM;IACjB;IAEA,OAAOH,CAAC;EACV,CAAC,CAAC;EAEF,MAAMM,GAAG,GAAG,MAAMF,aAAa,CAACjB,MAAM,EAAES,KAAK,EAAEE,eAAe,CAAC;EAC/DnB,kBAAkB,CAAC2B,GAAG,CAAC;EACvB,OAAOA,GAAG;AACZ,CAAC;AAEDlC,QAAQ,CAACmC,WAAW,GAAG,OACrBpB,MAAc,EACdqB,EAAsC,KACpB;EAClB,IAAI,CAAC9B,KAAK,CAACS,MAAM,CAAC,EAAE;IAClB,MAAMd,KAAK,CAAE,sCAAqCc,MAAO,EAAC,CAAC;EAC7D;EAEA,IAAIsB,WAAW,GAAG,KAAK;;EAEvB;EACA,MAAMd,OAAO,GAAG,CAACC,KAAa,EAAEC,MAAc,KAAkB;IAC9D,IAAIY,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,gEAA+Dc,MAAO,EAAC,CACzE;IACH;IACA,OAAOf,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAES,KAAK,EAAEC,MAAM,CAAC;EAChD,CAAC;EAED,MAAMQ,YAAY,GAAG,CAACT,KAAa,EAAEC,MAA0B,KAAK;IAClE,IAAIY,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,gEAA+Dc,MAAO,EAAC,CACzE;IACH;IACA,OAAOf,QAAQ,CAACiC,YAAY,CAAClB,MAAM,EAAES,KAAK,EAAEC,MAAM,CAAC;EACrD,CAAC;EAED,MAAMa,MAAM,GAAG,MAAM;IACnB,IAAID,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,iEAAgEc,MAAO,EAAC,CAC1E;IACH;IACA,MAAMX,MAAM,GAAGJ,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAE,QAAQ,CAAC;IACjDsB,WAAW,GAAG,IAAI;IAClB,OAAOjC,MAAM;EACf,CAAC;EAED,MAAMmC,QAAQ,GAAG,MAAM;IACrB,IAAIF,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,mEAAkEc,MAAO,EAAC,CAC5E;IACH;IACA,MAAMX,MAAM,GAAGJ,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAE,UAAU,CAAC;IACnDsB,WAAW,GAAG,IAAI;IAClB,OAAOjC,MAAM;EACf,CAAC;EAED,eAAeoC,GAAG,GAAG;IACnB,IAAI;MACF,MAAMxC,QAAQ,CAACiC,YAAY,CAAClB,MAAM,EAAE,mBAAmB,CAAC;MAExD,MAAMqB,EAAE,CAAC;QACPE,MAAM;QACNf,OAAO;QACPU,YAAY;QACZM;MACF,CAAC,CAAC;MAEF,IAAI,CAACF,WAAW,EAAE;QAChBC,MAAM,EAAE;MACV;IACF,CAAC,CAAC,OAAOG,cAAc,EAAE;MACvB,IAAI,CAACJ,WAAW,EAAE;QAChB,IAAI;UACFE,QAAQ,EAAE;QACZ,CAAC,CAAC,OAAOG,aAAa,EAAE;UACtB,MAAMA,aAAa;QACrB;MACF;MAEA,MAAMD,cAAc;IACtB,CAAC,SAAS;MACRnC,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,GAAG,KAAK;MAChCkB,WAAW,GAAG,KAAK;MACnBM,oBAAoB,CAAC5B,MAAM,CAAC;IAC9B;EACF;EAEA,OAAO,MAAM,IAAI6B,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5C,MAAMC,EAAsB,GAAG;MAC7BC,KAAK,EAAE,MAAM;QACXR,GAAG,EAAE,CAACS,IAAI,CAACJ,OAAO,CAAC,CAACK,KAAK,CAACJ,MAAM,CAAC;MACnC;IACF,CAAC;IAEDxC,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACiC,IAAI,CAACJ,EAAE,CAAC;IAC5BJ,oBAAoB,CAAC5B,MAAM,CAAC;EAC9B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM4B,oBAAoB,GAAI5B,MAAc,IAAK;EAC/C,IAAI,CAACT,KAAK,CAACS,MAAM,CAAC,EAAE;IAClB,MAAMd,KAAK,CAAE,0BAAyBc,MAAO,EAAC,CAAC;EACjD;EAEA,IAAIT,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,EAAE;IAC5B;IACA;EACF;EAEA,IAAIb,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACR,MAAM,EAAE;IAC9BJ,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,GAAG,IAAI;IAC/B,MAAM4B,EAAE,GAAGzC,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACkC,KAAK,EAAE;IAEtC,IAAI,CAACL,EAAE,EAAE;MACP,MAAM,IAAI9C,KAAK,CAAC,uCAAuC,CAAC;IAC1D;IAEAoD,YAAY,CAAC,MAAM;MACjBN,EAAE,CAACC,KAAK,EAAE;IACZ,CAAC,CAAC;EACJ;AACF,CAAC;AAeM,MAAMlC,IAAI,GAAIwC,OAIpB,IAAyB;EACxBtD,QAAQ,CAACc,IAAI,CAACwC,OAAO,CAACC,IAAI,EAAED,OAAO,CAACtC,QAAQ,EAAEsC,OAAO,CAACrC,QAAQ,CAAC;EAE/D,OAAO;IACLI,KAAK,EAAE,MAAMrB,QAAQ,CAACqB,KAAK,CAACiC,OAAO,CAACC,IAAI,CAAC;IACzCC,MAAM,EAAE,MAAMxD,QAAQ,CAACwD,MAAM,CAACF,OAAO,CAACC,IAAI,EAAED,OAAO,CAACtC,QAAQ,CAAC;IAC7DyC,MAAM,EAAE,CAACC,cAAsB,EAAEC,KAAa,EAAE3C,QAAiB,KAC/DhB,QAAQ,CAACyD,MAAM,CAACH,OAAO,CAACC,IAAI,EAAEG,cAAc,EAAEC,KAAK,EAAE3C,QAAQ,CAAC;IAChE4C,MAAM,EAAGD,KAAa,IAAK3D,QAAQ,CAAC4D,MAAM,CAACN,OAAO,CAACC,IAAI,EAAEI,KAAK,CAAC;IAC/DxB,WAAW,EAAGC,EAAsC,IAClDpC,QAAQ,CAACmC,WAAW,CAACmB,OAAO,CAACC,IAAI,EAAEnB,EAAE,CAAC;IACxCb,OAAO,EAAE,CAACC,KAAa,EAAEC,MAA0B,KACjDzB,QAAQ,CAACuB,OAAO,CAAC+B,OAAO,CAACC,IAAI,EAAE/B,KAAK,EAAEC,MAAM,CAAC;IAC/CQ,YAAY,EAAE,CACZT,KAAa,EACbC,MAA0B,KAE1BzB,QAAQ,CAACiC,YAAY,CAACqB,OAAO,CAACC,IAAI,EAAE/B,KAAK,EAAEC,MAAM,CAAC;IACpDoC,YAAY,EAAGC,QAAyB,IACtC9D,QAAQ,CAAC6D,YAAY,CAACP,OAAO,CAACC,IAAI,EAAEO,QAAQ,CAAC;IAC/CC,iBAAiB,EAAGD,QAAyB,IAC3C9D,QAAQ,CAAC+D,iBAAiB,CAACT,OAAO,CAACC,IAAI,EAAEO,QAAQ,CAAC;IACpDE,QAAQ,EAAGhD,QAAgB,IAAKhB,QAAQ,CAACgE,QAAQ,CAACV,OAAO,CAACC,IAAI,EAAEvC,QAAQ;EAC1E,CAAC;AACH,CAAC;AAAC"}
@@ -40,21 +40,27 @@ const locks = {};
40
40
  // Enhance some host functions
41
41
 
42
42
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
43
- const enhanceQueryResult = result => {
43
+ function enhanceQueryResult(result) {
44
44
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
45
45
  if (result.rows == null) {
46
46
  result.rows = {
47
47
  _array: [],
48
48
  length: 0,
49
- item: idx => result.rows._array[idx]
49
+ item: idx => {
50
+ var _result$rows;
51
+ return (_result$rows = result.rows) === null || _result$rows === void 0 ? void 0 : _result$rows._array[idx];
52
+ }
50
53
  };
51
54
  } else {
52
- result.rows.item = idx => result.rows._array[idx];
55
+ result.rows.item = idx => {
56
+ var _result$rows2;
57
+ return (_result$rows2 = result.rows) === null || _result$rows2 === void 0 ? void 0 : _result$rows2._array[idx];
58
+ };
53
59
  }
54
- };
60
+ }
55
61
  const _open = OPSQLite.open;
56
62
  OPSQLite.open = (dbName, location, inMemory) => {
57
- _open(dbName, location);
63
+ _open(dbName, location, !!inMemory);
58
64
  locks[dbName] = {
59
65
  queue: [],
60
66
  inProgress: false
@@ -67,13 +73,25 @@ OPSQLite.close = dbName => {
67
73
  };
68
74
  const _execute = OPSQLite.execute;
69
75
  OPSQLite.execute = (dbName, query, params) => {
70
- const result = _execute(dbName, query, params);
76
+ const sanitizedParams = params === null || params === void 0 ? void 0 : params.map(p => {
77
+ if (ArrayBuffer.isView(p)) {
78
+ return p.buffer;
79
+ }
80
+ return p;
81
+ });
82
+ const result = _execute(dbName, query, sanitizedParams);
71
83
  enhanceQueryResult(result);
72
84
  return result;
73
85
  };
74
86
  const _executeAsync = OPSQLite.executeAsync;
75
87
  OPSQLite.executeAsync = async (dbName, query, params) => {
76
- const res = await _executeAsync(dbName, query, params);
88
+ const sanitizedParams = params === null || params === void 0 ? void 0 : params.map(p => {
89
+ if (ArrayBuffer.isView(p)) {
90
+ return p.buffer;
91
+ }
92
+ return p;
93
+ });
94
+ const res = await _executeAsync(dbName, query, sanitizedParams);
77
95
  enhanceQueryResult(res);
78
96
  return res;
79
97
  };
@@ -160,6 +178,9 @@ const startNextTransaction = dbName => {
160
178
  if (locks[dbName].queue.length) {
161
179
  locks[dbName].inProgress = true;
162
180
  const tx = locks[dbName].queue.shift();
181
+ if (!tx) {
182
+ throw new Error('Could not get a operation on datebase');
183
+ }
163
184
  setImmediate(() => {
164
185
  tx.start();
165
186
  });
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","global","__OPSQLiteProxy","OPSQLiteModule","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void> | void\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nconst enhanceQueryResult = (result: QueryResult): void => {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows._array[idx];\n }\n};\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const result = _execute(dbName, query, params);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const res = await _executeAsync(dbName, query, params);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void> | void) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void> | void) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["NativeModules","global","__OPSQLiteProxy","OPSQLiteModule","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n };\n};\n"],"mappings":"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"}
@@ -82,7 +82,7 @@ interface ISQLite {
82
82
  delete: (dbName: string, location?: string) => void;
83
83
  attach: (mainDbName: string, dbNameToAttach: string, alias: string, location?: string) => void;
84
84
  detach: (mainDbName: string, alias: string) => void;
85
- transaction: (dbName: string, fn: (tx: Transaction) => Promise<void> | void) => Promise<void>;
85
+ transaction: (dbName: string, fn: (tx: Transaction) => Promise<void>) => Promise<void>;
86
86
  execute: (dbName: string, query: string, params?: any[]) => QueryResult;
87
87
  executeAsync: (dbName: string, query: string, params?: any[]) => Promise<QueryResult>;
88
88
  executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;
@@ -94,7 +94,7 @@ export type OPSQLiteConnection = {
94
94
  delete: () => void;
95
95
  attach: (dbNameToAttach: string, alias: string, location?: string) => void;
96
96
  detach: (alias: string) => void;
97
- transaction: (fn: (tx: Transaction) => Promise<void> | void) => Promise<void>;
97
+ transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;
98
98
  execute: (query: string, params?: any[]) => QueryResult;
99
99
  executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;
100
100
  executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@op-engineering/op-sqlite",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Next generation SQLite for React Native",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/index.ts CHANGED
@@ -143,7 +143,7 @@ interface ISQLite {
143
143
  detach: (mainDbName: string, alias: string) => void;
144
144
  transaction: (
145
145
  dbName: string,
146
- fn: (tx: Transaction) => Promise<void> | void
146
+ fn: (tx: Transaction) => Promise<void>
147
147
  ) => Promise<void>;
148
148
  execute: (dbName: string, query: string, params?: any[]) => QueryResult;
149
149
  executeAsync: (
@@ -167,22 +167,22 @@ const locks: Record<
167
167
  // Enhance some host functions
168
168
 
169
169
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
170
- const enhanceQueryResult = (result: QueryResult): void => {
170
+ function enhanceQueryResult(result: QueryResult): void {
171
171
  // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work
172
172
  if (result.rows == null) {
173
173
  result.rows = {
174
174
  _array: [],
175
175
  length: 0,
176
- item: (idx: number) => result.rows._array[idx],
176
+ item: (idx: number) => result.rows?._array[idx],
177
177
  };
178
178
  } else {
179
- result.rows.item = (idx: number) => result.rows._array[idx];
179
+ result.rows.item = (idx: number) => result.rows?._array[idx];
180
180
  }
181
- };
181
+ }
182
182
 
183
183
  const _open = OPSQLite.open;
184
184
  OPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {
185
- _open(dbName, location);
185
+ _open(dbName, location, !!inMemory);
186
186
 
187
187
  locks[dbName] = {
188
188
  queue: [],
@@ -202,7 +202,15 @@ OPSQLite.execute = (
202
202
  query: string,
203
203
  params?: any[] | undefined
204
204
  ): QueryResult => {
205
- const result = _execute(dbName, query, params);
205
+ const sanitizedParams = params?.map((p) => {
206
+ if (ArrayBuffer.isView(p)) {
207
+ return p.buffer;
208
+ }
209
+
210
+ return p;
211
+ });
212
+
213
+ const result = _execute(dbName, query, sanitizedParams);
206
214
  enhanceQueryResult(result);
207
215
  return result;
208
216
  };
@@ -213,7 +221,15 @@ OPSQLite.executeAsync = async (
213
221
  query: string,
214
222
  params?: any[] | undefined
215
223
  ): Promise<QueryResult> => {
216
- const res = await _executeAsync(dbName, query, params);
224
+ const sanitizedParams = params?.map((p) => {
225
+ if (ArrayBuffer.isView(p)) {
226
+ return p.buffer;
227
+ }
228
+
229
+ return p;
230
+ });
231
+
232
+ const res = await _executeAsync(dbName, query, sanitizedParams);
217
233
  enhanceQueryResult(res);
218
234
  return res;
219
235
  };
@@ -325,6 +341,11 @@ const startNextTransaction = (dbName: string) => {
325
341
  if (locks[dbName].queue.length) {
326
342
  locks[dbName].inProgress = true;
327
343
  const tx = locks[dbName].queue.shift();
344
+
345
+ if (!tx) {
346
+ throw new Error('Could not get a operation on datebase');
347
+ }
348
+
328
349
  setImmediate(() => {
329
350
  tx.start();
330
351
  });
@@ -336,7 +357,7 @@ export type OPSQLiteConnection = {
336
357
  delete: () => void;
337
358
  attach: (dbNameToAttach: string, alias: string, location?: string) => void;
338
359
  detach: (alias: string) => void;
339
- transaction: (fn: (tx: Transaction) => Promise<void> | void) => Promise<void>;
360
+ transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;
340
361
  execute: (query: string, params?: any[]) => QueryResult;
341
362
  executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;
342
363
  executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;
@@ -357,7 +378,7 @@ export const open = (options: {
357
378
  attach: (dbNameToAttach: string, alias: string, location?: string) =>
358
379
  OPSQLite.attach(options.name, dbNameToAttach, alias, location),
359
380
  detach: (alias: string) => OPSQLite.detach(options.name, alias),
360
- transaction: (fn: (tx: Transaction) => Promise<void> | void) =>
381
+ transaction: (fn: (tx: Transaction) => Promise<void>) =>
361
382
  OPSQLite.transaction(options.name, fn),
362
383
  execute: (query: string, params?: any[] | undefined): QueryResult =>
363
384
  OPSQLite.execute(options.name, query, params),