@aws-amplify/datastore-storage-adapter 2.1.32 → 2.1.33-s-auth.30d0cd2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/cjs/ExpoSQLiteAdapter/ExpoSQLiteDatabase.js +37 -27
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/cjs/SQLiteAdapter/SQLiteDatabase.js +4 -2
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/cjs/common/CommonSQLiteAdapter.js +16 -14
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/cjs/common/SQLiteUtils.js +15 -12
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/ExpoSQLiteAdapter/ExpoSQLiteDatabase.js +37 -27
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/SQLiteAdapter/SQLiteDatabase.js +4 -2
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/common/CommonSQLiteAdapter.d.ts +1 -1
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/common/CommonSQLiteAdapter.js +17 -15
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/common/SQLiteUtils.d.ts +1 -1
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/common/SQLiteUtils.js +16 -13
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/esm/common/types.d.ts +1 -1
- package/.rollup.cache/home/runner/work/amplify-js/amplify-js/amplify-js/packages/datastore-storage-adapter/dist/meta/cjs.tsbuildinfo +1 -1
- package/dist/cjs/ExpoSQLiteAdapter/ExpoSQLiteDatabase.js +37 -27
- package/dist/cjs/ExpoSQLiteAdapter/ExpoSQLiteDatabase.js.map +1 -1
- package/dist/cjs/SQLiteAdapter/SQLiteDatabase.js +4 -2
- package/dist/cjs/SQLiteAdapter/SQLiteDatabase.js.map +1 -1
- package/dist/cjs/common/CommonSQLiteAdapter.js +16 -14
- package/dist/cjs/common/CommonSQLiteAdapter.js.map +1 -1
- package/dist/cjs/common/SQLiteUtils.js +15 -12
- package/dist/cjs/common/SQLiteUtils.js.map +1 -1
- package/dist/esm/ExpoSQLiteAdapter/ExpoSQLiteDatabase.mjs +37 -27
- package/dist/esm/ExpoSQLiteAdapter/ExpoSQLiteDatabase.mjs.map +1 -1
- package/dist/esm/SQLiteAdapter/SQLiteDatabase.mjs +4 -2
- package/dist/esm/SQLiteAdapter/SQLiteDatabase.mjs.map +1 -1
- package/dist/esm/common/CommonSQLiteAdapter.d.ts +1 -1
- package/dist/esm/common/CommonSQLiteAdapter.mjs +16 -14
- package/dist/esm/common/CommonSQLiteAdapter.mjs.map +1 -1
- package/dist/esm/common/SQLiteUtils.d.ts +1 -1
- package/dist/esm/common/SQLiteUtils.mjs +15 -12
- package/dist/esm/common/SQLiteUtils.mjs.map +1 -1
- package/dist/esm/common/types.d.ts +1 -1
- package/dist/meta/cjs.tsbuildinfo +1 -1
- package/dist/umd/aws-amplify-datastore-sqlite-adapter-expo.js +97 -82
- package/dist/umd/aws-amplify-datastore-sqlite-adapter-expo.js.map +1 -1
- package/dist/umd/aws-amplify-datastore-sqlite-adapter-expo.min.js +1 -1
- package/dist/umd/aws-amplify-datastore-sqlite-adapter-expo.min.js.map +1 -1
- package/dist/umd/aws-amplify-datastore-storage-adapter.js +64 -57
- package/dist/umd/aws-amplify-datastore-storage-adapter.js.map +1 -1
- package/dist/umd/aws-amplify-datastore-storage-adapter.min.js +1 -1
- package/dist/umd/aws-amplify-datastore-storage-adapter.min.js.map +1 -1
- package/package.json +47 -46
- package/src/ExpoSQLiteAdapter/ExpoSQLiteAdapter.ts +1 -0
- package/src/ExpoSQLiteAdapter/ExpoSQLiteDatabase.ts +49 -31
- package/src/SQLiteAdapter/SQLiteAdapter.ts +1 -0
- package/src/SQLiteAdapter/SQLiteDatabase.ts +12 -3
- package/src/common/CommonSQLiteAdapter.ts +45 -32
- package/src/common/SQLiteUtils.ts +37 -28
- package/src/common/types.ts +1 -1
- package/src/index.ts +1 -0
|
@@ -74,14 +74,16 @@ class ExpoSQLiteDatabase {
|
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
batchQuery(queryParameterizedStatements = new Set()) {
|
|
77
|
-
return new Promise((
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const resolveTransaction = resolve;
|
|
79
|
+
const rejectTransaction = reject;
|
|
78
80
|
this.db.transaction(async (transaction) => {
|
|
79
81
|
try {
|
|
80
|
-
const results = await Promise.all([...queryParameterizedStatements].map(([statement, params]) => new Promise((
|
|
82
|
+
const results = await Promise.all([...queryParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
81
83
|
transaction.executeSql(statement, params, (_, result) => {
|
|
82
|
-
|
|
84
|
+
_resolve(result.rows._array[0]);
|
|
83
85
|
}, (_, error) => {
|
|
84
|
-
|
|
86
|
+
_reject(error);
|
|
85
87
|
logger.warn(error);
|
|
86
88
|
return true;
|
|
87
89
|
});
|
|
@@ -96,27 +98,31 @@ class ExpoSQLiteDatabase {
|
|
|
96
98
|
});
|
|
97
99
|
}
|
|
98
100
|
batchSave(saveParameterizedStatements = new Set(), deleteParameterizedStatements) {
|
|
99
|
-
return new Promise((
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
const resolveTransaction = resolve;
|
|
103
|
+
const rejectTransaction = reject;
|
|
100
104
|
this.db.transaction(async (transaction) => {
|
|
101
105
|
try {
|
|
102
106
|
// await for all sql statements promises to resolve
|
|
103
|
-
await Promise.all([...saveParameterizedStatements].map(([statement, params]) => new Promise((
|
|
107
|
+
await Promise.all([...saveParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
104
108
|
transaction.executeSql(statement, params, () => {
|
|
105
|
-
|
|
109
|
+
_resolve(null);
|
|
106
110
|
}, (_, error) => {
|
|
107
|
-
|
|
111
|
+
_reject(error);
|
|
108
112
|
logger.warn(error);
|
|
109
113
|
return true;
|
|
110
114
|
});
|
|
111
115
|
})));
|
|
112
116
|
if (deleteParameterizedStatements) {
|
|
113
|
-
await Promise.all([...deleteParameterizedStatements].map(([statement, params]) => new Promise((
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
await Promise.all([...deleteParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
118
|
+
transaction.executeSql(statement, params, () => {
|
|
119
|
+
_resolve(null);
|
|
120
|
+
}, (_, error) => {
|
|
121
|
+
_reject(error);
|
|
122
|
+
logger.warn(error);
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
})));
|
|
120
126
|
}
|
|
121
127
|
resolveTransaction(null);
|
|
122
128
|
}
|
|
@@ -130,23 +136,25 @@ class ExpoSQLiteDatabase {
|
|
|
130
136
|
selectAndDelete(queryParameterizedStatement, deleteParameterizedStatement) {
|
|
131
137
|
const [queryStatement, queryParams] = queryParameterizedStatement;
|
|
132
138
|
const [deleteStatement, deleteParams] = deleteParameterizedStatement;
|
|
133
|
-
return new Promise((
|
|
139
|
+
return new Promise((resolve, reject) => {
|
|
140
|
+
const resolveTransaction = resolve;
|
|
141
|
+
const rejectTransaction = reject;
|
|
134
142
|
this.db.transaction(async (transaction) => {
|
|
135
143
|
try {
|
|
136
|
-
const result = await new Promise((
|
|
137
|
-
transaction.executeSql(queryStatement, queryParams, (_,
|
|
138
|
-
|
|
144
|
+
const result = await new Promise((_resolve, _reject) => {
|
|
145
|
+
transaction.executeSql(queryStatement, queryParams, (_, sqlResult) => {
|
|
146
|
+
_resolve(sqlResult.rows._array || []);
|
|
139
147
|
}, (_, error) => {
|
|
140
|
-
|
|
148
|
+
_reject(error);
|
|
141
149
|
logger.warn(error);
|
|
142
150
|
return true;
|
|
143
151
|
});
|
|
144
152
|
});
|
|
145
|
-
await new Promise((
|
|
153
|
+
await new Promise((_resolve, _reject) => {
|
|
146
154
|
transaction.executeSql(deleteStatement, deleteParams, () => {
|
|
147
|
-
|
|
155
|
+
_resolve(null);
|
|
148
156
|
}, (_, error) => {
|
|
149
|
-
|
|
157
|
+
_reject(error);
|
|
150
158
|
logger.warn(error);
|
|
151
159
|
return true;
|
|
152
160
|
});
|
|
@@ -161,14 +169,16 @@ class ExpoSQLiteDatabase {
|
|
|
161
169
|
});
|
|
162
170
|
}
|
|
163
171
|
executeStatements(statements) {
|
|
164
|
-
return new Promise((
|
|
172
|
+
return new Promise((resolve, reject) => {
|
|
173
|
+
const resolveTransaction = resolve;
|
|
174
|
+
const rejectTransaction = reject;
|
|
165
175
|
this.db.transaction(async (transaction) => {
|
|
166
176
|
try {
|
|
167
|
-
await Promise.all(statements.map(statement => new Promise((
|
|
177
|
+
await Promise.all(statements.map(statement => new Promise((_resolve, _reject) => {
|
|
168
178
|
transaction.executeSql(statement, [], () => {
|
|
169
|
-
|
|
179
|
+
_resolve(null);
|
|
170
180
|
}, (_, error) => {
|
|
171
|
-
|
|
181
|
+
_reject(error);
|
|
172
182
|
return true;
|
|
173
183
|
});
|
|
174
184
|
})));
|
|
@@ -34,7 +34,7 @@ class SQLiteDatabase {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
async createSchema(statements) {
|
|
37
|
-
|
|
37
|
+
await this.executeStatements(statements);
|
|
38
38
|
}
|
|
39
39
|
async clear() {
|
|
40
40
|
await this.closeDB();
|
|
@@ -91,7 +91,9 @@ class SQLiteDatabase {
|
|
|
91
91
|
tx.executeSql(queryStatement, queryParams, (_, res) => {
|
|
92
92
|
results = res.rows.raw();
|
|
93
93
|
}, logger.warn);
|
|
94
|
-
tx.executeSql(deleteStatement, deleteParams, () => {
|
|
94
|
+
tx.executeSql(deleteStatement, deleteParams, () => {
|
|
95
|
+
// no-op
|
|
96
|
+
}, logger.warn);
|
|
95
97
|
});
|
|
96
98
|
return results;
|
|
97
99
|
}
|
|
@@ -4,8 +4,8 @@ exports.CommonSQLiteAdapter = void 0;
|
|
|
4
4
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
5
5
|
// SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
const core_1 = require("@aws-amplify/core");
|
|
7
|
-
const SQLiteUtils_1 = require("../common/SQLiteUtils");
|
|
8
7
|
const datastore_1 = require("@aws-amplify/datastore");
|
|
8
|
+
const SQLiteUtils_1 = require("../common/SQLiteUtils");
|
|
9
9
|
const { traverseModel, validatePredicate, isModelConstructor } = datastore_1.utils;
|
|
10
10
|
const logger = new core_1.ConsoleLogger('DataStore');
|
|
11
11
|
class CommonSQLiteAdapter {
|
|
@@ -14,9 +14,9 @@ class CommonSQLiteAdapter {
|
|
|
14
14
|
}
|
|
15
15
|
async setUp(theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
|
|
16
16
|
if (!this.initPromise) {
|
|
17
|
-
this.initPromise = new Promise((
|
|
18
|
-
this.resolve =
|
|
19
|
-
this.reject =
|
|
17
|
+
this.initPromise = new Promise((_resolve, _reject) => {
|
|
18
|
+
this.resolve = _resolve;
|
|
19
|
+
this.reject = _reject;
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
@@ -28,7 +28,9 @@ class CommonSQLiteAdapter {
|
|
|
28
28
|
this.modelInstanceCreator = modelInstanceCreator;
|
|
29
29
|
this.getModelConstructorByModelName = getModelConstructorByModelName;
|
|
30
30
|
try {
|
|
31
|
-
const usesCPKCodegen = Object.values(this.schema.namespaces.user.models).some(model => Object.values(model.fields).some(field =>
|
|
31
|
+
const usesCPKCodegen = Object.values(this.schema.namespaces.user.models).some(model => Object.values(model.fields).some(field =>
|
|
32
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
33
|
+
field.association?.hasOwnProperty('targetNames')));
|
|
32
34
|
if (usesCPKCodegen) {
|
|
33
35
|
logger.error('The SQLite adapter does not support schemas using custom primary key. Set `graphQLTransformer.respectPrimaryKeyAttributesOnConnectionField in `amplify/cli.json` to false to disable custom primary key. To regenerate your API, add or remove an empty newline to your GraphQL schema (to change the computed hash) then run `amplify push`.');
|
|
34
36
|
}
|
|
@@ -70,10 +72,10 @@ class CommonSQLiteAdapter {
|
|
|
70
72
|
for await (const resItem of connectionStoreNames) {
|
|
71
73
|
const { modelName, item, instance } = resItem;
|
|
72
74
|
const { id } = item;
|
|
73
|
-
const [
|
|
74
|
-
const
|
|
75
|
-
const opType =
|
|
76
|
-
const saveStatement =
|
|
75
|
+
const [queryStatementForRestItem, paramsForRestItem] = (0, SQLiteUtils_1.queryByIdStatement)(id, modelName);
|
|
76
|
+
const fromDBForRestItem = await this.db.get(queryStatementForRestItem, paramsForRestItem);
|
|
77
|
+
const opType = fromDBForRestItem === undefined ? datastore_1.OpType.INSERT : datastore_1.OpType.UPDATE;
|
|
78
|
+
const saveStatement = fromDBForRestItem
|
|
77
79
|
? (0, SQLiteUtils_1.modelUpdateStatement)(instance, modelName)
|
|
78
80
|
: (0, SQLiteUtils_1.modelInsertStatement)(instance, modelName);
|
|
79
81
|
if (id === model.id || opType === datastore_1.OpType.INSERT) {
|
|
@@ -114,15 +116,15 @@ class CommonSQLiteAdapter {
|
|
|
114
116
|
const limit = pagination && pagination.limit;
|
|
115
117
|
const page = limit && pagination.page;
|
|
116
118
|
const queryById = predicates && this.idFromPredicate(predicates);
|
|
117
|
-
const records = await (async () => {
|
|
119
|
+
const records = (await (async () => {
|
|
118
120
|
if (queryById) {
|
|
119
121
|
const record = await this.getById(tableName, queryById);
|
|
120
122
|
return record ? [record] : [];
|
|
121
123
|
}
|
|
122
124
|
const [queryStatement, params] = (0, SQLiteUtils_1.queryAllStatement)(tableName, predicates, sortPredicates, limit, page);
|
|
123
|
-
return
|
|
124
|
-
})();
|
|
125
|
-
return
|
|
125
|
+
return this.db.getAll(queryStatement, params);
|
|
126
|
+
})());
|
|
127
|
+
return this.load(namespaceName, modelConstructor.name, records);
|
|
126
128
|
}
|
|
127
129
|
async getById(tableName, id) {
|
|
128
130
|
const [queryStatement, params] = (0, SQLiteUtils_1.queryByIdStatement)(id, tableName);
|
|
@@ -203,7 +205,7 @@ class CommonSQLiteAdapter {
|
|
|
203
205
|
for (const item of items) {
|
|
204
206
|
const connectedModels = traverseModel(modelConstructor.name, this.modelInstanceCreator(modelConstructor, item), this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
|
|
205
207
|
const { id, _deleted } = item;
|
|
206
|
-
const { instance } = connectedModels.find(({ instance }) =>
|
|
208
|
+
const { instance } = connectedModels.find(({ instance: connectedModelInstance }) => connectedModelInstance.id === id);
|
|
207
209
|
if (_deleted) {
|
|
208
210
|
// create the delete statements right away
|
|
209
211
|
const deleteStatement = (0, SQLiteUtils_1.deleteByIdStatement)(instance.id, tableName);
|
|
@@ -58,9 +58,10 @@ function getSQLiteType(scalar) {
|
|
|
58
58
|
return 'TEXT';
|
|
59
59
|
case 'Float':
|
|
60
60
|
return 'REAL';
|
|
61
|
-
default:
|
|
61
|
+
default: {
|
|
62
62
|
const _ = scalar;
|
|
63
63
|
throw new Error(`unknown type ${scalar}`);
|
|
64
|
+
}
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
exports.getSQLiteType = getSQLiteType;
|
|
@@ -231,10 +232,11 @@ const whereConditionFromPredicateObject = ({ field, operator, operand, }) => {
|
|
|
231
232
|
case 'notContains':
|
|
232
233
|
statement = [`instr("${field}", ?) ${logicalOperator}`, [operand]];
|
|
233
234
|
break;
|
|
234
|
-
default:
|
|
235
|
+
default: {
|
|
235
236
|
const _ = logicalOperatorKey;
|
|
236
237
|
// Incorrect WHERE clause can result in data loss
|
|
237
238
|
throw new Error('Cannot map predicate to a valid WHERE clause');
|
|
239
|
+
}
|
|
238
240
|
}
|
|
239
241
|
return statement;
|
|
240
242
|
}
|
|
@@ -246,9 +248,9 @@ function whereClauseFromPredicate(predicate) {
|
|
|
246
248
|
recurse(predicate, result, params);
|
|
247
249
|
const whereClause = `WHERE ${result.join(' ')}`;
|
|
248
250
|
return [whereClause, params];
|
|
249
|
-
function recurse(
|
|
250
|
-
if ((0, datastore_1.isPredicateGroup)(
|
|
251
|
-
const { type: groupType, predicates: groupPredicates } =
|
|
251
|
+
function recurse(recursedPredicate, recursedResult = [], recursedParams = []) {
|
|
252
|
+
if ((0, datastore_1.isPredicateGroup)(recursedPredicate)) {
|
|
253
|
+
const { type: groupType, predicates: groupPredicates } = recursedPredicate;
|
|
252
254
|
let filterType = '';
|
|
253
255
|
let isNegation = false;
|
|
254
256
|
switch (groupType) {
|
|
@@ -261,20 +263,21 @@ function whereClauseFromPredicate(predicate) {
|
|
|
261
263
|
case 'or':
|
|
262
264
|
filterType = 'OR';
|
|
263
265
|
break;
|
|
264
|
-
default:
|
|
266
|
+
default: {
|
|
265
267
|
const _ = groupType;
|
|
266
268
|
throw new Error(`Invalid ${groupType}`);
|
|
269
|
+
}
|
|
267
270
|
}
|
|
268
271
|
const groupResult = [];
|
|
269
272
|
for (const p of groupPredicates) {
|
|
270
|
-
recurse(p, groupResult,
|
|
273
|
+
recurse(p, groupResult, recursedParams);
|
|
271
274
|
}
|
|
272
|
-
|
|
275
|
+
recursedResult.push(`${isNegation ? 'NOT' : ''}(${groupResult.join(` ${filterType} `)})`);
|
|
273
276
|
}
|
|
274
|
-
else if ((0, datastore_1.isPredicateObj)(
|
|
275
|
-
const [condition, conditionParams] = (0, exports.whereConditionFromPredicateObject)(
|
|
276
|
-
|
|
277
|
-
|
|
277
|
+
else if ((0, datastore_1.isPredicateObj)(recursedPredicate)) {
|
|
278
|
+
const [condition, conditionParams] = (0, exports.whereConditionFromPredicateObject)(recursedPredicate);
|
|
279
|
+
recursedResult.push(condition);
|
|
280
|
+
recursedParams.push(...conditionParams);
|
|
278
281
|
}
|
|
279
282
|
}
|
|
280
283
|
}
|
|
@@ -72,14 +72,16 @@ class ExpoSQLiteDatabase {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
batchQuery(queryParameterizedStatements = new Set()) {
|
|
75
|
-
return new Promise((
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const resolveTransaction = resolve;
|
|
77
|
+
const rejectTransaction = reject;
|
|
76
78
|
this.db.transaction(async (transaction) => {
|
|
77
79
|
try {
|
|
78
|
-
const results = await Promise.all([...queryParameterizedStatements].map(([statement, params]) => new Promise((
|
|
80
|
+
const results = await Promise.all([...queryParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
79
81
|
transaction.executeSql(statement, params, (_, result) => {
|
|
80
|
-
|
|
82
|
+
_resolve(result.rows._array[0]);
|
|
81
83
|
}, (_, error) => {
|
|
82
|
-
|
|
84
|
+
_reject(error);
|
|
83
85
|
logger.warn(error);
|
|
84
86
|
return true;
|
|
85
87
|
});
|
|
@@ -94,27 +96,31 @@ class ExpoSQLiteDatabase {
|
|
|
94
96
|
});
|
|
95
97
|
}
|
|
96
98
|
batchSave(saveParameterizedStatements = new Set(), deleteParameterizedStatements) {
|
|
97
|
-
return new Promise((
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const resolveTransaction = resolve;
|
|
101
|
+
const rejectTransaction = reject;
|
|
98
102
|
this.db.transaction(async (transaction) => {
|
|
99
103
|
try {
|
|
100
104
|
// await for all sql statements promises to resolve
|
|
101
|
-
await Promise.all([...saveParameterizedStatements].map(([statement, params]) => new Promise((
|
|
105
|
+
await Promise.all([...saveParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
102
106
|
transaction.executeSql(statement, params, () => {
|
|
103
|
-
|
|
107
|
+
_resolve(null);
|
|
104
108
|
}, (_, error) => {
|
|
105
|
-
|
|
109
|
+
_reject(error);
|
|
106
110
|
logger.warn(error);
|
|
107
111
|
return true;
|
|
108
112
|
});
|
|
109
113
|
})));
|
|
110
114
|
if (deleteParameterizedStatements) {
|
|
111
|
-
await Promise.all([...deleteParameterizedStatements].map(([statement, params]) => new Promise((
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
await Promise.all([...deleteParameterizedStatements].map(([statement, params]) => new Promise((_resolve, _reject) => {
|
|
116
|
+
transaction.executeSql(statement, params, () => {
|
|
117
|
+
_resolve(null);
|
|
118
|
+
}, (_, error) => {
|
|
119
|
+
_reject(error);
|
|
120
|
+
logger.warn(error);
|
|
121
|
+
return true;
|
|
122
|
+
});
|
|
123
|
+
})));
|
|
118
124
|
}
|
|
119
125
|
resolveTransaction(null);
|
|
120
126
|
}
|
|
@@ -128,23 +134,25 @@ class ExpoSQLiteDatabase {
|
|
|
128
134
|
selectAndDelete(queryParameterizedStatement, deleteParameterizedStatement) {
|
|
129
135
|
const [queryStatement, queryParams] = queryParameterizedStatement;
|
|
130
136
|
const [deleteStatement, deleteParams] = deleteParameterizedStatement;
|
|
131
|
-
return new Promise((
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const resolveTransaction = resolve;
|
|
139
|
+
const rejectTransaction = reject;
|
|
132
140
|
this.db.transaction(async (transaction) => {
|
|
133
141
|
try {
|
|
134
|
-
const result = await new Promise((
|
|
135
|
-
transaction.executeSql(queryStatement, queryParams, (_,
|
|
136
|
-
|
|
142
|
+
const result = await new Promise((_resolve, _reject) => {
|
|
143
|
+
transaction.executeSql(queryStatement, queryParams, (_, sqlResult) => {
|
|
144
|
+
_resolve(sqlResult.rows._array || []);
|
|
137
145
|
}, (_, error) => {
|
|
138
|
-
|
|
146
|
+
_reject(error);
|
|
139
147
|
logger.warn(error);
|
|
140
148
|
return true;
|
|
141
149
|
});
|
|
142
150
|
});
|
|
143
|
-
await new Promise((
|
|
151
|
+
await new Promise((_resolve, _reject) => {
|
|
144
152
|
transaction.executeSql(deleteStatement, deleteParams, () => {
|
|
145
|
-
|
|
153
|
+
_resolve(null);
|
|
146
154
|
}, (_, error) => {
|
|
147
|
-
|
|
155
|
+
_reject(error);
|
|
148
156
|
logger.warn(error);
|
|
149
157
|
return true;
|
|
150
158
|
});
|
|
@@ -159,14 +167,16 @@ class ExpoSQLiteDatabase {
|
|
|
159
167
|
});
|
|
160
168
|
}
|
|
161
169
|
executeStatements(statements) {
|
|
162
|
-
return new Promise((
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
const resolveTransaction = resolve;
|
|
172
|
+
const rejectTransaction = reject;
|
|
163
173
|
this.db.transaction(async (transaction) => {
|
|
164
174
|
try {
|
|
165
|
-
await Promise.all(statements.map(statement => new Promise((
|
|
175
|
+
await Promise.all(statements.map(statement => new Promise((_resolve, _reject) => {
|
|
166
176
|
transaction.executeSql(statement, [], () => {
|
|
167
|
-
|
|
177
|
+
_resolve(null);
|
|
168
178
|
}, (_, error) => {
|
|
169
|
-
|
|
179
|
+
_reject(error);
|
|
170
180
|
return true;
|
|
171
181
|
});
|
|
172
182
|
})));
|
|
@@ -31,7 +31,7 @@ class SQLiteDatabase {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
async createSchema(statements) {
|
|
34
|
-
|
|
34
|
+
await this.executeStatements(statements);
|
|
35
35
|
}
|
|
36
36
|
async clear() {
|
|
37
37
|
await this.closeDB();
|
|
@@ -88,7 +88,9 @@ class SQLiteDatabase {
|
|
|
88
88
|
tx.executeSql(queryStatement, queryParams, (_, res) => {
|
|
89
89
|
results = res.rows.raw();
|
|
90
90
|
}, logger.warn);
|
|
91
|
-
tx.executeSql(deleteStatement, deleteParams, () => {
|
|
91
|
+
tx.executeSql(deleteStatement, deleteParams, () => {
|
|
92
|
+
// no-op
|
|
93
|
+
}, logger.warn);
|
|
92
94
|
});
|
|
93
95
|
return results;
|
|
94
96
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InternalSchema, ModelInstanceCreator, ModelPredicate, NAMESPACES, NamespaceResolver, OpType, PaginationInput, PersistentModel, PersistentModelConstructor, QueryOne, StorageAdapter } from '@aws-amplify/datastore';
|
|
2
2
|
import { CommonSQLiteDatabase, ModelInstanceMetadataWithId } from './types';
|
|
3
3
|
export declare class CommonSQLiteAdapter implements StorageAdapter {
|
|
4
4
|
private schema;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { ConsoleLogger } from '@aws-amplify/core';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { ModelPredicateCreator, ModelSortPredicateCreator, OpType, QueryOne, isPredicateObj, utils, } from '@aws-amplify/datastore';
|
|
5
|
+
import { deleteByIdStatement, deleteByPredicateStatement, generateSchemaStatements, modelInsertStatement, modelUpdateStatement, queryAllStatement, queryByIdStatement, queryOneStatement, } from '../common/SQLiteUtils';
|
|
6
6
|
const { traverseModel, validatePredicate, isModelConstructor } = utils;
|
|
7
7
|
const logger = new ConsoleLogger('DataStore');
|
|
8
8
|
export class CommonSQLiteAdapter {
|
|
@@ -11,9 +11,9 @@ export class CommonSQLiteAdapter {
|
|
|
11
11
|
}
|
|
12
12
|
async setUp(theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
|
|
13
13
|
if (!this.initPromise) {
|
|
14
|
-
this.initPromise = new Promise((
|
|
15
|
-
this.resolve =
|
|
16
|
-
this.reject =
|
|
14
|
+
this.initPromise = new Promise((_resolve, _reject) => {
|
|
15
|
+
this.resolve = _resolve;
|
|
16
|
+
this.reject = _reject;
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
else {
|
|
@@ -25,7 +25,9 @@ export class CommonSQLiteAdapter {
|
|
|
25
25
|
this.modelInstanceCreator = modelInstanceCreator;
|
|
26
26
|
this.getModelConstructorByModelName = getModelConstructorByModelName;
|
|
27
27
|
try {
|
|
28
|
-
const usesCPKCodegen = Object.values(this.schema.namespaces.user.models).some(model => Object.values(model.fields).some(field =>
|
|
28
|
+
const usesCPKCodegen = Object.values(this.schema.namespaces.user.models).some(model => Object.values(model.fields).some(field =>
|
|
29
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
30
|
+
field.association?.hasOwnProperty('targetNames')));
|
|
29
31
|
if (usesCPKCodegen) {
|
|
30
32
|
logger.error('The SQLite adapter does not support schemas using custom primary key. Set `graphQLTransformer.respectPrimaryKeyAttributesOnConnectionField in `amplify/cli.json` to false to disable custom primary key. To regenerate your API, add or remove an empty newline to your GraphQL schema (to change the computed hash) then run `amplify push`.');
|
|
31
33
|
}
|
|
@@ -67,10 +69,10 @@ export class CommonSQLiteAdapter {
|
|
|
67
69
|
for await (const resItem of connectionStoreNames) {
|
|
68
70
|
const { modelName, item, instance } = resItem;
|
|
69
71
|
const { id } = item;
|
|
70
|
-
const [
|
|
71
|
-
const
|
|
72
|
-
const opType =
|
|
73
|
-
const saveStatement =
|
|
72
|
+
const [queryStatementForRestItem, paramsForRestItem] = queryByIdStatement(id, modelName);
|
|
73
|
+
const fromDBForRestItem = await this.db.get(queryStatementForRestItem, paramsForRestItem);
|
|
74
|
+
const opType = fromDBForRestItem === undefined ? OpType.INSERT : OpType.UPDATE;
|
|
75
|
+
const saveStatement = fromDBForRestItem
|
|
74
76
|
? modelUpdateStatement(instance, modelName)
|
|
75
77
|
: modelInsertStatement(instance, modelName);
|
|
76
78
|
if (id === model.id || opType === OpType.INSERT) {
|
|
@@ -111,15 +113,15 @@ export class CommonSQLiteAdapter {
|
|
|
111
113
|
const limit = pagination && pagination.limit;
|
|
112
114
|
const page = limit && pagination.page;
|
|
113
115
|
const queryById = predicates && this.idFromPredicate(predicates);
|
|
114
|
-
const records = await (async () => {
|
|
116
|
+
const records = (await (async () => {
|
|
115
117
|
if (queryById) {
|
|
116
118
|
const record = await this.getById(tableName, queryById);
|
|
117
119
|
return record ? [record] : [];
|
|
118
120
|
}
|
|
119
121
|
const [queryStatement, params] = queryAllStatement(tableName, predicates, sortPredicates, limit, page);
|
|
120
|
-
return
|
|
121
|
-
})();
|
|
122
|
-
return
|
|
122
|
+
return this.db.getAll(queryStatement, params);
|
|
123
|
+
})());
|
|
124
|
+
return this.load(namespaceName, modelConstructor.name, records);
|
|
123
125
|
}
|
|
124
126
|
async getById(tableName, id) {
|
|
125
127
|
const [queryStatement, params] = queryByIdStatement(id, tableName);
|
|
@@ -200,7 +202,7 @@ export class CommonSQLiteAdapter {
|
|
|
200
202
|
for (const item of items) {
|
|
201
203
|
const connectedModels = traverseModel(modelConstructor.name, this.modelInstanceCreator(modelConstructor, item), this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
|
|
202
204
|
const { id, _deleted } = item;
|
|
203
|
-
const { instance } = connectedModels.find(({ instance }) =>
|
|
205
|
+
const { instance } = connectedModels.find(({ instance: connectedModelInstance }) => connectedModelInstance.id === id);
|
|
204
206
|
if (_deleted) {
|
|
205
207
|
// create the delete statements right away
|
|
206
208
|
const deleteStatement = deleteByIdStatement(instance.id, tableName);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GraphQLScalarType, InternalSchema, PersistentModel, PredicatesGroup, SchemaModel, SortPredicatesGroup } from '@aws-amplify/datastore';
|
|
2
2
|
import { ParameterizedStatement } from './types';
|
|
3
3
|
export declare function getSQLiteType(scalar: keyof Omit<typeof GraphQLScalarType, 'getJSType' | 'getValidationFunction' | 'getSQLiteType'>): 'TEXT' | 'INTEGER' | 'REAL' | 'BLOB';
|
|
4
4
|
export declare function generateSchemaStatements(schema: InternalSchema): string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { isGraphQLScalarType,
|
|
3
|
+
import { QueryOne, isGraphQLScalarType, isModelAttributeAuth, isModelFieldType, isPredicateGroup, isPredicateObj, isTargetNameAssociation, utils, } from '@aws-amplify/datastore';
|
|
4
4
|
const { USER, isNonModelConstructor, isModelConstructor } = utils;
|
|
5
5
|
const keysFromModel = model => Object.keys(model)
|
|
6
6
|
.map(k => `"${k}"`)
|
|
@@ -55,9 +55,10 @@ export function getSQLiteType(scalar) {
|
|
|
55
55
|
return 'TEXT';
|
|
56
56
|
case 'Float':
|
|
57
57
|
return 'REAL';
|
|
58
|
-
default:
|
|
58
|
+
default: {
|
|
59
59
|
const _ = scalar;
|
|
60
60
|
throw new Error(`unknown type ${scalar}`);
|
|
61
|
+
}
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
export function generateSchemaStatements(schema) {
|
|
@@ -221,10 +222,11 @@ export const whereConditionFromPredicateObject = ({ field, operator, operand, })
|
|
|
221
222
|
case 'notContains':
|
|
222
223
|
statement = [`instr("${field}", ?) ${logicalOperator}`, [operand]];
|
|
223
224
|
break;
|
|
224
|
-
default:
|
|
225
|
+
default: {
|
|
225
226
|
const _ = logicalOperatorKey;
|
|
226
227
|
// Incorrect WHERE clause can result in data loss
|
|
227
228
|
throw new Error('Cannot map predicate to a valid WHERE clause');
|
|
229
|
+
}
|
|
228
230
|
}
|
|
229
231
|
return statement;
|
|
230
232
|
}
|
|
@@ -235,9 +237,9 @@ export function whereClauseFromPredicate(predicate) {
|
|
|
235
237
|
recurse(predicate, result, params);
|
|
236
238
|
const whereClause = `WHERE ${result.join(' ')}`;
|
|
237
239
|
return [whereClause, params];
|
|
238
|
-
function recurse(
|
|
239
|
-
if (isPredicateGroup(
|
|
240
|
-
const { type: groupType, predicates: groupPredicates } =
|
|
240
|
+
function recurse(recursedPredicate, recursedResult = [], recursedParams = []) {
|
|
241
|
+
if (isPredicateGroup(recursedPredicate)) {
|
|
242
|
+
const { type: groupType, predicates: groupPredicates } = recursedPredicate;
|
|
241
243
|
let filterType = '';
|
|
242
244
|
let isNegation = false;
|
|
243
245
|
switch (groupType) {
|
|
@@ -250,20 +252,21 @@ export function whereClauseFromPredicate(predicate) {
|
|
|
250
252
|
case 'or':
|
|
251
253
|
filterType = 'OR';
|
|
252
254
|
break;
|
|
253
|
-
default:
|
|
255
|
+
default: {
|
|
254
256
|
const _ = groupType;
|
|
255
257
|
throw new Error(`Invalid ${groupType}`);
|
|
258
|
+
}
|
|
256
259
|
}
|
|
257
260
|
const groupResult = [];
|
|
258
261
|
for (const p of groupPredicates) {
|
|
259
|
-
recurse(p, groupResult,
|
|
262
|
+
recurse(p, groupResult, recursedParams);
|
|
260
263
|
}
|
|
261
|
-
|
|
264
|
+
recursedResult.push(`${isNegation ? 'NOT' : ''}(${groupResult.join(` ${filterType} `)})`);
|
|
262
265
|
}
|
|
263
|
-
else if (isPredicateObj(
|
|
264
|
-
const [condition, conditionParams] = whereConditionFromPredicateObject(
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
else if (isPredicateObj(recursedPredicate)) {
|
|
267
|
+
const [condition, conditionParams] = whereConditionFromPredicateObject(recursedPredicate);
|
|
268
|
+
recursedResult.push(condition);
|
|
269
|
+
recursedParams.push(...conditionParams);
|
|
267
270
|
}
|
|
268
271
|
}
|
|
269
272
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ModelInstanceMetadata, PersistentModel } from '@aws-amplify/datastore';
|
|
2
2
|
export interface CommonSQLiteDatabase {
|
|
3
3
|
init(): Promise<void>;
|
|
4
4
|
createSchema(statements: string[]): Promise<void>;
|