@ja-platform/db 0.0.0-dev-20261028223022
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/LICENSE +521 -0
- package/dist/@types/Schema.d.ts +1 -0
- package/dist/@types/app.d.ts +12 -0
- package/dist/@types/browser.d.ts +31 -0
- package/dist/@types/credentials/ApiCredentials.d.ts +18 -0
- package/dist/@types/credentials/MobileCredentials.d.ts +22 -0
- package/dist/@types/credentials/index.d.ts +2 -0
- package/dist/@types/database/Batch.d.ts +61 -0
- package/dist/@types/database/Collection.d.ts +85 -0
- package/dist/@types/database/Database.d.ts +22 -0
- package/dist/@types/database/DatabaseObject.d.ts +51 -0
- package/dist/@types/database/GenericDatabase.d.ts +4 -0
- package/dist/@types/database/JourneyAPIAdapter.d.ts +45 -0
- package/dist/@types/database/ObjectDisplayScope.d.ts +22 -0
- package/dist/@types/database/OnlineDB.d.ts +8 -0
- package/dist/@types/database/adapters/BaseAdapter.d.ts +26 -0
- package/dist/@types/database/adapters/DatabaseAdapter.d.ts +22 -0
- package/dist/@types/database/adapters/WebSQLAdapter.d.ts +50 -0
- package/dist/@types/index.d.ts +2 -0
- package/dist/@types/query/InternalQuery.d.ts +17 -0
- package/dist/@types/query/Query.d.ts +133 -0
- package/dist/@types/query/getPreloadRelationships.d.ts +9 -0
- package/dist/@types/query/queryOperations.d.ts +87 -0
- package/dist/@types/types/Attachment.d.ts +104 -0
- package/dist/@types/types/Location.d.ts +18 -0
- package/dist/@types/types/ObjectData.d.ts +12 -0
- package/dist/@types/types/TypeOperations.d.ts +42 -0
- package/dist/@types/utils/FunctionQueue.d.ts +32 -0
- package/dist/@types/utils/JourneyPromise.d.ts +2 -0
- package/dist/@types/utils/base64.d.ts +4 -0
- package/dist/@types/utils/retryableFetch.d.ts +3 -0
- package/dist/Schema.js +6 -0
- package/dist/Schema.js.map +1 -0
- package/dist/app.js +30 -0
- package/dist/app.js.map +1 -0
- package/dist/browser.js +77 -0
- package/dist/browser.js.map +1 -0
- package/dist/credentials/ApiCredentials.js +61 -0
- package/dist/credentials/ApiCredentials.js.map +1 -0
- package/dist/credentials/MobileCredentials.js +73 -0
- package/dist/credentials/MobileCredentials.js.map +1 -0
- package/dist/credentials/index.js +19 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/database/Batch.js +189 -0
- package/dist/database/Batch.js.map +1 -0
- package/dist/database/Collection.js +69 -0
- package/dist/database/Collection.js.map +1 -0
- package/dist/database/Database.js +47 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/DatabaseObject.js +646 -0
- package/dist/database/DatabaseObject.js.map +1 -0
- package/dist/database/GenericDatabase.js +3 -0
- package/dist/database/GenericDatabase.js.map +1 -0
- package/dist/database/JourneyAPIAdapter.js +357 -0
- package/dist/database/JourneyAPIAdapter.js.map +1 -0
- package/dist/database/ObjectDisplayScope.js +117 -0
- package/dist/database/ObjectDisplayScope.js.map +1 -0
- package/dist/database/OnlineDB.js +16 -0
- package/dist/database/OnlineDB.js.map +1 -0
- package/dist/database/adapters/BaseAdapter.js +66 -0
- package/dist/database/adapters/BaseAdapter.js.map +1 -0
- package/dist/database/adapters/DatabaseAdapter.js +3 -0
- package/dist/database/adapters/DatabaseAdapter.js.map +1 -0
- package/dist/database/adapters/WebSQLAdapter.js +343 -0
- package/dist/database/adapters/WebSQLAdapter.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/query/InternalQuery.js +3 -0
- package/dist/query/InternalQuery.js.map +1 -0
- package/dist/query/Query.js +414 -0
- package/dist/query/Query.js.map +1 -0
- package/dist/query/getPreloadRelationships.js +45 -0
- package/dist/query/getPreloadRelationships.js.map +1 -0
- package/dist/query/queryOperations.js +678 -0
- package/dist/query/queryOperations.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/Attachment.js +198 -0
- package/dist/types/Attachment.js.map +1 -0
- package/dist/types/Location.js +38 -0
- package/dist/types/Location.js.map +1 -0
- package/dist/types/ObjectData.js +3 -0
- package/dist/types/ObjectData.js.map +1 -0
- package/dist/types/TypeOperations.js +267 -0
- package/dist/types/TypeOperations.js.map +1 -0
- package/dist/utils/FunctionQueue.js +91 -0
- package/dist/utils/FunctionQueue.js.map +1 -0
- package/dist/utils/JourneyPromise.js +3 -0
- package/dist/utils/JourneyPromise.js.map +1 -0
- package/dist/utils/base64.js +40 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/retryableFetch.js +57 -0
- package/dist/utils/retryableFetch.js.map +1 -0
- package/package.json +55 -0
- package/readme.md +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectDisplayScope.js","sourceRoot":"","sources":["../../src/database/ObjectDisplayScope.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatValue } from '@ja-platform/parser-expressions';\nimport type { ReferencePath } from '@ja-platform/parser-expressions';\nimport type { SchemaObjectDisplayExpression } from '@ja-platform/parser-schema';\nimport { Type } from '@ja-platform/parser-type-system';\nimport type { Formatter } from '@ja-platform/parser-type-system';\nimport { DatabaseObject } from './DatabaseObject';\n\nexport class ObjectDisplayScope {\n static getValue(object: unknown, expression: string | ReferencePath, depth?: number): any {\n return ObjectDisplayScope.retrieveValue(object, expression, depth, false);\n }\n\n static async getValuePromise(object: unknown, expression: string | ReferencePath, depth: number = 0): Promise<any> {\n return ObjectDisplayScope.retrieveValue(object, expression, depth, true);\n }\n\n static retrieveValue(\n object: unknown,\n expression: string | readonly (string | number)[],\n depth: number,\n isPromise: boolean\n ): any {\n if (expression == 'null' || expression == null) {\n return null;\n }\n if (expression == 'true') {\n return true;\n }\n if (expression == 'false') {\n return false;\n }\n if (object == null) {\n return null;\n }\n\n if (typeof expression !== 'string') {\n const [head, ...tail] = expression;\n const key = String(head);\n if (isPromise) {\n return ObjectDisplayScope.promise(object, key).then((child) =>\n tail.length === 0 ? child : ObjectDisplayScope.retrieveValue(child, tail, depth + 1, true)\n );\n }\n const child = ObjectDisplayScope.cached(object, key);\n return tail.length === 0 || child === undefined\n ? child\n : ObjectDisplayScope.retrieveValue(child, tail, depth + 1, false);\n }\n\n const dot = expression.indexOf('.');\n if (dot < 0) {\n return isPromise ? ObjectDisplayScope.promise(object, expression) : ObjectDisplayScope.cached(object, expression);\n }\n const head = expression.substring(0, dot); // The first part of the expression\n const tail = expression.substring(dot + 1); // The rest of the expression\n\n if (isPromise) {\n return ObjectDisplayScope.promise(object, head).then((child) => {\n return ObjectDisplayScope.retrieveValue(child, tail, depth + 1, isPromise);\n });\n }\n\n const child = ObjectDisplayScope.cached(object, head);\n if (child === undefined) {\n return undefined;\n }\n return ObjectDisplayScope.retrieveValue(child, tail, depth + 1, isPromise);\n }\n\n static async promise(object: unknown, name: string): Promise<unknown> {\n if (object instanceof DatabaseObject) {\n return object._get(name);\n }\n return (object as Record<string, unknown>)[name];\n }\n\n static cached(object: unknown, name: string): unknown {\n if (object instanceof DatabaseObject) {\n return object._cached(name);\n } else {\n const val = (object as Record<string, unknown>)[name];\n if (val === undefined) {\n return null;\n } else {\n return val;\n }\n }\n }\n\n constructor(\n readonly object: unknown,\n private readonly formatterFor?: (type: Type) => Formatter\n ) {}\n\n /**\n * Render available fields, returning null while a referenced value is loading.\n */\n evaluate(expression: SchemaObjectDisplayExpression): string | null {\n const values: unknown[] = [];\n for (const parameter of expression.parameters) {\n const value = this.getValue(parameter.path);\n if (value === undefined) return null;\n values.push(formatValue(value, this.getExpressionFormatter(parameter.path), parameter.format));\n }\n return expression.render(values);\n }\n\n getExpressionFormatter(path: ReferencePath): Formatter | null {\n const type = this.getExpressionType(path);\n return type == null ? null : (this.formatterFor?.(type) ?? type);\n }\n\n getExpressionType(path: ReferencePath): Type | null {\n let object = this.object;\n for (const property of path.slice(0, -1)) {\n if (object == null) return null;\n object = ObjectDisplayScope.cached(object, String(property));\n }\n return object instanceof DatabaseObject ? object.type.getField(String(path[path.length - 1])) : null;\n }\n\n getValue(expression: string | ReferencePath) {\n if (typeof expression === 'string' && expression.length > 0 && expression[0] == '?') {\n expression = expression.substring(1);\n }\n return ObjectDisplayScope.getValue(this.object, expression);\n }\n\n getValuePromise(expression: string | ReferencePath): Promise<any> {\n return ObjectDisplayScope.getValuePromise(this.object, expression);\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OnlineDB = OnlineDB;
|
|
4
|
+
const parser_schema_xml_1 = require("@ja-platform/parser-schema-xml");
|
|
5
|
+
const JourneyAPIAdapter_1 = require("./JourneyAPIAdapter");
|
|
6
|
+
const ApiCredentials_1 = require("../credentials/ApiCredentials");
|
|
7
|
+
const Database_1 = require("./Database");
|
|
8
|
+
function OnlineDB(options) {
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const datamodelXml = fs.readFileSync(options.dataModelPath, 'utf8');
|
|
11
|
+
const schema = (0, parser_schema_xml_1.loadSchemaXml)({ source: datamodelXml });
|
|
12
|
+
const credentials = new ApiCredentials_1.ApiCredentials(options);
|
|
13
|
+
const adapter = new JourneyAPIAdapter_1.JourneyAPIAdapter(credentials, schema, options.adapter);
|
|
14
|
+
return new Database_1.Database(schema, adapter);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=OnlineDB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnlineDB.js","sourceRoot":"","sources":["../../src/database/OnlineDB.ts"],"names":[],"mappings":";;;AAAA,sEAA+D;AAC/D,2DAA2E;AAC3E,kEAAqF;AACrF,yCAAsC;AAQtC,kBAAyB,OAA4B;IACnD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,IAAA,iCAAa,EAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,+BAAc,CAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAI,qCAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,OAAO,IAAI,mBAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import { loadSchemaXml } from '@ja-platform/parser-schema-xml';\nimport { ApiAdapterOptions, JourneyAPIAdapter } from './JourneyAPIAdapter';\nimport { ApiCredentialOptions, ApiCredentials } from '../credentials/ApiCredentials';\nimport { Database } from './Database';\nimport { DBSchema } from '../Schema';\n\nexport interface OnlineDBCredentials extends ApiCredentialOptions {\n adapter?: ApiAdapterOptions;\n dataModelPath?: string;\n}\n\nexport function OnlineDB(options: OnlineDBCredentials) {\n const fs = require('fs');\n\n const datamodelXml = fs.readFileSync(options.dataModelPath, 'utf8');\n const schema = loadSchemaXml({ source: datamodelXml });\n const credentials = new ApiCredentials(options);\n\n const adapter = new JourneyAPIAdapter(credentials, schema, options.adapter);\n return new Database(schema, adapter);\n}\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseAdapter = void 0;
|
|
4
|
+
// Enable for debugging
|
|
5
|
+
var LOG_QUERIES = false;
|
|
6
|
+
function logQuery(...args) {
|
|
7
|
+
if (LOG_QUERIES) {
|
|
8
|
+
console.log.apply(console, args);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_BATCH_LIMIT = 1000;
|
|
12
|
+
class BaseAdapter {
|
|
13
|
+
static logQuery(...args) {
|
|
14
|
+
return logQuery.apply(null, args);
|
|
15
|
+
}
|
|
16
|
+
constructor() {
|
|
17
|
+
this.batchLimit = DEFAULT_BATCH_LIMIT;
|
|
18
|
+
this.closed = false;
|
|
19
|
+
this.adapterName = this.constructor.adapterName;
|
|
20
|
+
}
|
|
21
|
+
description() {
|
|
22
|
+
return 'Unknown';
|
|
23
|
+
}
|
|
24
|
+
open() {
|
|
25
|
+
if (this.promise) {
|
|
26
|
+
return this.promise;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return Promise.resolve(null);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Lookup a an array of IDs. Returns a promise that is resolved with an array of object data.
|
|
34
|
+
*/
|
|
35
|
+
getAll(type, ids) {
|
|
36
|
+
// Default (inefficient) implementation
|
|
37
|
+
var promises = [];
|
|
38
|
+
var startAt = new Date();
|
|
39
|
+
for (var i = 0; i < ids.length; i++) {
|
|
40
|
+
promises.push(this.get(type, ids[i]));
|
|
41
|
+
}
|
|
42
|
+
return Promise.all(promises).then(function (results) {
|
|
43
|
+
var endAt = new Date();
|
|
44
|
+
var duration = endAt.getTime() - startAt.getTime();
|
|
45
|
+
logQuery('Retrieved ' + ids.length + ' objects of type ' + type + ' in ' + duration + 'ms');
|
|
46
|
+
return results;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async count(query) {
|
|
50
|
+
const data = await this.executeQuery(query);
|
|
51
|
+
return data.length;
|
|
52
|
+
}
|
|
53
|
+
close() {
|
|
54
|
+
this.closed = true;
|
|
55
|
+
}
|
|
56
|
+
ensureOpen() {
|
|
57
|
+
if (this.closed) {
|
|
58
|
+
throw new Error('Database closed');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
explain(query) {
|
|
62
|
+
throw new Error('Method not implemented.');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.BaseAdapter = BaseAdapter;
|
|
66
|
+
//# sourceMappingURL=BaseAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseAdapter.js","sourceRoot":"","sources":["../../../src/database/adapters/BaseAdapter.ts"],"names":[],"mappings":";;;AAKA,uBAAuB;AACvB,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,QAAQ,CAAC,GAAG,IAAW;IAC9B,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;IACE,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAW;QAC5B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAQD;QANA,eAAU,GAAG,mBAAmB,CAAC;QAO/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,GAAI,IAAI,CAAC,WAAmB,CAAC,WAAW,CAAC;IAC3D,CAAC;IAED,WAAW;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAID;;OAEG;IACH,MAAM,CAAC,IAAY,EAAE,GAAa;QAChC,uCAAuC;QACvC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO;YACjD,IAAI,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YACnD,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,GAAG,mBAAmB,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;YAC5F,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAY;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAY;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CAKF","sourcesContent":["import { Query } from '../../query/Query';\nimport { ObjectData } from '../../types/ObjectData';\nimport { ExecuteBatchOperation } from '../Batch';\nimport { DatabaseAdapter } from './DatabaseAdapter';\n\n// Enable for debugging\nvar LOG_QUERIES = false;\n\nfunction logQuery(...args: any[]) {\n if (LOG_QUERIES) {\n console.log.apply(console, args);\n }\n}\n\nconst DEFAULT_BATCH_LIMIT = 1000;\n\nexport abstract class BaseAdapter implements DatabaseAdapter {\n static logQuery(...args: any[]) {\n return logQuery.apply(null, args);\n }\n\n batchLimit = DEFAULT_BATCH_LIMIT;\n closed: boolean;\n adapterName: string;\n promise: Promise<void>;\n name: string;\n\n protected constructor() {\n this.closed = false;\n this.adapterName = (this.constructor as any).adapterName;\n }\n\n description() {\n return 'Unknown';\n }\n\n open(): Promise<void> {\n if (this.promise) {\n return this.promise;\n } else {\n return Promise.resolve(null);\n }\n }\n\n abstract get(type: string, id: string): Promise<ObjectData>;\n\n /**\n * Lookup a an array of IDs. Returns a promise that is resolved with an array of object data.\n */\n getAll(type: string, ids: string[]): Promise<ObjectData[]> {\n // Default (inefficient) implementation\n var promises = [];\n\n var startAt = new Date();\n\n for (var i = 0; i < ids.length; i++) {\n promises.push(this.get(type, ids[i]));\n }\n\n return Promise.all(promises).then(function (results) {\n var endAt = new Date();\n var duration = endAt.getTime() - startAt.getTime();\n logQuery('Retrieved ' + ids.length + ' objects of type ' + type + ' in ' + duration + 'ms');\n return results;\n });\n }\n\n async count(query: Query) {\n const data = await this.executeQuery(query);\n return data.length;\n }\n\n close() {\n this.closed = true;\n }\n\n ensureOpen() {\n if (this.closed) {\n throw new Error('Database closed');\n }\n }\n\n explain(query: Query): Promise<any> {\n throw new Error('Method not implemented.');\n }\n\n // These methods must be implemented by subclasses\n abstract applyBatch(ops: ExecuteBatchOperation[]): Promise<any[]>;\n abstract executeQuery(query: Query): Promise<ObjectData[]>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseAdapter.js","sourceRoot":"","sources":["../../../src/database/adapters/DatabaseAdapter.ts"],"names":[],"mappings":"","sourcesContent":["import { Type } from '@ja-platform/parser-type-system';\nimport { TypeOperations, ValueSerializeOptions } from '../../types/TypeOperations';\nimport { Query } from '../../query/Query';\nimport { ObjectData } from '../../types/ObjectData';\nimport { ExecuteBatchOperation, ExecuteBatchResult } from '../Batch';\n\nexport interface DatabaseAdapter {\n operationsFor?(type: Type): TypeOperations;\n batchLimit: number;\n name: string;\n\n serializeOptions?: ValueSerializeOptions;\n\n description(): string;\n\n applyBatch(ops: ExecuteBatchOperation[]): Promise<ExecuteBatchResult[]>;\n\n /**\n * Lookup an object. Returns a promise that is resolved with the object data, or null if not found.\n */\n get(type: string, id: string): Promise<ObjectData>;\n\n close(): void;\n\n executeQuery(query: Query): Promise<ObjectData[]>;\n\n explain(query: Query): Promise<any>;\n\n count(query: Query): Promise<number>;\n\n getAll(type: string, ids: string[]): Promise<ObjectData[]>;\n}\n"]}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSQLAdapter = void 0;
|
|
4
|
+
const BaseAdapter_1 = require("./BaseAdapter");
|
|
5
|
+
var logQuery = BaseAdapter_1.BaseAdapter.logQuery;
|
|
6
|
+
function queryMessage(query, args) {
|
|
7
|
+
if (args) {
|
|
8
|
+
args.forEach(function (arg) {
|
|
9
|
+
query = query.replace('?', JSON.stringify(arg));
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
return query;
|
|
13
|
+
}
|
|
14
|
+
class WebSQLAdapter extends BaseAdapter_1.BaseAdapter {
|
|
15
|
+
/**
|
|
16
|
+
* Clear the database. Returns a promise that is resolved when the database is cleared.
|
|
17
|
+
*/
|
|
18
|
+
static clear(keepCrud) {
|
|
19
|
+
function clearDatabase(name) {
|
|
20
|
+
return new Promise(function (resolve, reject) {
|
|
21
|
+
var db = WebSQLAdapter.prototype.openDatabase(name);
|
|
22
|
+
function onSuccess(tx, r) {
|
|
23
|
+
resolve(true);
|
|
24
|
+
}
|
|
25
|
+
function onError(e) {
|
|
26
|
+
resolve(false);
|
|
27
|
+
}
|
|
28
|
+
db.transaction(function (tx) {
|
|
29
|
+
tx.executeSql('DROP INDEX IF EXISTS objects_type_id');
|
|
30
|
+
tx.executeSql('DROP TABLE IF EXISTS objects');
|
|
31
|
+
tx.executeSql('DROP TABLE IF EXISTS object_indexes');
|
|
32
|
+
if (!keepCrud) {
|
|
33
|
+
tx.executeSql('DROP TABLE IF EXISTS crud');
|
|
34
|
+
}
|
|
35
|
+
tx.executeSql('DROP TABLE IF EXISTS versions');
|
|
36
|
+
}, onError, onSuccess);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return Promise.all([clearDatabase('objects'), clearDatabase('local-objects')]);
|
|
40
|
+
}
|
|
41
|
+
constructor(options) {
|
|
42
|
+
super();
|
|
43
|
+
this.batchLimit = 1000;
|
|
44
|
+
this.db = null;
|
|
45
|
+
var dbName = options.name || 'objects';
|
|
46
|
+
this.name = dbName;
|
|
47
|
+
this.db = this.openDatabase(dbName);
|
|
48
|
+
var version = null;
|
|
49
|
+
function retrievedVersion(tx, rs) {
|
|
50
|
+
if (rs.rows.length >= 1) {
|
|
51
|
+
version = rs.rows.item(0).version;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
version = 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
this.promise = this.promisedTransaction((tx) => {
|
|
58
|
+
tx.loggedSql('CREATE TABLE IF NOT EXISTS versions(name TEXT PRIMARY KEY, version INTEGER)', []);
|
|
59
|
+
tx.loggedSql('SELECT * FROM versions WHERE name=?', ['db'], retrievedVersion);
|
|
60
|
+
}).then(() => {
|
|
61
|
+
return this.promisedTransaction(function (tx) {
|
|
62
|
+
if (version < 1) {
|
|
63
|
+
tx.loggedSql('DROP TABLE IF EXISTS objects');
|
|
64
|
+
tx.loggedSql('CREATE TABLE objects(id TEXT PRIMARY KEY, type TEXT, uid TEXT, hash INTEGER, data TEXT)', []);
|
|
65
|
+
tx.loggedSql('CREATE INDEX IF NOT EXISTS objects_type_id ON objects(type, id)', []);
|
|
66
|
+
tx.loggedSql('CREATE TABLE IF NOT EXISTS crud (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT)', []);
|
|
67
|
+
}
|
|
68
|
+
if (version < 2) {
|
|
69
|
+
tx.loggedSql('CREATE INDEX IF NOT EXISTS objects_uid ON objects(uid)', []);
|
|
70
|
+
}
|
|
71
|
+
if (version < 6) {
|
|
72
|
+
tx.loggedSql('DROP TABLE IF EXISTS object_indexes', []);
|
|
73
|
+
tx.loggedSql('DROP INDEX IF EXISTS objects_by_index_version', []);
|
|
74
|
+
}
|
|
75
|
+
version = 6;
|
|
76
|
+
tx.loggedSql('INSERT OR REPLACE INTO versions(name, version) VALUES(?, ?)', ['db', version]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
description() {
|
|
81
|
+
return 'WebSQL';
|
|
82
|
+
}
|
|
83
|
+
applyCrud(crud) {
|
|
84
|
+
this.ensureOpen();
|
|
85
|
+
var ids = [];
|
|
86
|
+
return this.promisedTransaction((tx) => {
|
|
87
|
+
for (let i = 0; i < crud.length; i++) {
|
|
88
|
+
const operation = crud[i];
|
|
89
|
+
const action = Object.keys(operation)[0];
|
|
90
|
+
const data = operation[action];
|
|
91
|
+
if (action == 'put') {
|
|
92
|
+
ids.push(data.id);
|
|
93
|
+
this.transactionSaveData(tx, data.type, data.id, data, null);
|
|
94
|
+
}
|
|
95
|
+
else if (action == 'delete') {
|
|
96
|
+
this.transactionDestroy(tx, data.type, data.id);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error('Unknown action: ' + action);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}).then(function () {
|
|
103
|
+
return { updatedIds: ids };
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Apply a batch of operations in a single transaction.
|
|
108
|
+
*
|
|
109
|
+
* The entire batch is either successful or not - we don't return errors for
|
|
110
|
+
* individual objects.
|
|
111
|
+
*/
|
|
112
|
+
async applyBatch(crud) {
|
|
113
|
+
this.ensureOpen();
|
|
114
|
+
var results = [];
|
|
115
|
+
await this.promisedTransaction((tx) => {
|
|
116
|
+
for (var i = 0; i < crud.length; i++) {
|
|
117
|
+
var operation = crud[i];
|
|
118
|
+
var action = operation.op;
|
|
119
|
+
if (action == 'put') {
|
|
120
|
+
this.transactionSaveData(tx, operation.type, operation.id, operation.data, null);
|
|
121
|
+
}
|
|
122
|
+
else if (action == 'patch') {
|
|
123
|
+
this.transactionSaveData(tx, operation.type, operation.id, operation.data, operation.patch);
|
|
124
|
+
}
|
|
125
|
+
else if (action == 'delete') {
|
|
126
|
+
this.transactionDestroy(tx, operation.type, operation.id);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw new Error('Unknown action: ' + action);
|
|
130
|
+
}
|
|
131
|
+
results.push({});
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return results;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Perform a query.
|
|
138
|
+
* Returns a promise that is resolved with the resultset.
|
|
139
|
+
*/
|
|
140
|
+
async executeQuery(query) {
|
|
141
|
+
const skip = query.skipNumber;
|
|
142
|
+
const limit = query.limitNumber;
|
|
143
|
+
const { data } = await this.executeTableScan(query);
|
|
144
|
+
let result = [];
|
|
145
|
+
if (skip >= data.length) {
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
const startIndex = !skip ? 0 : skip;
|
|
149
|
+
for (let i = startIndex, recordCount = 0; i < data.length && (limit == null || recordCount < limit); i++, recordCount++) {
|
|
150
|
+
result.push(data[i]);
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
explain(query) {
|
|
155
|
+
const start = new Date();
|
|
156
|
+
return this.executeTableScan(query).then(function (results) {
|
|
157
|
+
results.duration = new Date().getTime() - start.getTime();
|
|
158
|
+
return results;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
executeTableScan(query) {
|
|
162
|
+
this.ensureOpen();
|
|
163
|
+
var typeName = query.type.name;
|
|
164
|
+
return this.simpleQuery('SELECT * FROM objects WHERE type=?', [typeName]).then((rs) => {
|
|
165
|
+
let all = [];
|
|
166
|
+
for (let i = 0; i < rs.rows.length; i++) {
|
|
167
|
+
const row = rs.rows.item(i);
|
|
168
|
+
const data = JSON.parse(row.data);
|
|
169
|
+
const result = Object.assign(Object.assign({}, data), { type: row.type, id: row.id });
|
|
170
|
+
all.push(result);
|
|
171
|
+
}
|
|
172
|
+
const filtered = query._filter(all);
|
|
173
|
+
const sorted = query._sort(filtered);
|
|
174
|
+
const result = {
|
|
175
|
+
type: 'full scan',
|
|
176
|
+
results: sorted.length,
|
|
177
|
+
scanned: all.length,
|
|
178
|
+
data: sorted
|
|
179
|
+
};
|
|
180
|
+
return result;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// Lookup an object. Returns a promise that is resolved with the object data.
|
|
184
|
+
async get(type, id) {
|
|
185
|
+
this.ensureOpen();
|
|
186
|
+
if (id == null) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
if (typeof id != 'string') {
|
|
190
|
+
throw new Error('id must be a string, got: ' + typeof id);
|
|
191
|
+
}
|
|
192
|
+
const rs = await this.simpleQuery('SELECT * FROM objects WHERE type=? AND id=? LIMIT 1', [type, id]);
|
|
193
|
+
if (rs.rows.length >= 1) {
|
|
194
|
+
const row = rs.rows.item(0);
|
|
195
|
+
const data = JSON.parse(row.data);
|
|
196
|
+
const result = Object.assign(Object.assign({}, data), { type: row.type, id: row.id });
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
getAll(type, ids) {
|
|
204
|
+
this.ensureOpen();
|
|
205
|
+
// This implementation is an optimization that loads all the objects in a single transaction.
|
|
206
|
+
let resultsets = [];
|
|
207
|
+
function resultHandler(index) {
|
|
208
|
+
return function (tx, rs) {
|
|
209
|
+
resultsets[index] = rs;
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const startAt = new Date();
|
|
213
|
+
return this.promisedTransaction(function (tx) {
|
|
214
|
+
for (let i = 0; i < ids.length; i++) {
|
|
215
|
+
const id = ids[i];
|
|
216
|
+
tx.loggedSql('SELECT * FROM objects WHERE type=? AND id=? LIMIT 1', [type, id], resultHandler(i));
|
|
217
|
+
}
|
|
218
|
+
}).then(function () {
|
|
219
|
+
let results = [];
|
|
220
|
+
for (let i = 0; i < ids.length; i++) {
|
|
221
|
+
const rs = resultsets[i];
|
|
222
|
+
if (rs.rows.length >= 1) {
|
|
223
|
+
const row = rs.rows.item(0);
|
|
224
|
+
const data = JSON.parse(row.data);
|
|
225
|
+
results.push(Object.assign(Object.assign({}, data), { type: row.type, id: row.id }));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
results.push(null);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const endAt = new Date();
|
|
232
|
+
const duration = endAt.getTime() - startAt.getTime();
|
|
233
|
+
logQuery('Retrieved ' + ids.length + ' objects of type ' + type + ' in ' + duration + 'ms');
|
|
234
|
+
return results;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
estimateBytesUsed() {
|
|
238
|
+
// We only count the length of the dynamically-sized data here
|
|
239
|
+
var dataSum = this.simpleQuery('SELECT SUM(LENGTH(data) + LENGTH(type)) as sum FROM objects').then(function (rs) {
|
|
240
|
+
if (rs.rows.length >= 1) {
|
|
241
|
+
var row = rs.rows.item(0);
|
|
242
|
+
return row.sum;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
return 0;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
var objectCount = this.simpleQuery('SELECT COUNT(id) as count FROM objects').then(function (rs) {
|
|
249
|
+
if (rs.rows.length >= 1) {
|
|
250
|
+
var row = rs.rows.item(0);
|
|
251
|
+
return row.count;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
return 0;
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
return Promise.all([dataSum, objectCount]).then(function (results) {
|
|
258
|
+
var sum = results[0];
|
|
259
|
+
var count = results[1];
|
|
260
|
+
// ID + UID take up 52 characters
|
|
261
|
+
var stringCharacters = sum + 52 * count;
|
|
262
|
+
// 20 bytes overhead per record (including the hash)
|
|
263
|
+
var overhead = 20 * count;
|
|
264
|
+
// 2 bytes per character
|
|
265
|
+
return stringCharacters * 2 + overhead;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
openDatabase(name) {
|
|
269
|
+
return window.openDatabase(name, 'Objects', 20 * 1024 * 1024, function () {
|
|
270
|
+
// Database opened.
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
promisedTransaction(fn) {
|
|
274
|
+
const self = this;
|
|
275
|
+
return new Promise((resolve, reject) => {
|
|
276
|
+
function onSuccess(tx, r) {
|
|
277
|
+
resolve(r);
|
|
278
|
+
}
|
|
279
|
+
function onError(e) {
|
|
280
|
+
if (!self.closed) {
|
|
281
|
+
self.logError('Transaction error', e);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// When we're closed, we don't care about the error, so we don't log it.
|
|
285
|
+
}
|
|
286
|
+
reject(e);
|
|
287
|
+
}
|
|
288
|
+
this.db.transaction((tx) => {
|
|
289
|
+
tx.loggedSql = function (sqlStatement, args, callback, errorCallback) {
|
|
290
|
+
logQuery(queryMessage(sqlStatement, args));
|
|
291
|
+
tx.executeSql(sqlStatement, args, callback, errorCallback);
|
|
292
|
+
};
|
|
293
|
+
return fn(tx);
|
|
294
|
+
}, onError, onSuccess);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
simpleQuery(query, parameters) {
|
|
298
|
+
var resultset = null;
|
|
299
|
+
function handleResults(tx, rs) {
|
|
300
|
+
resultset = rs;
|
|
301
|
+
}
|
|
302
|
+
var startAt = new Date();
|
|
303
|
+
return this.promisedTransaction((tx) => {
|
|
304
|
+
tx.executeSql(query, parameters, handleResults);
|
|
305
|
+
}).then(function () {
|
|
306
|
+
var endAt = new Date();
|
|
307
|
+
var duration = endAt.getTime() - startAt.getTime();
|
|
308
|
+
logQuery(queryMessage(query, parameters), ' in ' + duration + 'ms');
|
|
309
|
+
return resultset;
|
|
310
|
+
}, (err) => {
|
|
311
|
+
this.logError(query, parameters, ' failed with ', err);
|
|
312
|
+
return Promise.reject(err);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
transactionSaveData(tx, type, id, data, patch) {
|
|
316
|
+
var _a, _b;
|
|
317
|
+
tx.loggedSql('INSERT OR REPLACE INTO objects(id, type, data) VALUES (?,?,?)', [
|
|
318
|
+
id,
|
|
319
|
+
type,
|
|
320
|
+
JSON.stringify({
|
|
321
|
+
attributes: (_a = data.attributes) !== null && _a !== void 0 ? _a : {},
|
|
322
|
+
belongs_to: (_b = data.belongs_to) !== null && _b !== void 0 ? _b : {}
|
|
323
|
+
})
|
|
324
|
+
]);
|
|
325
|
+
}
|
|
326
|
+
transactionDestroy(tx, type, id) {
|
|
327
|
+
tx.loggedSql('DELETE FROM objects WHERE type=? AND id=?', [type, id]);
|
|
328
|
+
}
|
|
329
|
+
logError(...args) {
|
|
330
|
+
console.error(...args);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.WebSQLAdapter = WebSQLAdapter;
|
|
334
|
+
WebSQLAdapter.adapterName = 'WebSQLAdapter';
|
|
335
|
+
WebSQLAdapter.supportsDiagnostics = true;
|
|
336
|
+
function queryIn(count) {
|
|
337
|
+
var q = '';
|
|
338
|
+
for (var i = 0; i < count; i++) {
|
|
339
|
+
q += (q === '' ? '' : ', ') + '?';
|
|
340
|
+
}
|
|
341
|
+
return q;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=WebSQLAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSQLAdapter.js","sourceRoot":"","sources":["../../../src/database/adapters/WebSQLAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseAdapter } from './BaseAdapter';\nimport { Query } from '../../query/Query';\nimport { ObjectData, PersistedObjectData } from '../../types/ObjectData';\nimport { DatabaseAdapter } from './DatabaseAdapter';\nimport { ExecuteBatchOperation } from '../Batch';\n\nvar logQuery = BaseAdapter.logQuery;\n\nfunction queryMessage(query: string, args: (string | number)[]) {\n if (args) {\n args.forEach(function (arg) {\n query = query.replace('?', JSON.stringify(arg));\n });\n }\n return query;\n}\n\ninterface SqlResult {\n rows: {\n length: number;\n item(i: number): any;\n };\n}\n\ninterface SqlError {}\n\nexport interface ExplainedResult {\n type: 'index' | 'full scan';\n results: number;\n scanned: number;\n data: ObjectData[];\n duration?: number;\n}\n\ninterface SqlTransaction {\n executeSql(\n sqlStatement: string,\n args?: (number | string)[],\n callback?: (tx: SqlTransaction, r: SqlResult) => void,\n errorCallback?: (error: SqlError) => void\n ): void;\n loggedSql?(\n sqlStatement: string,\n args?: (number | string)[],\n callback?: (tx: SqlTransaction, r: SqlResult) => void,\n errorCallback?: (error: SqlError) => void\n ): void;\n}\n\nexport class WebSQLAdapter extends BaseAdapter implements DatabaseAdapter {\n static adapterName = 'WebSQLAdapter';\n static supportsDiagnostics = true;\n\n /**\n * Clear the database. Returns a promise that is resolved when the database is cleared.\n */\n static clear(keepCrud?: boolean) {\n function clearDatabase(name: string) {\n return new Promise(function (resolve, reject) {\n var db = WebSQLAdapter.prototype.openDatabase(name);\n\n function onSuccess(tx: SqlTransaction, r: any) {\n resolve(true);\n }\n\n function onError(e: any) {\n resolve(false);\n }\n\n db.transaction(\n function (tx: SqlTransaction) {\n tx.executeSql('DROP INDEX IF EXISTS objects_type_id');\n tx.executeSql('DROP TABLE IF EXISTS objects');\n tx.executeSql('DROP TABLE IF EXISTS object_indexes');\n if (!keepCrud) {\n tx.executeSql('DROP TABLE IF EXISTS crud');\n }\n tx.executeSql('DROP TABLE IF EXISTS versions');\n },\n onError,\n onSuccess\n );\n });\n }\n\n return Promise.all([clearDatabase('objects'), clearDatabase('local-objects')]);\n }\n\n private db: any;\n batchLimit = 1000;\n\n constructor(options: any) {\n super();\n this.db = null;\n\n var dbName = options.name || 'objects';\n\n this.name = dbName;\n\n this.db = this.openDatabase(dbName);\n\n var version: number = null;\n\n function retrievedVersion(tx: SqlTransaction, rs: SqlResult) {\n if (rs.rows.length >= 1) {\n version = rs.rows.item(0).version;\n } else {\n version = 0;\n }\n }\n\n this.promise = this.promisedTransaction((tx) => {\n tx.loggedSql('CREATE TABLE IF NOT EXISTS versions(name TEXT PRIMARY KEY, version INTEGER)', []);\n tx.loggedSql('SELECT * FROM versions WHERE name=?', ['db'], retrievedVersion);\n }).then(() => {\n return this.promisedTransaction(function (tx) {\n if (version < 1) {\n tx.loggedSql('DROP TABLE IF EXISTS objects');\n tx.loggedSql('CREATE TABLE objects(id TEXT PRIMARY KEY, type TEXT, uid TEXT, hash INTEGER, data TEXT)', []);\n tx.loggedSql('CREATE INDEX IF NOT EXISTS objects_type_id ON objects(type, id)', []);\n tx.loggedSql('CREATE TABLE IF NOT EXISTS crud (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT)', []);\n }\n\n if (version < 2) {\n tx.loggedSql('CREATE INDEX IF NOT EXISTS objects_uid ON objects(uid)', []);\n }\n\n if (version < 6) {\n tx.loggedSql('DROP TABLE IF EXISTS object_indexes', []);\n tx.loggedSql('DROP INDEX IF EXISTS objects_by_index_version', []);\n }\n\n version = 6;\n tx.loggedSql('INSERT OR REPLACE INTO versions(name, version) VALUES(?, ?)', ['db', version]);\n });\n });\n }\n\n description() {\n return 'WebSQL';\n }\n\n applyCrud(crud: any[]) {\n this.ensureOpen();\n var ids: string[] = [];\n return this.promisedTransaction((tx) => {\n for (let i = 0; i < crud.length; i++) {\n const operation = crud[i];\n const action = Object.keys(operation)[0];\n const data = operation[action];\n if (action == 'put') {\n ids.push(data.id);\n\n this.transactionSaveData(tx, data.type, data.id, data, null);\n } else if (action == 'delete') {\n this.transactionDestroy(tx, data.type, data.id);\n } else {\n throw new Error('Unknown action: ' + action);\n }\n }\n }).then(function () {\n return { updatedIds: ids };\n });\n }\n\n /**\n * Apply a batch of operations in a single transaction.\n *\n * The entire batch is either successful or not - we don't return errors for\n * individual objects.\n */\n async applyBatch(crud: ExecuteBatchOperation[]): Promise<any[]> {\n this.ensureOpen();\n var results: any[] = [];\n await this.promisedTransaction((tx: SqlTransaction) => {\n for (var i = 0; i < crud.length; i++) {\n var operation = crud[i];\n var action = operation.op;\n if (action == 'put') {\n this.transactionSaveData(tx, operation.type, operation.id, operation.data, null);\n } else if (action == 'patch') {\n this.transactionSaveData(tx, operation.type, operation.id, operation.data, operation.patch);\n } else if (action == 'delete') {\n this.transactionDestroy(tx, operation.type, operation.id);\n } else {\n throw new Error('Unknown action: ' + action);\n }\n results.push({});\n }\n });\n return results;\n }\n\n /**\n * Perform a query.\n * Returns a promise that is resolved with the resultset.\n */\n async executeQuery(query: Query): Promise<ObjectData[]> {\n const skip = query.skipNumber;\n const limit = query.limitNumber;\n const { data } = await this.executeTableScan(query);\n let result: ObjectData[] = [];\n if (skip >= data.length) {\n return result;\n }\n const startIndex = !skip ? 0 : skip;\n\n for (\n let i = startIndex, recordCount = 0;\n i < data.length && (limit == null || recordCount < limit);\n i++, recordCount++\n ) {\n result.push(data[i]);\n }\n return result;\n }\n\n explain(query: Query): Promise<ExplainedResult> {\n const start = new Date();\n return this.executeTableScan(query).then(function (results) {\n results.duration = new Date().getTime() - start.getTime();\n return results;\n });\n }\n\n executeTableScan(query: Query): Promise<ExplainedResult> {\n this.ensureOpen();\n\n var typeName = query.type.name;\n\n return this.simpleQuery('SELECT * FROM objects WHERE type=?', [typeName]).then((rs) => {\n let all: ObjectData[] = [];\n for (let i = 0; i < rs.rows.length; i++) {\n const row = rs.rows.item(i);\n const data: PersistedObjectData = JSON.parse(row.data);\n const result: ObjectData = {\n ...data,\n type: row.type,\n id: row.id\n };\n all.push(result);\n }\n\n const filtered = query._filter(all);\n const sorted = query._sort(filtered);\n\n const result: ExplainedResult = {\n type: 'full scan',\n results: sorted.length,\n scanned: all.length,\n data: sorted\n };\n return result;\n });\n }\n\n // Lookup an object. Returns a promise that is resolved with the object data.\n async get(type: string, id: string): Promise<ObjectData> {\n this.ensureOpen();\n if (id == null) {\n return null;\n }\n if (typeof id != 'string') {\n throw new Error('id must be a string, got: ' + typeof id);\n }\n const rs = await this.simpleQuery('SELECT * FROM objects WHERE type=? AND id=? LIMIT 1', [type, id]);\n if (rs.rows.length >= 1) {\n const row = rs.rows.item(0);\n const data: PersistedObjectData = JSON.parse(row.data);\n const result = {\n ...data,\n type: row.type,\n id: row.id\n };\n return result;\n } else {\n return null;\n }\n }\n\n getAll(type: string, ids: string[]): Promise<ObjectData[]> {\n this.ensureOpen();\n // This implementation is an optimization that loads all the objects in a single transaction.\n let resultsets: SqlResult[] = [];\n\n function resultHandler(index: number) {\n return function (tx: SqlTransaction, rs: SqlResult) {\n resultsets[index] = rs;\n };\n }\n\n const startAt = new Date();\n\n return this.promisedTransaction(function (tx) {\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n tx.loggedSql('SELECT * FROM objects WHERE type=? AND id=? LIMIT 1', [type, id], resultHandler(i));\n }\n }).then(function () {\n let results: ObjectData[] = [];\n for (let i = 0; i < ids.length; i++) {\n const rs = resultsets[i];\n if (rs.rows.length >= 1) {\n const row = rs.rows.item(0);\n const data: PersistedObjectData = JSON.parse(row.data);\n\n results.push({\n ...data,\n type: row.type,\n id: row.id\n });\n } else {\n results.push(null);\n }\n }\n\n const endAt = new Date();\n const duration = endAt.getTime() - startAt.getTime();\n logQuery('Retrieved ' + ids.length + ' objects of type ' + type + ' in ' + duration + 'ms');\n\n return results;\n });\n }\n\n estimateBytesUsed() {\n // We only count the length of the dynamically-sized data here\n var dataSum = this.simpleQuery('SELECT SUM(LENGTH(data) + LENGTH(type)) as sum FROM objects').then(function (rs) {\n if (rs.rows.length >= 1) {\n var row = rs.rows.item(0);\n return row.sum;\n } else {\n return 0;\n }\n });\n\n var objectCount = this.simpleQuery('SELECT COUNT(id) as count FROM objects').then(function (rs) {\n if (rs.rows.length >= 1) {\n var row = rs.rows.item(0);\n return row.count;\n } else {\n return 0;\n }\n });\n\n return Promise.all([dataSum, objectCount]).then(function (results) {\n var sum = results[0];\n var count = results[1];\n\n // ID + UID take up 52 characters\n var stringCharacters = sum + 52 * count;\n\n // 20 bytes overhead per record (including the hash)\n var overhead = 20 * count;\n\n // 2 bytes per character\n return stringCharacters * 2 + overhead;\n });\n }\n\n openDatabase(name: string) {\n return (window as any).openDatabase(name, 'Objects', 20 * 1024 * 1024, function () {\n // Database opened.\n });\n }\n\n private promisedTransaction(fn: (tx: SqlTransaction) => void): Promise<void> {\n const self = this;\n return new Promise((resolve, reject) => {\n function onSuccess(tx: SqlTransaction, r: any) {\n resolve(r);\n }\n\n function onError(e: any) {\n if (!self.closed) {\n self.logError('Transaction error', e);\n } else {\n // When we're closed, we don't care about the error, so we don't log it.\n }\n reject(e);\n }\n\n this.db.transaction(\n (tx: SqlTransaction) => {\n tx.loggedSql = function (sqlStatement, args, callback, errorCallback) {\n logQuery(queryMessage(sqlStatement, args));\n tx.executeSql(sqlStatement, args, callback, errorCallback);\n };\n return fn(tx);\n },\n onError,\n onSuccess\n );\n });\n }\n\n private simpleQuery(query: string, parameters?: (string | number)[]): Promise<SqlResult> {\n var resultset: SqlResult = null;\n\n function handleResults(tx: SqlTransaction, rs: SqlResult) {\n resultset = rs;\n }\n\n var startAt = new Date();\n\n return this.promisedTransaction((tx) => {\n tx.executeSql(query, parameters, handleResults);\n }).then(\n function () {\n var endAt = new Date();\n var duration = endAt.getTime() - startAt.getTime();\n logQuery(queryMessage(query, parameters), ' in ' + duration + 'ms');\n return resultset;\n },\n (err) => {\n this.logError(query, parameters, ' failed with ', err);\n return Promise.reject(err);\n }\n );\n }\n\n private transactionSaveData(\n tx: SqlTransaction,\n type: string,\n id: string,\n data: PersistedObjectData,\n patch?: PersistedObjectData\n ) {\n tx.loggedSql('INSERT OR REPLACE INTO objects(id, type, data) VALUES (?,?,?)', [\n id,\n type,\n JSON.stringify({\n attributes: data.attributes ?? {},\n belongs_to: data.belongs_to ?? {}\n })\n ]);\n }\n\n private transactionDestroy(tx: SqlTransaction, type: string, id: string) {\n tx.loggedSql('DELETE FROM objects WHERE type=? AND id=?', [type, id]);\n }\n\n private logError(...args: any[]) {\n console.error(...args);\n }\n}\n\nfunction queryIn(count: number) {\n var q = '';\n for (var i = 0; i < count; i++) {\n q += (q === '' ? '' : ', ') + '?';\n }\n return q;\n}\n"]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// Everything from browser.ts, as well as OnlineDB
|
|
18
|
+
__exportStar(require("./browser"), exports);
|
|
19
|
+
__exportStar(require("./database/OnlineDB"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAkD;AAClD,4CAA0B;AAE1B,sDAAoC","sourcesContent":["// Everything from browser.ts, as well as OnlineDB\nexport * from './browser';\n\nexport * from './database/OnlineDB';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InternalQuery.js","sourceRoot":"","sources":["../../src/query/InternalQuery.ts"],"names":[],"mappings":"","sourcesContent":["import { DatabaseAdapter } from '../database/adapters/DatabaseAdapter';\nimport { Query } from './Query';\nimport { Expression } from './queryOperations';\nimport { DatabaseObject } from '../database/DatabaseObject';\nimport { ObjectData } from '../types/ObjectData';\nimport { SchemaModelType } from '@ja-platform/parser-schema';\n\nexport interface InternalQuery<T extends DatabaseObject = DatabaseObject> extends Query<T> {\n readonly adapter: DatabaseAdapter;\n readonly type: SchemaModelType;\n\n expression: Expression;\n\n ordering: any[];\n limitNumber: number;\n skipNumber: number;\n\n _fetch(): Promise<T[]>;\n _filter(data: ObjectData[]): ObjectData[];\n _sort(data: ObjectData[]): ObjectData[];\n}\n"]}
|