UNPKG

2.62 kBJavaScriptView Raw
1import map from 'lodash.map';
2import zipObject from 'lodash.zipobject';
3
4import customOpenDatabase from 'websql/custom';
5
6import { NativeModules, Platform } from 'react-native';
7const { ExponentSQLite } = NativeModules;
8
9if (!process.nextTick) {
10 process.nextTick = callback => setTimeout(callback, 0);
11}
12
13function SQLiteResult(error, insertId, rowsAffected, rows) {
14 this.error = error;
15 this.insertId = insertId;
16 this.rowsAffected = rowsAffected;
17 this.rows = rows;
18}
19
20function massageError(err) {
21 return typeof err === 'string' ? new Error(err) : err;
22}
23
24function SQLiteDatabase(name) {
25 this._name = name;
26}
27
28function dearrayifyRow(res) {
29 // use a compressed array format to send minimal data between
30 // native and web layers
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 // v8 likes predictable objects
48 return new SQLiteResult(null, insertId, rowsAffected, zippedRows);
49}
50
51// send less data over the wire, use an array
52function arrayifyQuery(query) {
53 return [query.sql, escapeForAndroid(query.args || [])];
54}
55
56// for avoiding strings truncated with '\u0000'
57function escapeForAndroid(args) {
58 if (Platform.OS === 'android') {
59 return JSON.stringify(args);
60 } else {
61 return args;
62 }
63}
64
65SQLiteDatabase.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
81const openDB = customOpenDatabase(SQLiteDatabase);
82
83function openDatabase(name, version, description, size, callback) {
84 if (name && typeof name === 'object') {
85 // accept SQLite Plugin 1-style object here
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
107export default {
108 openDatabase,
109};