UNPKG

2.35 kBJavaScriptView Raw
1import './timer/polyfillNextTick';
2import zipObject from 'lodash.zipobject';
3import { NativeModules, Platform } from 'react-native';
4import customOpenDatabase from '@expo/websql/custom';
5const { ExponentSQLite } = NativeModules;
6class SQLiteDatabase {
7 constructor(name) {
8 this._closed = false;
9 this._name = name;
10 }
11 exec(queries, readOnly, callback) {
12 if (this._closed) {
13 throw new Error(`The SQLite database is closed`);
14 }
15 ExponentSQLite.exec(this._name, queries.map(_serializeQuery), readOnly).then(nativeResultSets => {
16 callback(null, nativeResultSets.map(_deserializeResultSet));
17 }, error => {
18 // TODO: make the native API consistently reject with an error, not a string or other type
19 callback(error instanceof Error ? error : new Error(error));
20 });
21 }
22 close() {
23 this._closed = true;
24 ExponentSQLite.close(this._name);
25 }
26}
27function _serializeQuery(query) {
28 return [query.sql, Platform.OS === 'android' ? query.args.map(_escapeBlob) : query.args];
29}
30function _deserializeResultSet(nativeResult) {
31 let [errorMessage, insertId, rowsAffected, columns, rows] = nativeResult;
32 // TODO: send more structured error information from the native module so we can better construct
33 // a SQLException object
34 if (errorMessage !== null) {
35 return { error: new Error(errorMessage) };
36 }
37 return {
38 insertId,
39 rowsAffected,
40 rows: rows.map(row => zipObject(columns, row)),
41 };
42}
43function _escapeBlob(data) {
44 if (typeof data === 'string') {
45 /* eslint-disable no-control-regex */
46 return data
47 .replace(/\u0002/g, '\u0002\u0002')
48 .replace(/\u0001/g, '\u0001\u0002')
49 .replace(/\u0000/g, '\u0001\u0001');
50 /* eslint-enable no-control-regex */
51 }
52 else {
53 return data;
54 }
55}
56const _openExpoSQLiteDatabase = customOpenDatabase(SQLiteDatabase);
57export function openDatabase(name, version = '1.0', description = name, size = 1, callback) {
58 if (name === undefined) {
59 throw new TypeError(`The database name must not be undefined`);
60 }
61 return _openExpoSQLiteDatabase(name, version, description, size, callback);
62}
63export default {
64 openDatabase,
65};
66//# sourceMappingURL=SQLite.js.map
\No newline at end of file