cojson-storage-sqlite 0.2.1 → 0.2.2
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/dist/index.js +42 -23
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +66 -40
package/dist/index.js
CHANGED
|
@@ -27,27 +27,46 @@ export class SQLiteStorage {
|
|
|
27
27
|
static async open(filename, fromLocalNode, toLocalNode) {
|
|
28
28
|
const db = Database(filename);
|
|
29
29
|
db.pragma("journal_mode = WAL");
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
30
|
+
const oldVersion = db.pragma("user_version")[0].user_version;
|
|
31
|
+
console.log("DB version", oldVersion);
|
|
32
|
+
if (oldVersion === 0) {
|
|
33
|
+
console.log("Migration 0 -> 1: Basic schema");
|
|
34
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS transactions (
|
|
35
|
+
ses INTEGER,
|
|
36
|
+
idx INTEGER,
|
|
37
|
+
tx TEXT NOT NULL ,
|
|
38
|
+
PRIMARY KEY (ses, idx)
|
|
39
|
+
) WITHOUT ROWID;`).run();
|
|
40
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS sessions (
|
|
41
|
+
rowID INTEGER PRIMARY KEY,
|
|
42
|
+
coValue INTEGER NOT NULL,
|
|
43
|
+
sessionID TEXT NOT NULL,
|
|
44
|
+
lastIdx INTEGER,
|
|
45
|
+
lastSignature TEXT,
|
|
46
|
+
UNIQUE (sessionID, coValue)
|
|
47
|
+
);`).run();
|
|
48
|
+
db.prepare(`CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);`).run();
|
|
49
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS coValues (
|
|
50
|
+
rowID INTEGER PRIMARY KEY,
|
|
51
|
+
id TEXT NOT NULL UNIQUE,
|
|
52
|
+
header TEXT NOT NULL UNIQUE
|
|
53
|
+
);`).run();
|
|
54
|
+
db.prepare(`CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);`).run();
|
|
55
|
+
db.pragma("user_version = 1");
|
|
56
|
+
console.log("Migration 0 -> 1: Basic schema - done");
|
|
57
|
+
}
|
|
58
|
+
if (oldVersion === 1) {
|
|
59
|
+
// fix embarrassing off-by-one error for transaction indices
|
|
60
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices");
|
|
61
|
+
const txs = db.prepare(`SELECT * FROM transactions`).all();
|
|
62
|
+
for (const tx of txs) {
|
|
63
|
+
db.prepare(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
|
|
64
|
+
tx.idx -= 1;
|
|
65
|
+
db.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`).run(tx.ses, tx.idx, tx.tx);
|
|
66
|
+
}
|
|
67
|
+
db.pragma("user_version = 2");
|
|
68
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
|
|
69
|
+
}
|
|
51
70
|
return new SQLiteStorage(db, fromLocalNode, toLocalNode);
|
|
52
71
|
}
|
|
53
72
|
async handleSyncMessage(msg) {
|
|
@@ -94,7 +113,7 @@ export class SQLiteStorage {
|
|
|
94
113
|
(theirKnown.sessions[sessionRow.sessionID] || 0)) {
|
|
95
114
|
const firstNewTxIdx = theirKnown.sessions[sessionRow.sessionID] || 0;
|
|
96
115
|
const newTxInSession = this.db
|
|
97
|
-
.prepare(`SELECT * FROM transactions WHERE ses = ? AND idx
|
|
116
|
+
.prepare(`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`)
|
|
98
117
|
.all(sessionRow.rowID, firstNewTxIdx);
|
|
99
118
|
newContent.new[sessionRow.sessionID] = {
|
|
100
119
|
after: firstNewTxIdx,
|
|
@@ -201,10 +220,10 @@ export class SQLiteStorage {
|
|
|
201
220
|
.get(sessionUpdate.coValue, sessionUpdate.sessionID, sessionUpdate.lastIdx, sessionUpdate.lastSignature);
|
|
202
221
|
const sessionRowID = upsertedSession.rowID;
|
|
203
222
|
for (const newTransaction of actuallyNewTransactions) {
|
|
204
|
-
nextIdx++;
|
|
205
223
|
this.db
|
|
206
224
|
.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`)
|
|
207
225
|
.run(sessionRowID, nextIdx, JSON.stringify(newTransaction));
|
|
226
|
+
nextIdx++;
|
|
208
227
|
}
|
|
209
228
|
}
|
|
210
229
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe;AAKf,uBAAuB;AACvB,aAAa;EAChB,MAAM,QAAQ,CAAC;AAQhB,OAAO,QAAmC,MAAM,gBAAgB,CAAC;AAyBjE,MAAM,OAAO,aAAa;IAKtB,YACI,EAAa,EACb,aAA0C,EAC1C,WAAwC;QAExC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;QAE3C,CAAC,KAAK,IAAI,EAAE;YACR,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,OAAO,CAAC,IAAI,EAAE;gBACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBAEnB,IAAI,MAAM,CAAC,KAAK,EAAE;oBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBAC9C;aACJ;QACL,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAChB,QAAQ,EACR,KAAK,EACL,aAAa,GAAG,OAAO,GAK1B;QACG,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,cAAc,CACnE,aAAa,EACb,SAAS,EACT,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CACtD,CAAC;QAEF,MAAM,aAAa,CAAC,IAAI,CACpB,QAAQ,EACR,eAAe,CAAC,QAAQ,EACxB,eAAe,CAAC,QAAQ,CAC3B,CAAC;QAEF,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACb,QAAgB,EAChB,aAA0C,EAC1C,WAAwC;QAExC,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEhC,EAAE,CAAC,OAAO,CACN;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-storage-sqlite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.2",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/better-sqlite3": "^7.6.4"
|
|
20
20
|
},
|
|
21
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "3a2e854a8874b595a94dc8adec93508038ddc42b"
|
|
22
22
|
}
|
package/src/index.ts
CHANGED
|
@@ -98,41 +98,67 @@ export class SQLiteStorage {
|
|
|
98
98
|
const db = Database(filename);
|
|
99
99
|
db.pragma("journal_mode = WAL");
|
|
100
100
|
|
|
101
|
-
db.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
101
|
+
const oldVersion = (db.pragma("user_version") as [{user_version: number}])[0].user_version as number;
|
|
102
|
+
|
|
103
|
+
console.log("DB version", oldVersion);
|
|
104
|
+
|
|
105
|
+
if (oldVersion === 0) {
|
|
106
|
+
console.log("Migration 0 -> 1: Basic schema");
|
|
107
|
+
db.prepare(
|
|
108
|
+
`CREATE TABLE IF NOT EXISTS transactions (
|
|
109
|
+
ses INTEGER,
|
|
110
|
+
idx INTEGER,
|
|
111
|
+
tx TEXT NOT NULL ,
|
|
112
|
+
PRIMARY KEY (ses, idx)
|
|
113
|
+
) WITHOUT ROWID;`
|
|
114
|
+
).run();
|
|
115
|
+
|
|
116
|
+
db.prepare(
|
|
117
|
+
`CREATE TABLE IF NOT EXISTS sessions (
|
|
118
|
+
rowID INTEGER PRIMARY KEY,
|
|
119
|
+
coValue INTEGER NOT NULL,
|
|
120
|
+
sessionID TEXT NOT NULL,
|
|
121
|
+
lastIdx INTEGER,
|
|
122
|
+
lastSignature TEXT,
|
|
123
|
+
UNIQUE (sessionID, coValue)
|
|
124
|
+
);`
|
|
125
|
+
).run();
|
|
126
|
+
|
|
127
|
+
db.prepare(
|
|
128
|
+
`CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);`
|
|
129
|
+
).run();
|
|
130
|
+
|
|
131
|
+
db.prepare(
|
|
132
|
+
`CREATE TABLE IF NOT EXISTS coValues (
|
|
133
|
+
rowID INTEGER PRIMARY KEY,
|
|
134
|
+
id TEXT NOT NULL UNIQUE,
|
|
135
|
+
header TEXT NOT NULL UNIQUE
|
|
136
|
+
);`
|
|
137
|
+
).run();
|
|
138
|
+
|
|
139
|
+
db.prepare(
|
|
140
|
+
`CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);`
|
|
141
|
+
).run();
|
|
142
|
+
|
|
143
|
+
db.pragma("user_version = 1");
|
|
144
|
+
console.log("Migration 0 -> 1: Basic schema - done");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (oldVersion === 1) {
|
|
148
|
+
// fix embarrassing off-by-one error for transaction indices
|
|
149
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices");
|
|
150
|
+
|
|
151
|
+
const txs = db.prepare(`SELECT * FROM transactions`).all() as TransactionRow[];
|
|
152
|
+
|
|
153
|
+
for (const tx of txs) {
|
|
154
|
+
db.prepare(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
|
|
155
|
+
tx.idx -= 1;
|
|
156
|
+
db.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`).run(tx.ses, tx.idx, tx.tx);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
db.pragma("user_version = 2");
|
|
160
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
|
|
161
|
+
}
|
|
136
162
|
|
|
137
163
|
return new SQLiteStorage(db, fromLocalNode, toLocalNode);
|
|
138
164
|
}
|
|
@@ -198,7 +224,7 @@ export class SQLiteStorage {
|
|
|
198
224
|
|
|
199
225
|
const newTxInSession = this.db
|
|
200
226
|
.prepare<[number, number]>(
|
|
201
|
-
`SELECT * FROM transactions WHERE ses = ? AND idx
|
|
227
|
+
`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`
|
|
202
228
|
)
|
|
203
229
|
.all(sessionRow.rowID, firstNewTxIdx) as TransactionRow[];
|
|
204
230
|
|
|
@@ -356,16 +382,16 @@ export class SQLiteStorage {
|
|
|
356
382
|
const sessionRowID = upsertedSession.rowID;
|
|
357
383
|
|
|
358
384
|
for (const newTransaction of actuallyNewTransactions) {
|
|
359
|
-
nextIdx++;
|
|
360
385
|
this.db
|
|
361
|
-
|
|
362
|
-
|
|
386
|
+
.prepare<[number, number, string]>(
|
|
387
|
+
`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`
|
|
363
388
|
)
|
|
364
389
|
.run(
|
|
365
390
|
sessionRowID,
|
|
366
391
|
nextIdx,
|
|
367
392
|
JSON.stringify(newTransaction)
|
|
368
|
-
|
|
393
|
+
);
|
|
394
|
+
nextIdx++;
|
|
369
395
|
}
|
|
370
396
|
}
|
|
371
397
|
}
|