-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathsqlite3.ios.js
109 lines (96 loc) · 2.65 KB
/
sqlite3.ios.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// @flow
var NativeModules = require('react-native').NativeModules;
var nextId = 0;
function SQLite3Error(message: any) {
this.message = message;
}
SQLite3Error.prototype = new Error();
function Database(databaseName, openCallback) {
this._databaseId = null;
this._databaseName = databaseName;
// List of actions pending database connection
this._pendingActions = [];
NativeModules.AIBSQLite.openFromFilename(databaseName, (error, databaseId) => {
if (error) {
error = new SQLite3Error(error);
this._failPendingActions(error);
return openCallback(error, null);
}
this._databaseId = databaseId;
this._runPendingActions();
openCallback(null, this);
});
}
Database.prototype = {
getName(): string {
return this._databaseName;
},
executeSQL (
sql: string,
params: Array<?(number|string)>,
rowCallback: ((row: Object) => void),
completeCallback: ((error: ?SQLite3Error) => void)
) : void {
this._addAction(completeCallback, (callback) => {
NativeModules.AIBSQLite.prepareStatement(this._databaseId, sql, params, (error, statementId) => {
if (error) {
completeCallback(new SQLite3Error(error));
return;
}
var next = () => {
NativeModules.AIBSQLite.stepStatement(this._databaseId, statementId, (error, row) => {
if (error) {
completeCallback(new SQLite3Error(error));
return;
}
if (row === null) {
completeCallback(null);
} else {
try {
rowCallback(row);
} finally {
next();
}
}
});
};
next();
});
});
},
close(callback: ?(error: ?SQLite3Error) => void) {
NativeModules.AIBSQLite.closeDatabase(this._databaseId, (error) => {
if (!callback) return;
if (error) {
callback(new SQLite3Error(error));
} else {
callback(null);
}
});
},
_addAction(callback, action) {
if (this._databaseId) {
action(callback);
} else {
this._pendingActions.push({action, callback});
}
},
_runPendingActions () {
this._pendingActions.forEach(
({action, callback}) => {
action(callback);
});
},
_failPendingActions (error) {
this._pendingActions.forEach(
({action, callback}) => {
callback(error);
});
}
};
module.exports = {
SQLite3Error: SQLite3Error,
open (databaseName: string, callback: ?((error: ?SQLite3Error, database: ?Database) => void) ) : Database {
return new Database(databaseName, callback || ((e) => null));
}
};