@live-change/db-server 0.4.79 → 0.4.83
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/Dockerfile +1 -1
- package/bin/server.js +1 -1
- package/lib/Server.js +33 -24
- package/lib/backend.js +22 -1
- package/package.json +15 -15
package/Dockerfile
CHANGED
package/bin/server.js
CHANGED
|
@@ -53,7 +53,7 @@ function storeOptions(yargs, defaults = {}) {
|
|
|
53
53
|
default: defaults.dbRoot || '.'
|
|
54
54
|
})
|
|
55
55
|
yargs.option('backend', {
|
|
56
|
-
describe: 'database backend engine ( lmdb | leveldb | rocksdb | mem )',
|
|
56
|
+
describe: 'database backend engine ( lmdb | leveldb | rocksdb | memdown | mem )',
|
|
57
57
|
type: "string",
|
|
58
58
|
default: defaults.backend || 'lmdb'
|
|
59
59
|
})
|
package/lib/Server.js
CHANGED
|
@@ -21,6 +21,7 @@ class DatabaseStore {
|
|
|
21
21
|
constructor(path, backend, options) {
|
|
22
22
|
this.path = path
|
|
23
23
|
this.backend = backend
|
|
24
|
+
this.options = options
|
|
24
25
|
this.stores = new Map()
|
|
25
26
|
this.db = backend.createDb(path, options)
|
|
26
27
|
}
|
|
@@ -157,22 +158,24 @@ class Server {
|
|
|
157
158
|
}
|
|
158
159
|
}
|
|
159
160
|
async initialize(initOptions = {}) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.metadata
|
|
161
|
+
if(!this.config.temporary) {
|
|
162
|
+
const normalMetadataPath = path.resolve(this.config.dbRoot, 'metadata.json')
|
|
163
|
+
const backupMetadataPath = path.resolve(this.config.dbRoot, 'metadata.json.bak')
|
|
164
|
+
const normalMetadataExists = await fs.promises.access(normalMetadataPath).catch(err => false)
|
|
165
|
+
const backupMetadataExists = await fs.promises.access(backupMetadataPath).catch(err => false)
|
|
166
|
+
if(initOptions.forceNew && (normalMetadataExists || backupMetadataExists))
|
|
167
|
+
throw new Error("database already exists")
|
|
168
|
+
const normalMetadata = await fs.promises.readFile(normalMetadataPath, "utf8")
|
|
169
|
+
.then(json => JSON.parse(json)).catch(err => null)
|
|
170
|
+
const backupMetadata = await fs.promises.readFile(backupMetadataPath, "utf8")
|
|
171
|
+
.then(json => JSON.parse(json)).catch(err => null)
|
|
172
|
+
this.metadata = normalMetadata
|
|
173
|
+
if(!normalMetadata) this.metadata = backupMetadata
|
|
174
|
+
if(this.metadata && backupMetadata && this.metadata.timestamp < backupMetadata.timestamp)
|
|
175
|
+
this.metadata = backupMetadata
|
|
176
|
+
if(!this.metadata && (normalMetadataExists || backupMetadataExists)) throw new Error("database is broken")
|
|
177
|
+
}
|
|
174
178
|
if(!this.metadata) {
|
|
175
|
-
if(normalMetadataExists || backupMetadataExists) throw new Error("database is broken")
|
|
176
179
|
this.metadata = {
|
|
177
180
|
databases: {
|
|
178
181
|
system: {
|
|
@@ -218,7 +221,7 @@ class Server {
|
|
|
218
221
|
}
|
|
219
222
|
}
|
|
220
223
|
async initDatabase(dbName, dbConfig) {
|
|
221
|
-
const dbPath = path.resolve(this.config.dbRoot, dbName+'.db')
|
|
224
|
+
const dbPath = this.config.temporary ? 'memory' : path.resolve(this.config.dbRoot, dbName+'.db')
|
|
222
225
|
let dbStore = this.databaseStores.get(dbName)
|
|
223
226
|
if(!dbStore) {
|
|
224
227
|
console.log("CREATE DB", dbPath, dbConfig.storage)
|
|
@@ -226,14 +229,16 @@ class Server {
|
|
|
226
229
|
this.databaseStores.set(dbName, dbStore)
|
|
227
230
|
}
|
|
228
231
|
const database = new Database(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
232
|
+
dbConfig,
|
|
233
|
+
(name, config) => dbStore.getStore(name, config),
|
|
234
|
+
(configToSave) => {
|
|
235
|
+
this.metadata.databases[dbName] = configToSave
|
|
236
|
+
this.saveMetadata()
|
|
237
|
+
},
|
|
238
|
+
(name) => dbStore.deleteStore(name),
|
|
239
|
+
dbName,
|
|
240
|
+
(context) => new ScriptContext(context)
|
|
241
|
+
)
|
|
237
242
|
database.onAutoRemoveIndex = (name, uid) => {
|
|
238
243
|
this.databases.get('system').table(dbName+'_indexes').delete(uid)
|
|
239
244
|
}
|
|
@@ -244,6 +249,7 @@ class Server {
|
|
|
244
249
|
}
|
|
245
250
|
|
|
246
251
|
async doSaveMetadata() {
|
|
252
|
+
if(this.config.temporary) return
|
|
247
253
|
//console.log("SAVE METADATA\n"+JSON.stringify(this.metadata, null, " "))
|
|
248
254
|
const normalMetadataPath = path.resolve(this.config.dbRoot, 'metadata.json')
|
|
249
255
|
const backupMetadataPath = path.resolve(this.config.dbRoot, 'metadata.json.bak')
|
|
@@ -289,6 +295,9 @@ class Server {
|
|
|
289
295
|
}
|
|
290
296
|
|
|
291
297
|
async close() {
|
|
298
|
+
if(this.http) {
|
|
299
|
+
this.http.server.close()
|
|
300
|
+
}
|
|
292
301
|
for(const db of this.databaseStores.values()) db.close()
|
|
293
302
|
}
|
|
294
303
|
|
package/lib/backend.js
CHANGED
|
@@ -61,7 +61,7 @@ function createBackend(config) {
|
|
|
61
61
|
await store.clear()
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
} else if(config.backend == '
|
|
64
|
+
} else if(config.backend == 'memdown') {
|
|
65
65
|
return {
|
|
66
66
|
levelup: require('levelup'),
|
|
67
67
|
memdown: require('memdown'),
|
|
@@ -90,6 +90,27 @@ function createBackend(config) {
|
|
|
90
90
|
await store.clear()
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
} else if(config.backend == 'mem') {
|
|
94
|
+
return {
|
|
95
|
+
Store: require('@live-change/db-store-rbtree'),
|
|
96
|
+
createDb(path, options) {
|
|
97
|
+
const db = {}
|
|
98
|
+
db.path = path
|
|
99
|
+
return db
|
|
100
|
+
},
|
|
101
|
+
closeDb(db) {
|
|
102
|
+
},
|
|
103
|
+
async deleteDb(db) {
|
|
104
|
+
},
|
|
105
|
+
createStore(db, name, options) {
|
|
106
|
+
return new this.Store()
|
|
107
|
+
},
|
|
108
|
+
closeStore(store) {
|
|
109
|
+
},
|
|
110
|
+
async deleteStore(store) {
|
|
111
|
+
await store.clear()
|
|
112
|
+
}
|
|
113
|
+
}
|
|
93
114
|
} else if(config.backend == 'lmdb') {
|
|
94
115
|
return {
|
|
95
116
|
lmdb: require('node-lmdb'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/db-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.83",
|
|
4
4
|
"description": "Database with observable data for live queries",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -25,25 +25,25 @@
|
|
|
25
25
|
},
|
|
26
26
|
"homepage": "https://github.com/live-change/db-server",
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"encoding-down": "^
|
|
28
|
+
"encoding-down": "^7.0.0",
|
|
29
29
|
"level-rocksdb": "^4.0.0",
|
|
30
|
-
"leveldown": "^
|
|
31
|
-
"levelup": "^
|
|
32
|
-
"memdown": "^
|
|
33
|
-
"node-lmdb": "^0.
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"tape": "^4.13.3"
|
|
30
|
+
"leveldown": "^6.0.0",
|
|
31
|
+
"levelup": "^5.0.1",
|
|
32
|
+
"memdown": "^6.0.0",
|
|
33
|
+
"node-lmdb": "^0.9.5",
|
|
34
|
+
"subleveldown": "^5.0.1",
|
|
35
|
+
"tape": "^5.2.2"
|
|
37
36
|
},
|
|
38
37
|
"dependencies": {
|
|
39
|
-
"@live-change/dao": "^0.
|
|
40
|
-
"@live-change/dao-sockjs": "^0.
|
|
41
|
-
"@live-change/dao-websocket": "^0.
|
|
42
|
-
"@live-change/db": "^0.3.
|
|
38
|
+
"@live-change/dao": "^0.3.3",
|
|
39
|
+
"@live-change/dao-sockjs": "^0.2.0",
|
|
40
|
+
"@live-change/dao-websocket": "^0.3.1",
|
|
41
|
+
"@live-change/db": "^0.3.63",
|
|
43
42
|
"@live-change/db-client": "^0.4.70",
|
|
44
|
-
"@live-change/db-store-level": "^0.1.
|
|
43
|
+
"@live-change/db-store-level": "^0.1.14",
|
|
45
44
|
"@live-change/db-store-lmdb": "^0.1.21",
|
|
46
45
|
"@live-change/db-store-observable-db": "^0.1.1",
|
|
46
|
+
"@live-change/db-store-rbtree": "^0.1.1",
|
|
47
47
|
"express": "^4.17.1",
|
|
48
48
|
"line-reader": "^0.4.0",
|
|
49
49
|
"node-interval-tree": "^1.3.3",
|
|
@@ -53,6 +53,6 @@
|
|
|
53
53
|
"segfault-handler": "^1.3.0",
|
|
54
54
|
"sockjs": "^0.3.21",
|
|
55
55
|
"websocket": "^1.0.34",
|
|
56
|
-
"yargs": "^
|
|
56
|
+
"yargs": "^17.0.1"
|
|
57
57
|
}
|
|
58
58
|
}
|