Skip to content

Commit e0f03f3

Browse files
author
David de Regt
committed
Refactored out the interfaces from NoSqlProvider into NoSqlProviderInterfaces to avoid the circular dependency I stupidly introduced
1 parent 4a65921 commit e0f03f3

24 files changed

Lines changed: 360 additions & 335 deletions

dist/CordovaNativeSqliteProvider.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* NoSqlProvider provider setup for cordova-native-sqlite, a cordova plugin backed by sqlite3.
77
*/
88
import SyncTasks = require('synctasks');
9-
import NoSqlProvider = require('./NoSqlProvider');
9+
import NoSqlProvider = require('./NoSqlProviderInterfaces');
1010
import SqlProviderBase = require('./SqlProviderBase');
1111
export declare class CordovaNativeSqliteProvider extends SqlProviderBase.SqlProviderBase {
1212
private _db;

dist/InMemoryProvider.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import SyncTasks = require('synctasks');
2-
import NoSqlProvider = require('./NoSqlProvider');
2+
import NoSqlProvider = require('./NoSqlProviderInterfaces');
33
export declare class InMemoryProvider extends NoSqlProvider.DbProvider {
44
private _stores;
55
open(dbName: string, schema: NoSqlProvider.DbSchema, wipeIfExists: boolean, verbose: boolean): SyncTasks.Promise<void>;

dist/InMemoryProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var __extends = (this && this.__extends) || function (d, b) {
1212
};
1313
var _ = require('lodash');
1414
var SyncTasks = require('synctasks');
15-
var NoSqlProvider = require('./NoSqlProvider');
15+
var NoSqlProvider = require('./NoSqlProviderInterfaces');
1616
var NoSqlProviderUtils = require('./NoSqlProviderUtils');
1717
// Very simple in-memory dbprovider for handling IE inprivate windows (and unit tests, maybe?)
1818
var InMemoryProvider = (function (_super) {

dist/IndexedDbProvider.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import SyncTasks = require('synctasks');
2-
import NoSqlProvider = require('./NoSqlProvider');
2+
import NoSqlProvider = require('./NoSqlProviderInterfaces');
33
export declare class IndexedDbProvider extends NoSqlProvider.DbProvider {
44
private _db;
55
private _test;

dist/IndexedDbProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var __extends = (this && this.__extends) || function (d, b) {
1212
};
1313
var _ = require('lodash');
1414
var SyncTasks = require('synctasks');
15-
var NoSqlProvider = require('./NoSqlProvider');
15+
var NoSqlProvider = require('./NoSqlProviderInterfaces');
1616
var NoSqlProviderUtils = require('./NoSqlProviderUtils');
1717
// The DbProvider implementation for IndexedDB. This one is fairly straightforward since the library's access patterns pretty
1818
// closely mirror IndexedDB's. We mostly do a lot of wrapping of the APIs into JQuery promises and have some fancy footwork to

dist/NoSqlProvider.d.ts

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,13 @@
11
/**
22
* NoSqlProvider.ts
33
* Author: David de Regt
4-
* Copyright: Microsoft 2015
4+
* Copyright: Microsoft 2016
55
*
66
* Low-level wrapper to expose a nosql-like database which can be backed by
77
* numerous different backend store types, invisible to the consumer. The
88
* usage semantics are very similar to IndexedDB.
99
*/
10-
import SyncTasks = require('synctasks');
11-
export interface IndexSchema {
12-
name: string;
13-
keyPath: string | string[];
14-
unique?: boolean;
15-
multiEntry?: boolean;
16-
}
17-
export interface StoreSchema {
18-
name: string;
19-
indexes?: IndexSchema[];
20-
primaryKeyPath: string | string[];
21-
}
22-
export interface DbSchema {
23-
version: number;
24-
lastUsableVersion?: number;
25-
stores: StoreSchema[];
26-
}
27-
export interface DbIndex {
28-
getAll<T>(reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
29-
getOnly<T>(key: any | any[], reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
30-
getRange<T>(keyLowRange: any | any[], keyHighRange: any | any[], lowRangeExclusive?: boolean, highRangeExclusive?: boolean, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
31-
}
32-
export interface DbStore {
33-
get<T>(key: any | any[]): SyncTasks.Promise<T>;
34-
getMultiple<T>(keyOrKeys: any | any[]): SyncTasks.Promise<T[]>;
35-
put(itemOrItems: any | any[]): SyncTasks.Promise<void>;
36-
remove(keyOrKeys: any | any[]): SyncTasks.Promise<void>;
37-
openPrimaryKey(): DbIndex;
38-
openIndex(indexName: string): DbIndex;
39-
clearAllData(): SyncTasks.Promise<void>;
40-
}
41-
export interface DbTransaction {
42-
getStore(storeName: string): DbStore;
43-
}
44-
export declare abstract class DbProvider {
45-
protected _schema: DbSchema;
46-
protected _verbose: boolean;
47-
open(dbName: string, schema: DbSchema, wipeIfExists: boolean, verbose: boolean): SyncTasks.Promise<void>;
48-
abstract close(): SyncTasks.Promise<void>;
49-
abstract openTransaction(storeNames: string | string[], writeNeeded: boolean): SyncTasks.Promise<DbTransaction>;
50-
clearAllData(): SyncTasks.Promise<void>;
51-
get<T>(storeName: string, key: any | any[]): SyncTasks.Promise<T>;
52-
getMultiple<T>(storeName: string, keyOrKeys: any | any[]): SyncTasks.Promise<T[]>;
53-
put(storeName: string, itemOrItems: any | any[]): SyncTasks.Promise<void>;
54-
remove(storeName: string, keyOrKeys: any | any[]): SyncTasks.Promise<void>;
55-
getAll<T>(storeName: string, indexName?: string, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
56-
getOnly<T>(storeName: string, indexName: string, key: any | any[], reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
57-
getRange<T>(storeName: string, indexName: string, keyLowRange: any | any[], keyHighRange: any | any[], lowRangeExclusive?: boolean, highRangeExclusive?: boolean, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
58-
}
59-
export declare function openListOfProviders(providersToTry: DbProvider[], dbName: string, schema: DbSchema, wipeIfExists?: boolean, verbose?: boolean): SyncTasks.Promise<DbProvider>;
10+
export * from './NoSqlProviderInterfaces';
6011
export * from './CordovaNativeSqliteProvider';
6112
export * from './IndexedDbProvider';
6213
export * from './InMemoryProvider';

dist/NoSqlProviderInterfaces.d.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* NoSqlProviderInterfaces.ts
3+
* Author: David de Regt
4+
* Copyright: Microsoft 2016
5+
*
6+
* Basic interfaces and openListOfProviders function to export for module usage.
7+
*/
8+
import SyncTasks = require('synctasks');
9+
export interface IndexSchema {
10+
name: string;
11+
keyPath: string | string[];
12+
unique?: boolean;
13+
multiEntry?: boolean;
14+
}
15+
export interface StoreSchema {
16+
name: string;
17+
indexes?: IndexSchema[];
18+
primaryKeyPath: string | string[];
19+
}
20+
export interface DbSchema {
21+
version: number;
22+
lastUsableVersion?: number;
23+
stores: StoreSchema[];
24+
}
25+
export interface DbIndex {
26+
getAll<T>(reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
27+
getOnly<T>(key: any | any[], reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
28+
getRange<T>(keyLowRange: any | any[], keyHighRange: any | any[], lowRangeExclusive?: boolean, highRangeExclusive?: boolean, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
29+
}
30+
export interface DbStore {
31+
get<T>(key: any | any[]): SyncTasks.Promise<T>;
32+
getMultiple<T>(keyOrKeys: any | any[]): SyncTasks.Promise<T[]>;
33+
put(itemOrItems: any | any[]): SyncTasks.Promise<void>;
34+
remove(keyOrKeys: any | any[]): SyncTasks.Promise<void>;
35+
openPrimaryKey(): DbIndex;
36+
openIndex(indexName: string): DbIndex;
37+
clearAllData(): SyncTasks.Promise<void>;
38+
}
39+
export interface DbTransaction {
40+
getStore(storeName: string): DbStore;
41+
}
42+
export declare abstract class DbProvider {
43+
protected _schema: DbSchema;
44+
protected _verbose: boolean;
45+
open(dbName: string, schema: DbSchema, wipeIfExists: boolean, verbose: boolean): SyncTasks.Promise<void>;
46+
abstract close(): SyncTasks.Promise<void>;
47+
abstract openTransaction(storeNames: string | string[], writeNeeded: boolean): SyncTasks.Promise<DbTransaction>;
48+
clearAllData(): SyncTasks.Promise<void>;
49+
get<T>(storeName: string, key: any | any[]): SyncTasks.Promise<T>;
50+
getMultiple<T>(storeName: string, keyOrKeys: any | any[]): SyncTasks.Promise<T[]>;
51+
put(storeName: string, itemOrItems: any | any[]): SyncTasks.Promise<void>;
52+
remove(storeName: string, keyOrKeys: any | any[]): SyncTasks.Promise<void>;
53+
getAll<T>(storeName: string, indexName?: string, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
54+
getOnly<T>(storeName: string, indexName: string, key: any | any[], reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
55+
getRange<T>(storeName: string, indexName: string, keyLowRange: any | any[], keyHighRange: any | any[], lowRangeExclusive?: boolean, highRangeExclusive?: boolean, reverse?: boolean, limit?: number, offset?: number): SyncTasks.Promise<T[]>;
56+
}
57+
export declare function openListOfProviders(providersToTry: DbProvider[], dbName: string, schema: DbSchema, wipeIfExists?: boolean, verbose?: boolean): SyncTasks.Promise<DbProvider>;

dist/NoSqlProviderInterfaces.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/**
2+
* NoSqlProviderInterfaces.ts
3+
* Author: David de Regt
4+
* Copyright: Microsoft 2016
5+
*
6+
* Basic interfaces and openListOfProviders function to export for module usage.
7+
*/
8+
var SyncTasks = require('synctasks');
9+
// Abstract base type for a database provider. Has accessors for opening transactions and one-off accesor helpers.
10+
// Note: this is a different concept than a DbStore or DbIndex, although it provides a similar (or identical) interface.
11+
var DbProvider = (function () {
12+
function DbProvider() {
13+
}
14+
DbProvider.prototype.open = function (dbName, schema, wipeIfExists, verbose) {
15+
// virtual call
16+
this._schema = schema;
17+
this._verbose = verbose;
18+
return null;
19+
};
20+
DbProvider.prototype.clearAllData = function () {
21+
var storeNames = this._schema.stores.map(function (store) { return store.name; });
22+
return this.openTransaction(storeNames, true).then(function (trans) {
23+
var clearers = storeNames.map(function (name) {
24+
var store = trans.getStore(name);
25+
return store.clearAllData();
26+
});
27+
return SyncTasks.whenAll(clearers).then(function (rets) { return void 0; });
28+
});
29+
};
30+
// Shortcut functions
31+
DbProvider.prototype.get = function (storeName, key) {
32+
return this.openTransaction(storeName, false).then(function (trans) {
33+
var store = trans.getStore(storeName);
34+
return store.get(key);
35+
});
36+
};
37+
DbProvider.prototype.getMultiple = function (storeName, keyOrKeys) {
38+
return this.openTransaction(storeName, false).then(function (trans) {
39+
var store = trans.getStore(storeName);
40+
return store.getMultiple(keyOrKeys);
41+
});
42+
};
43+
DbProvider.prototype.put = function (storeName, itemOrItems) {
44+
return this.openTransaction(storeName, true).then(function (trans) {
45+
var store = trans.getStore(storeName);
46+
return store.put(itemOrItems);
47+
});
48+
};
49+
DbProvider.prototype.remove = function (storeName, keyOrKeys) {
50+
return this.openTransaction(storeName, true).then(function (trans) {
51+
var store = trans.getStore(storeName);
52+
return store.remove(keyOrKeys);
53+
});
54+
};
55+
DbProvider.prototype.getAll = function (storeName, indexName, reverse, limit, offset) {
56+
return this.openTransaction(storeName, false).then(function (trans) {
57+
var store = trans.getStore(storeName);
58+
var index = indexName ? store.openIndex(indexName) : store.openPrimaryKey();
59+
return index.getAll(reverse, limit, offset);
60+
});
61+
};
62+
DbProvider.prototype.getOnly = function (storeName, indexName, key, reverse, limit, offset) {
63+
return this.openTransaction(storeName, false).then(function (trans) {
64+
var store = trans.getStore(storeName);
65+
var index = indexName ? store.openIndex(indexName) : store.openPrimaryKey();
66+
return index.getOnly(key, reverse, limit, offset);
67+
});
68+
};
69+
DbProvider.prototype.getRange = function (storeName, indexName, keyLowRange, keyHighRange, lowRangeExclusive, highRangeExclusive, reverse, limit, offset) {
70+
return this.openTransaction(storeName, false).then(function (trans) {
71+
var store = trans.getStore(storeName);
72+
var index = indexName ? store.openIndex(indexName) : store.openPrimaryKey();
73+
return index.getRange(keyLowRange, keyHighRange, lowRangeExclusive, highRangeExclusive, reverse, limit, offset);
74+
});
75+
};
76+
return DbProvider;
77+
})();
78+
exports.DbProvider = DbProvider;
79+
// Runs down the given providers in order and tries to instantiate them. If they're not supported, it will continue until it finds one
80+
// that does work, or it will reject the promise if it runs out of providers and none work.
81+
function openListOfProviders(providersToTry, dbName, schema, wipeIfExists, verbose) {
82+
if (wipeIfExists === void 0) { wipeIfExists = false; }
83+
if (verbose === void 0) { verbose = false; }
84+
var task = SyncTasks.Defer();
85+
var providerIndex = 0;
86+
var tryNext = function () {
87+
if (providerIndex >= providersToTry.length) {
88+
task.reject();
89+
return;
90+
}
91+
var provider = providersToTry[providerIndex];
92+
provider.open(dbName, schema, wipeIfExists, verbose).then(function () {
93+
task.resolve(provider);
94+
}, function () {
95+
providerIndex++;
96+
tryNext();
97+
});
98+
};
99+
tryNext();
100+
return task.promise();
101+
}
102+
exports.openListOfProviders = openListOfProviders;

dist/NodeSqlite3MemoryDbProvider.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Largely only used for unit tests.
88
*/
99
import SyncTasks = require('synctasks');
10-
import NoSqlProvider = require('./NoSqlProvider');
10+
import NoSqlProvider = require('./NoSqlProviderInterfaces');
1111
import SqlProviderBase = require('./SqlProviderBase');
1212
export declare class NodeSqlite3MemoryDbProvider extends SqlProviderBase.SqlProviderBase {
1313
private _sqlite3;

dist/ReactNativeSqliteProvider.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* NoSqlProvider provider setup for react-native-sqlite, a React Native plugin that wraps sqlite.
77
*/
88
import SyncTasks = require('synctasks');
9-
import NoSqlProvider = require('./NoSqlProvider');
9+
import NoSqlProvider = require('./NoSqlProviderInterfaces');
1010
import SqlProviderBase = require('./SqlProviderBase');
1111
export declare class ReactNativeSqliteProvider extends SqlProviderBase.SqlProviderBase {
1212
private _reactNativeSqlite;

0 commit comments

Comments
 (0)