This repository has been archived by the owner on Jun 4, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathddo_websql.dart
130 lines (112 loc) · 3.11 KB
/
ddo_websql.dart
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import '../ddo.dart';
import 'dart:web_sql';
import 'dart:async';
import 'dart:html';
@MirrorsUsed(
targets: 'DDOWebSQL',
override: '*'
)
import 'dart:mirrors';
class DDOWebSQL extends Driver {
SqlDatabase _db;
DDOWebSQL({String name, String version: '1', String displayName: null, int estimatedSize: null, DatabaseCallback callback: null}) {
if (displayName == null) {
displayName = name;
}
if (estimatedSize == null) {
estimatedSize = 1024 * 1024 * 4;
}
_db = window.openDatabase(name, version, displayName, estimatedSize, callback);
dbinfo = {
'dbname': name,
'version': version,
'displayName': displayName,
'estimatedSize': estimatedSize,
'driver': 'websql',
};
}
@override
Future beginTransaction() => new Future.value(false);
@override
bool close() => _close();
@override
Future commit() => new Future.value(false);
@override
Object getAttribute(int attr) => false;
@override
String quote(String value) => "'${value.replaceAll("'", "''")}'";
@override
Object quoteIdentifier(Object val) {
if (val is List) {
return (val.map((v) => quoteIdentifier(v)).toList());
}
if (val is String) {
if (val.indexOf('[') != -1 || val.indexOf(' ') != -1 || val.indexOf('(') != -1 || val.indexOf('*') != -1) {
return val;
}
return '[${val.replaceAll('.', '].[')}]';
}
return val;
}
@override
Future rollBack() => new Future.value(false);
@override
bool setAttribute(int attr, Object mixed) {
bool result = false;
if (attr == DDO.ATTR_ERRMODE && mixed == DDO.ERRMODE_EXCEPTION) {
throwExceptions = true;
} else if (attr == DDO.ATTR_STATEMENT_CLASS && (mixed as List<String>).elementAt(0) == 'LoggedPDOStatement') {
logging = true;
}
if (attr == DDO.ATTR_PERSISTENT && mixed != persistent) {
//Websql doesn't have persistent
}
return result;
}
bool _close() {
_db = null;
return true;
}
@override
Future<DDOResults> uQuery(String query) {
//Because the WebSQL was written before the async stuff was fully in place and hasn't been updated, we have to wrap it ourselves
Completer completer = new Completer();
_db.transaction((SqlTransaction tx) {
tx.executeSql(query, [], (tx, SqlResultSet results) {
DDOResults retres = new DDOResults();
try {
if (results.insertId != null) {
retres.insertId = results.insertId;
}
} catch (e) {
// Nope, wasn't there.
}
if (results.rowsAffected != null) {
retres.affectedRows = results.rowsAffected;
}
retres.fields = new List<String>();
if(results.rows.isNotEmpty) {
Map f = results.rows.elementAt(0);
for(String name in f.keys) {
retres.fields.add(name);
}
}
for (Map row in results.rows) {
retres.add(new DDOResult.fromMap(row));
}
completer.complete(retres);
}, (tx, SqlError err){
completer.completeError(err);
});
});
return completer.future;
}
String applyLimit(String sql, int offset, int limit) {
if (limit >0) {
sql = "${sql} LIMIT ${limit} ${offset > 0 ? ' OFFSET' : ''}";
} else if (offset > 0) {
sql = "${sql} LIMIT -1 OFFSET ${offset}";
}
return sql;
}
}