1 | import map from 'lodash.map';
|
2 | import zipObject from 'lodash.zipobject';
|
3 |
|
4 | import customOpenDatabase from 'websql/custom';
|
5 |
|
6 | import { NativeModules, Platform } from 'react-native';
|
7 | const { ExponentSQLite } = NativeModules;
|
8 |
|
9 | if (!process.nextTick) {
|
10 | process.nextTick = callback => setTimeout(callback, 0);
|
11 | }
|
12 |
|
13 | function SQLiteResult(error, insertId, rowsAffected, rows) {
|
14 | this.error = error;
|
15 | this.insertId = insertId;
|
16 | this.rowsAffected = rowsAffected;
|
17 | this.rows = rows;
|
18 | }
|
19 |
|
20 | function massageError(err) {
|
21 | return typeof err === 'string' ? new Error(err) : err;
|
22 | }
|
23 |
|
24 | function SQLiteDatabase(name) {
|
25 | this._name = name;
|
26 | }
|
27 |
|
28 | function dearrayifyRow(res) {
|
29 |
|
30 |
|
31 | var rawError = res[0];
|
32 | if (rawError) {
|
33 | return new SQLiteResult(massageError(res[0]));
|
34 | }
|
35 | var insertId = res[1];
|
36 | if (insertId === null) {
|
37 | insertId = undefined;
|
38 | }
|
39 | var rowsAffected = res[2];
|
40 | var columns = res[3];
|
41 | var rows = res[4];
|
42 | var zippedRows = [];
|
43 | for (var i = 0, len = rows.length; i < len; i++) {
|
44 | zippedRows.push(zipObject(columns, rows[i]));
|
45 | }
|
46 |
|
47 |
|
48 | return new SQLiteResult(null, insertId, rowsAffected, zippedRows);
|
49 | }
|
50 |
|
51 |
|
52 | function arrayifyQuery(query) {
|
53 | return [query.sql, escapeForAndroid(query.args || [])];
|
54 | }
|
55 |
|
56 |
|
57 | function escapeForAndroid(args) {
|
58 | if (Platform.OS === 'android') {
|
59 | return JSON.stringify(args);
|
60 | } else {
|
61 | return args;
|
62 | }
|
63 | }
|
64 |
|
65 | SQLiteDatabase.prototype.exec = function exec(queries, readOnly, callback) {
|
66 | function onSuccess(rawResults) {
|
67 | var results = map(rawResults, dearrayifyRow);
|
68 | callback(null, results);
|
69 | }
|
70 |
|
71 | function onError(err) {
|
72 | callback(massageError(err));
|
73 | }
|
74 |
|
75 | ExponentSQLite.exec(this._name, map(queries, arrayifyQuery), readOnly).then(
|
76 | onSuccess,
|
77 | onError
|
78 | );
|
79 | };
|
80 |
|
81 | const openDB = customOpenDatabase(SQLiteDatabase);
|
82 |
|
83 | function openDatabase(name, version, description, size, callback) {
|
84 | if (name && typeof name === 'object') {
|
85 |
|
86 | callback = version;
|
87 | size = name.size;
|
88 | description = name.description;
|
89 | version = name.version;
|
90 | name = name.name;
|
91 | }
|
92 | if (!size) {
|
93 | size = 1;
|
94 | }
|
95 | if (!description) {
|
96 | description = name;
|
97 | }
|
98 | if (!version) {
|
99 | version = '1.0';
|
100 | }
|
101 | if (typeof name === 'undefined') {
|
102 | throw new Error('please be sure to call: openDatabase("myname.db")');
|
103 | }
|
104 | return openDB(name, version, description, size, callback);
|
105 | }
|
106 |
|
107 | export default {
|
108 | openDatabase,
|
109 | };
|