@enbox/dwn-sql-store 0.0.21 → 0.0.22
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/esm/src/blockstore-sql.js +18 -8
- package/dist/esm/src/blockstore-sql.js.map +1 -1
- package/dist/esm/src/data-store-s3.js +17 -48
- package/dist/esm/src/data-store-s3.js.map +1 -1
- package/dist/esm/src/data-store-sql.js +17 -49
- package/dist/esm/src/data-store-sql.js.map +1 -1
- package/dist/esm/src/message-store-sql.js +2 -44
- package/dist/esm/src/message-store-sql.js.map +1 -1
- package/dist/esm/src/utils/data-refs.js +55 -0
- package/dist/esm/src/utils/data-refs.js.map +1 -0
- package/dist/esm/src/utils/duplicate-key-error.js +33 -0
- package/dist/esm/src/utils/duplicate-key-error.js.map +1 -0
- package/dist/types/src/blockstore-sql.d.ts.map +1 -1
- package/dist/types/src/data-store-s3.d.ts.map +1 -1
- package/dist/types/src/data-store-sql.d.ts.map +1 -1
- package/dist/types/src/message-store-sql.d.ts +1 -16
- package/dist/types/src/message-store-sql.d.ts.map +1 -1
- package/dist/types/src/utils/data-refs.d.ts +13 -0
- package/dist/types/src/utils/data-refs.d.ts.map +1 -0
- package/dist/types/src/utils/duplicate-key-error.d.ts +6 -0
- package/dist/types/src/utils/duplicate-key-error.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/blockstore-sql.ts +17 -8
- package/src/data-store-s3.ts +16 -51
- package/src/data-store-sql.ts +16 -53
- package/src/message-store-sql.ts +2 -54
- package/src/utils/data-refs.ts +89 -0
- package/src/utils/duplicate-key-error.ts +42 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CID } from 'multiformats';
|
|
2
|
+
import { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
2
3
|
/**
|
|
3
4
|
* SQL-backed implementation of the `Blockstore` v5 interface, scoped to a
|
|
4
5
|
* single `rootDataCid`. All block operations are constrained to the blocks
|
|
@@ -25,14 +26,23 @@ export class BlockstoreSql {
|
|
|
25
26
|
}
|
|
26
27
|
async put(key, val, _options) {
|
|
27
28
|
const blockCid = key.toString();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
try {
|
|
30
|
+
await this.#db
|
|
31
|
+
.insertInto('dataBlocks')
|
|
32
|
+
.values({
|
|
33
|
+
rootDataCid: this.#rootDataCid,
|
|
34
|
+
blockCid,
|
|
35
|
+
data: Buffer.from(val),
|
|
36
|
+
})
|
|
37
|
+
.execute();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!isDuplicateKeyError(error)) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
// Idempotent block put: overlapping writes of the same dataCid can
|
|
44
|
+
// import the same content-addressed block concurrently.
|
|
45
|
+
}
|
|
36
46
|
return key;
|
|
37
47
|
}
|
|
38
48
|
async get(key, _options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockstore-sql.js","sourceRoot":"","sources":["../../../src/blockstore-sql.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"blockstore-sql.js","sourceRoot":"","sources":["../../../src/blockstore-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as DataRefs from './utils/data-refs.js';
|
|
1
2
|
import { DataStream } from '@enbox/dwn-sdk-js';
|
|
2
3
|
import { Readable } from 'stream';
|
|
3
4
|
import { Upload } from '@aws-sdk/lib-storage';
|
|
@@ -49,14 +50,8 @@ export class DataStoreS3 {
|
|
|
49
50
|
}
|
|
50
51
|
async get(tenant, recordId, dataCid) {
|
|
51
52
|
const db = this.#getDb('get');
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
.select('dataSize')
|
|
55
|
-
.where('tenant', '=', tenant)
|
|
56
|
-
.where('recordId', '=', recordId)
|
|
57
|
-
.where('dataCid', '=', dataCid)
|
|
58
|
-
.executeTakeFirst();
|
|
59
|
-
if (!ref) {
|
|
53
|
+
const dataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
54
|
+
if (dataSize === undefined) {
|
|
60
55
|
return undefined;
|
|
61
56
|
}
|
|
62
57
|
const response = await this.#s3.send(new GetObjectCommand({
|
|
@@ -68,63 +63,37 @@ export class DataStoreS3 {
|
|
|
68
63
|
}
|
|
69
64
|
const dataStream = response.Body.transformToWebStream();
|
|
70
65
|
return {
|
|
71
|
-
dataSize
|
|
66
|
+
dataSize,
|
|
72
67
|
dataStream,
|
|
73
68
|
};
|
|
74
69
|
}
|
|
75
70
|
async put(tenant, recordId, dataCid, dataStream) {
|
|
76
71
|
const db = this.#getDb('put');
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.selectFrom('dataRefs')
|
|
80
|
-
.select('dataSize')
|
|
81
|
-
.where('tenant', '=', tenant)
|
|
82
|
-
.where('recordId', '=', recordId)
|
|
83
|
-
.where('dataCid', '=', dataCid)
|
|
84
|
-
.executeTakeFirst();
|
|
85
|
-
if (existingRef) {
|
|
72
|
+
const existingDataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
73
|
+
if (existingDataSize !== undefined) {
|
|
86
74
|
await DataStream.toBytes(dataStream);
|
|
87
|
-
return { dataSize:
|
|
75
|
+
return { dataSize: existingDataSize };
|
|
88
76
|
}
|
|
89
77
|
// Check if another ref for this dataCid already exists (dedup path).
|
|
90
|
-
const
|
|
91
|
-
.selectFrom('dataRefs')
|
|
92
|
-
.select('dataSize')
|
|
93
|
-
.where('dataCid', '=', dataCid)
|
|
94
|
-
.executeTakeFirst();
|
|
78
|
+
const otherDataSize = await DataRefs.getAnyDataRefSize(db, dataCid);
|
|
95
79
|
let dataSize;
|
|
96
|
-
if (
|
|
97
|
-
// S3 object already exists — skip upload.
|
|
98
|
-
await DataStream.toBytes(dataStream);
|
|
99
|
-
dataSize = Number(otherRef.dataSize);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
80
|
+
if (otherDataSize === undefined) {
|
|
102
81
|
// New data — upload to S3 with a counting passthrough.
|
|
103
82
|
dataSize = await this.#uploadToS3(dataCid, dataStream);
|
|
104
83
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
|
|
109
|
-
|
|
84
|
+
else {
|
|
85
|
+
// S3 object already exists — skip upload.
|
|
86
|
+
await DataStream.toBytes(dataStream);
|
|
87
|
+
dataSize = otherDataSize;
|
|
88
|
+
}
|
|
89
|
+
dataSize = await DataRefs.insertDataRef(db, { tenant, recordId, dataCid }, dataSize);
|
|
110
90
|
return { dataSize };
|
|
111
91
|
}
|
|
112
92
|
async delete(tenant, recordId, dataCid) {
|
|
113
93
|
const db = this.#getDb('delete');
|
|
114
|
-
|
|
115
|
-
await db
|
|
116
|
-
.deleteFrom('dataRefs')
|
|
117
|
-
.where('tenant', '=', tenant)
|
|
118
|
-
.where('recordId', '=', recordId)
|
|
119
|
-
.where('dataCid', '=', dataCid)
|
|
120
|
-
.execute();
|
|
94
|
+
await DataRefs.deleteDataRef(db, { tenant, recordId, dataCid });
|
|
121
95
|
// Garbage-collect the S3 object if no more refs point to this dataCid.
|
|
122
|
-
|
|
123
|
-
.selectFrom('dataRefs')
|
|
124
|
-
.select('dataCid')
|
|
125
|
-
.where('dataCid', '=', dataCid)
|
|
126
|
-
.executeTakeFirst();
|
|
127
|
-
if (!remaining) {
|
|
96
|
+
if (!await DataRefs.hasAnyDataRef(db, dataCid)) {
|
|
128
97
|
await this.#s3.send(new DeleteObjectCommand({
|
|
129
98
|
Bucket: this.#bucket,
|
|
130
99
|
Key: dataCid,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-store-s3.js","sourceRoot":"","sources":["../../../src/data-store-s3.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,WAAW;IACb,QAAQ,CAAU;IAC3B,GAAG,GAAmC,IAAI,CAAC;IAClC,GAAG,CAAW;IACd,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,UAAU,CAAS;IAE5B,YAAY,MAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;QAC5D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,QAAQ,CAAC;YACzC,MAAM,EAAW,MAAM,CAAC,MAAM,IAAI,WAAW;YAC7C,QAAQ,EAAS,MAAM,CAAC,QAAQ;YAChC,cAAc,EAAG,MAAM,CAAC,cAAc,IAAI,KAAK;YAC/C,WAAW,EAAM,MAAM,CAAC,WAAW;SACpC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,qFAAqF;QACrF,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,GAAG,CACd,MAAc,EACd,QAAgB,EAChB,OAAe;QAEf,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,
|
|
1
|
+
{"version":3,"file":"data-store-s3.js","sourceRoot":"","sources":["../../../src/data-store-s3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as DataRefs from './utils/data-refs.js';
|
|
1
2
|
import { BlockstoreSql } from './blockstore-sql.js';
|
|
2
3
|
import { CID } from 'multiformats';
|
|
3
4
|
import { DataStream } from '@enbox/dwn-sdk-js';
|
|
@@ -36,15 +37,8 @@ export class DataStoreSql {
|
|
|
36
37
|
}
|
|
37
38
|
async get(tenant, recordId, dataCid) {
|
|
38
39
|
const db = this.#getDb('get');
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.selectFrom('dataRefs')
|
|
42
|
-
.select('dataSize')
|
|
43
|
-
.where('tenant', '=', tenant)
|
|
44
|
-
.where('recordId', '=', recordId)
|
|
45
|
-
.where('dataCid', '=', dataCid)
|
|
46
|
-
.executeTakeFirst();
|
|
47
|
-
if (!ref) {
|
|
40
|
+
const dataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
41
|
+
if (dataSize === undefined) {
|
|
48
42
|
return undefined;
|
|
49
43
|
}
|
|
50
44
|
const blockstore = new BlockstoreSql(db, dataCid);
|
|
@@ -63,24 +57,17 @@ export class DataStoreSql {
|
|
|
63
57
|
},
|
|
64
58
|
});
|
|
65
59
|
return {
|
|
66
|
-
dataSize
|
|
60
|
+
dataSize,
|
|
67
61
|
dataStream,
|
|
68
62
|
};
|
|
69
63
|
}
|
|
70
64
|
async put(tenant, recordId, dataCid, dataStream) {
|
|
71
65
|
const db = this.#getDb('put');
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.selectFrom('dataRefs')
|
|
75
|
-
.select('dataSize')
|
|
76
|
-
.where('tenant', '=', tenant)
|
|
77
|
-
.where('recordId', '=', recordId)
|
|
78
|
-
.where('dataCid', '=', dataCid)
|
|
79
|
-
.executeTakeFirst();
|
|
80
|
-
if (existingRef) {
|
|
66
|
+
const existingDataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
67
|
+
if (existingDataSize !== undefined) {
|
|
81
68
|
// Drain the stream — caller expects it to be consumed.
|
|
82
69
|
await DataStream.toBytes(dataStream);
|
|
83
|
-
return { dataSize:
|
|
70
|
+
return { dataSize: existingDataSize };
|
|
84
71
|
}
|
|
85
72
|
// Check if blocks for this dataCid already exist (dedup path).
|
|
86
73
|
const blockstore = new BlockstoreSql(db, dataCid);
|
|
@@ -90,21 +77,17 @@ export class DataStoreSql {
|
|
|
90
77
|
if (blocksExist) {
|
|
91
78
|
// Blocks already stored by a previous ref with the same dataCid.
|
|
92
79
|
// Get the data size from that existing ref.
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
.select('dataSize')
|
|
96
|
-
.where('dataCid', '=', dataCid)
|
|
97
|
-
.executeTakeFirst();
|
|
98
|
-
if (otherRef) {
|
|
99
|
-
dataSize = Number(otherRef.dataSize);
|
|
100
|
-
// Drain the stream — caller expects it to be consumed.
|
|
101
|
-
await DataStream.toBytes(dataStream);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
80
|
+
const otherDataSize = await DataRefs.getAnyDataRefSize(db, dataCid);
|
|
81
|
+
if (otherDataSize === undefined) {
|
|
104
82
|
// Edge case: blocks exist but no ref (interrupted previous put).
|
|
105
83
|
// Count bytes without full buffering.
|
|
106
84
|
dataSize = await DataStoreSql.#countStreamBytes(dataStream);
|
|
107
85
|
}
|
|
86
|
+
else {
|
|
87
|
+
dataSize = otherDataSize;
|
|
88
|
+
// Drain the stream — caller expects it to be consumed.
|
|
89
|
+
await DataStream.toBytes(dataStream);
|
|
90
|
+
}
|
|
108
91
|
}
|
|
109
92
|
else {
|
|
110
93
|
// New data — clean up any partial blocks from interrupted imports,
|
|
@@ -118,29 +101,14 @@ export class DataStoreSql {
|
|
|
118
101
|
}
|
|
119
102
|
dataSize = Number(dataDagRoot.unixfs?.fileSize() ?? dataDagRoot.size);
|
|
120
103
|
}
|
|
121
|
-
|
|
122
|
-
await db
|
|
123
|
-
.insertInto('dataRefs')
|
|
124
|
-
.values({ tenant, recordId, dataCid, dataSize })
|
|
125
|
-
.execute();
|
|
104
|
+
dataSize = await DataRefs.insertDataRef(db, { tenant, recordId, dataCid }, dataSize);
|
|
126
105
|
return { dataSize };
|
|
127
106
|
}
|
|
128
107
|
async delete(tenant, recordId, dataCid) {
|
|
129
108
|
const db = this.#getDb('delete');
|
|
130
|
-
|
|
131
|
-
await db
|
|
132
|
-
.deleteFrom('dataRefs')
|
|
133
|
-
.where('tenant', '=', tenant)
|
|
134
|
-
.where('recordId', '=', recordId)
|
|
135
|
-
.where('dataCid', '=', dataCid)
|
|
136
|
-
.execute();
|
|
109
|
+
await DataRefs.deleteDataRef(db, { tenant, recordId, dataCid });
|
|
137
110
|
// Garbage-collect blocks if no more refs point to this dataCid.
|
|
138
|
-
|
|
139
|
-
.selectFrom('dataRefs')
|
|
140
|
-
.select('dataCid')
|
|
141
|
-
.where('dataCid', '=', dataCid)
|
|
142
|
-
.executeTakeFirst();
|
|
143
|
-
if (!remaining) {
|
|
111
|
+
if (!await DataRefs.hasAnyDataRef(db, dataCid)) {
|
|
144
112
|
await db
|
|
145
113
|
.deleteFrom('dataBlocks')
|
|
146
114
|
.where('rootDataCid', '=', dataCid)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-store-sql.js","sourceRoot":"","sources":["../../../src/data-store-sql.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAY;IACd,QAAQ,CAAU;IAC3B,GAAG,GAAmC,IAAI,CAAC;IAE3C,YAAY,OAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,yEAAyE;QACzE,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,GAAG,CACd,MAAc,EACd,QAAgB,EAChB,OAAe;QAEf,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9B,
|
|
1
|
+
{"version":3,"file":"data-store-sql.js","sourceRoot":"","sources":["../../../src/data-store-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import * as cbor from '@ipld/dag-cbor';
|
|
|
3
3
|
import { executeWithTransaction } from './utils/transaction.js';
|
|
4
4
|
import { extractTagsAndSanitizeIndexes } from './utils/sanitize.js';
|
|
5
5
|
import { filterSelectQuery } from './utils/filter.js';
|
|
6
|
+
import { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
6
7
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
7
8
|
import { TagTables } from './utils/tags.js';
|
|
8
9
|
import { DwnInterfaceName, DwnMethodName, executeUnlessAborted, SortDirection } from '@enbox/dwn-sdk-js';
|
|
@@ -263,48 +264,5 @@ export class MessageStoreSql {
|
|
|
263
264
|
}
|
|
264
265
|
}
|
|
265
266
|
}
|
|
266
|
-
|
|
267
|
-
* Detect whether an error is a unique constraint violation from any
|
|
268
|
-
* supported database dialect.
|
|
269
|
-
*
|
|
270
|
-
* Each dialect surfaces the error differently:
|
|
271
|
-
*
|
|
272
|
-
* | Dialect | Error code / errno | Message pattern |
|
|
273
|
-
* |------------|-------------------------------|----------------------------------------------------|
|
|
274
|
-
* | PostgreSQL | `code === '23505'` | "duplicate key value violates unique constraint" |
|
|
275
|
-
* | MySQL | `errno === 1062` | "Duplicate entry '...' for key '...'" |
|
|
276
|
-
* | SQLite | `code === 'SQLITE_CONSTRAINT'`| "UNIQUE constraint failed: ..." |
|
|
277
|
-
* | bun:sqlite | `code === 'SQLITE_CONSTRAINT_PRIMARYKEY'` or includes "UNIQUE" | same as above |
|
|
278
|
-
*
|
|
279
|
-
* @internal Exported for testing.
|
|
280
|
-
*/
|
|
281
|
-
export function isDuplicateKeyError(error) {
|
|
282
|
-
if (error == null || typeof error !== 'object') {
|
|
283
|
-
return false;
|
|
284
|
-
}
|
|
285
|
-
const err = error;
|
|
286
|
-
const code = err.code;
|
|
287
|
-
const errno = err.errno;
|
|
288
|
-
const message = typeof err.message === 'string' ? err.message : '';
|
|
289
|
-
// PostgreSQL: error code 23505 = unique_violation
|
|
290
|
-
if (code === '23505') {
|
|
291
|
-
return true;
|
|
292
|
-
}
|
|
293
|
-
// MySQL: errno 1062 = ER_DUP_ENTRY
|
|
294
|
-
if (errno === 1062) {
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
297
|
-
// SQLite (better-sqlite3 / bun:sqlite): SQLITE_CONSTRAINT with UNIQUE
|
|
298
|
-
if (typeof code === 'string' &&
|
|
299
|
-
code.startsWith('SQLITE_CONSTRAINT') &&
|
|
300
|
-
message.includes('UNIQUE')) {
|
|
301
|
-
return true;
|
|
302
|
-
}
|
|
303
|
-
// Fallback: message-based detection for unknown drivers
|
|
304
|
-
if ((message.includes('duplicate key') || message.includes('Duplicate entry')) &&
|
|
305
|
-
(message.includes('messageCid') || message.includes('unique constraint'))) {
|
|
306
|
-
return true;
|
|
307
|
-
}
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
267
|
+
export { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
310
268
|
//# sourceMappingURL=message-store-sql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-store-sql.js","sourceRoot":"","sources":["../../../src/message-store-sql.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"message-store-sql.js","sourceRoot":"","sources":["../../../src/message-store-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isDuplicateKeyError } from './duplicate-key-error.js';
|
|
2
|
+
export async function getDataRefSize(db, { tenant, recordId, dataCid }) {
|
|
3
|
+
const ref = await db
|
|
4
|
+
.selectFrom('dataRefs')
|
|
5
|
+
.select('dataSize')
|
|
6
|
+
.where('tenant', '=', tenant)
|
|
7
|
+
.where('recordId', '=', recordId)
|
|
8
|
+
.where('dataCid', '=', dataCid)
|
|
9
|
+
.executeTakeFirst();
|
|
10
|
+
return ref === undefined ? undefined : Number(ref.dataSize);
|
|
11
|
+
}
|
|
12
|
+
export async function getAnyDataRefSize(db, dataCid) {
|
|
13
|
+
const ref = await db
|
|
14
|
+
.selectFrom('dataRefs')
|
|
15
|
+
.select('dataSize')
|
|
16
|
+
.where('dataCid', '=', dataCid)
|
|
17
|
+
.executeTakeFirst();
|
|
18
|
+
return ref === undefined ? undefined : Number(ref.dataSize);
|
|
19
|
+
}
|
|
20
|
+
export async function insertDataRef(db, key, dataSize) {
|
|
21
|
+
try {
|
|
22
|
+
await db
|
|
23
|
+
.insertInto('dataRefs')
|
|
24
|
+
.values({ ...key, dataSize })
|
|
25
|
+
.execute();
|
|
26
|
+
return dataSize;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (!isDuplicateKeyError(error)) {
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
const racedDataSize = await getDataRefSize(db, key);
|
|
33
|
+
if (racedDataSize === undefined) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
return racedDataSize;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function deleteDataRef(db, { tenant, recordId, dataCid }) {
|
|
40
|
+
await db
|
|
41
|
+
.deleteFrom('dataRefs')
|
|
42
|
+
.where('tenant', '=', tenant)
|
|
43
|
+
.where('recordId', '=', recordId)
|
|
44
|
+
.where('dataCid', '=', dataCid)
|
|
45
|
+
.execute();
|
|
46
|
+
}
|
|
47
|
+
export async function hasAnyDataRef(db, dataCid) {
|
|
48
|
+
const ref = await db
|
|
49
|
+
.selectFrom('dataRefs')
|
|
50
|
+
.select('dataCid')
|
|
51
|
+
.where('dataCid', '=', dataCid)
|
|
52
|
+
.executeTakeFirst();
|
|
53
|
+
return ref !== undefined;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-refs.js","sourceRoot":"","sources":["../../../../src/utils/data-refs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAA2B,EAC3B,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAc;IAEzC,MAAM,GAAG,GAAG,MAAM,EAAE;SACjB,UAAU,CAAC,UAAU,CAAC;SACtB,MAAM,CAAC,UAAU,CAAC;SAClB,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC;SAC5B,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC;SAChC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC;SAC9B,gBAAgB,EAAE,CAAC;IAEtB,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAA2B,EAC3B,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,EAAE;SACjB,UAAU,CAAC,UAAU,CAAC;SACtB,MAAM,CAAC,UAAU,CAAC;SAClB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC;SAC9B,gBAAgB,EAAE,CAAC;IAEtB,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAA2B,EAC3B,GAAe,EACf,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,EAAE;aACL,UAAU,CAAC,UAAU,CAAC;aACtB,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;aAC5B,OAAO,EAAE,CAAC;QAEb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAA2B,EAC3B,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAc;IAEzC,MAAM,EAAE;SACL,UAAU,CAAC,UAAU,CAAC;SACtB,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC;SAC5B,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC;SAChC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC;SAC9B,OAAO,EAAE,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAA2B,EAC3B,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,EAAE;SACjB,UAAU,CAAC,UAAU,CAAC;SACtB,MAAM,CAAC,SAAS,CAAC;SACjB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC;SAC9B,gBAAgB,EAAE,CAAC;IAEtB,OAAO,GAAG,KAAK,SAAS,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect whether an error is a unique constraint violation from any
|
|
3
|
+
* supported database dialect.
|
|
4
|
+
*/
|
|
5
|
+
export function isDuplicateKeyError(error) {
|
|
6
|
+
if (error == null || typeof error !== 'object') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const err = error;
|
|
10
|
+
const code = err.code;
|
|
11
|
+
const errno = err.errno;
|
|
12
|
+
const message = typeof err.message === 'string' ? err.message : '';
|
|
13
|
+
if (code === '23505') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (errno === 1062) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (typeof code === 'string' &&
|
|
20
|
+
code.startsWith('SQLITE_CONSTRAINT') &&
|
|
21
|
+
message.includes('UNIQUE')) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if ((message.includes('duplicate key') || message.includes('Duplicate entry')) &&
|
|
25
|
+
(message.includes('messageCid') ||
|
|
26
|
+
message.includes('dataRefs') ||
|
|
27
|
+
message.includes('dataBlocks') ||
|
|
28
|
+
message.includes('unique constraint'))) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=duplicate-key-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-key-error.js","sourceRoot":"","sources":["../../../../src/utils/duplicate-key-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;QACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC1E,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockstore-sql.d.ts","sourceRoot":"","sources":["../../../src/blockstore-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"blockstore-sql.d.ts","sourceRoot":"","sources":["../../../src/blockstore-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC;;;;;;;;;;GAUG;AACH,qBAAa,aAAc,YAAW,UAAU;;gBAIlC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,MAAM;IAK/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAuBrE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAe3D,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxD,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC;IAOhF,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC;IAShF,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC;IAepD,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC;IAOjG;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-store-s3.d.ts","sourceRoot":"","sources":["../../../src/data-store-s3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-store-s3.d.ts","sourceRoot":"","sources":["../../../src/data-store-s3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAM3F,OAAO,EAML,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,YAAW,SAAS;;gBAQ/B,MAAM,EAAE,iBAAiB;IAcxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,GAAG,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAyB7B,GAAG,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,GACrC,OAAO,CAAC,kBAAkB,CAAC;IA2BjB,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAcH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA+GpC;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IAEjB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IAEf,kGAAkG;IAClG,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,8FAA8F;IAC9F,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,2GAA2G;IAC3G,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAE/D,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-store-sql.d.ts","sourceRoot":"","sources":["../../../src/data-store-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-store-sql.d.ts","sourceRoot":"","sources":["../../../src/data-store-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU3F;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,YAAW,SAAS;;gBAIhC,OAAO,EAAE,OAAO;IAIf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,GAAG,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IA+B7B,GAAG,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAoDjB,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAcH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqDpC"}
|
|
@@ -36,20 +36,5 @@ export declare class MessageStoreSql implements MessageStore {
|
|
|
36
36
|
*/
|
|
37
37
|
private extractSortProperties;
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
* Detect whether an error is a unique constraint violation from any
|
|
41
|
-
* supported database dialect.
|
|
42
|
-
*
|
|
43
|
-
* Each dialect surfaces the error differently:
|
|
44
|
-
*
|
|
45
|
-
* | Dialect | Error code / errno | Message pattern |
|
|
46
|
-
* |------------|-------------------------------|----------------------------------------------------|
|
|
47
|
-
* | PostgreSQL | `code === '23505'` | "duplicate key value violates unique constraint" |
|
|
48
|
-
* | MySQL | `errno === 1062` | "Duplicate entry '...' for key '...'" |
|
|
49
|
-
* | SQLite | `code === 'SQLITE_CONSTRAINT'`| "UNIQUE constraint failed: ..." |
|
|
50
|
-
* | bun:sqlite | `code === 'SQLITE_CONSTRAINT_PRIMARYKEY'` or includes "UNIQUE" | same as above |
|
|
51
|
-
*
|
|
52
|
-
* @internal Exported for testing.
|
|
53
|
-
*/
|
|
54
|
-
export declare function isDuplicateKeyError(error: unknown): boolean;
|
|
39
|
+
export { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
55
40
|
//# sourceMappingURL=message-store-sql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-store-sql.d.ts","sourceRoot":"","sources":["../../../src/message-store-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"message-store-sql.d.ts","sourceRoot":"","sources":["../../../src/message-store-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAmB9C,qBAAa,eAAgB,YAAW,YAAY;;gBAKtC,OAAO,EAAE,OAAO;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,GAAG,CACP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAqDhB;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAoC9B,GAAG,CACP,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IA0BhC,KAAK,CACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,UAAU,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAAC,CAAC;IA6D9D,KAAK,CACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,CAAC,EAAE,WAAW,EACzB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAsBZ,MAAM,CACV,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAmBV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAYd,mBAAmB;IAuBjC;;;;;;;;;OASG;YACW,wBAAwB;IAsBtC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DwnDatabaseType } from '../types.js';
|
|
2
|
+
import type { Kysely } from 'kysely';
|
|
3
|
+
export type DataRefKey = {
|
|
4
|
+
tenant: string;
|
|
5
|
+
recordId: string;
|
|
6
|
+
dataCid: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function getDataRefSize(db: Kysely<DwnDatabaseType>, { tenant, recordId, dataCid }: DataRefKey): Promise<number | undefined>;
|
|
9
|
+
export declare function getAnyDataRefSize(db: Kysely<DwnDatabaseType>, dataCid: string): Promise<number | undefined>;
|
|
10
|
+
export declare function insertDataRef(db: Kysely<DwnDatabaseType>, key: DataRefKey, dataSize: number): Promise<number>;
|
|
11
|
+
export declare function deleteDataRef(db: Kysely<DwnDatabaseType>, { tenant, recordId, dataCid }: DataRefKey): Promise<void>;
|
|
12
|
+
export declare function hasAnyDataRef(db: Kysely<DwnDatabaseType>, dataCid: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=data-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-refs.d.ts","sourceRoot":"","sources":["../../../../src/utils/data-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAC3B,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,GACxC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7B;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAC3B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAC3B,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,GACxC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAQlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-key-error.d.ts","sourceRoot":"","sources":["../../../../src/utils/duplicate-key-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqC3D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enbox/dwn-sql-store",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.22",
|
|
4
4
|
"description": "SQL backed implementations of DWN MessageStore, DataStore, and StateIndex",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@aws-sdk/client-s3": "3.700.0",
|
|
27
27
|
"@aws-sdk/lib-storage": "3.700.0",
|
|
28
|
-
"@enbox/dwn-sdk-js": "0.3.
|
|
28
|
+
"@enbox/dwn-sdk-js": "0.3.7",
|
|
29
29
|
"@ipld/dag-cbor": "9.0.5",
|
|
30
30
|
"interface-blockstore": "5.2.3",
|
|
31
31
|
"interface-store": "5.1.2",
|
package/src/blockstore-sql.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { AbortOptions, AwaitIterable } from 'interface-store';
|
|
|
4
4
|
import type { Blockstore, Pair } from 'interface-blockstore';
|
|
5
5
|
|
|
6
6
|
import { CID } from 'multiformats';
|
|
7
|
+
import { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* SQL-backed implementation of the `Blockstore` v5 interface, scoped to a
|
|
@@ -36,14 +37,22 @@ export class BlockstoreSql implements Blockstore {
|
|
|
36
37
|
public async put(key: CID, val: Uint8Array, _options?: AbortOptions): Promise<CID> {
|
|
37
38
|
const blockCid = key.toString();
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
try {
|
|
41
|
+
await this.#db
|
|
42
|
+
.insertInto('dataBlocks')
|
|
43
|
+
.values({
|
|
44
|
+
rootDataCid : this.#rootDataCid,
|
|
45
|
+
blockCid,
|
|
46
|
+
data : Buffer.from(val),
|
|
47
|
+
})
|
|
48
|
+
.execute();
|
|
49
|
+
} catch (error: unknown) {
|
|
50
|
+
if (!isDuplicateKeyError(error)) {
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
// Idempotent block put: overlapping writes of the same dataCid can
|
|
54
|
+
// import the same content-addressed block concurrently.
|
|
55
|
+
}
|
|
47
56
|
|
|
48
57
|
return key;
|
|
49
58
|
}
|
package/src/data-store-s3.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Dialect } from './dialect/dialect.js';
|
|
|
2
2
|
import type { DwnDatabaseType } from './types.js';
|
|
3
3
|
import type { DataStore, DataStoreGetResult, DataStorePutResult } from '@enbox/dwn-sdk-js';
|
|
4
4
|
|
|
5
|
+
import * as DataRefs from './utils/data-refs.js';
|
|
5
6
|
import { DataStream } from '@enbox/dwn-sdk-js';
|
|
6
7
|
import { Readable } from 'stream';
|
|
7
8
|
import { Upload } from '@aws-sdk/lib-storage';
|
|
@@ -73,15 +74,8 @@ export class DataStoreS3 implements DataStore {
|
|
|
73
74
|
): Promise<DataStoreGetResult | undefined> {
|
|
74
75
|
const db = this.#getDb('get');
|
|
75
76
|
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
.select('dataSize')
|
|
79
|
-
.where('tenant', '=', tenant)
|
|
80
|
-
.where('recordId', '=', recordId)
|
|
81
|
-
.where('dataCid', '=', dataCid)
|
|
82
|
-
.executeTakeFirst();
|
|
83
|
-
|
|
84
|
-
if (!ref) {
|
|
77
|
+
const dataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
78
|
+
if (dataSize === undefined) {
|
|
85
79
|
return undefined;
|
|
86
80
|
}
|
|
87
81
|
|
|
@@ -97,7 +91,7 @@ export class DataStoreS3 implements DataStore {
|
|
|
97
91
|
const dataStream = response.Body.transformToWebStream() as ReadableStream<Uint8Array>;
|
|
98
92
|
|
|
99
93
|
return {
|
|
100
|
-
dataSize
|
|
94
|
+
dataSize,
|
|
101
95
|
dataStream,
|
|
102
96
|
};
|
|
103
97
|
}
|
|
@@ -110,44 +104,27 @@ export class DataStoreS3 implements DataStore {
|
|
|
110
104
|
): Promise<DataStorePutResult> {
|
|
111
105
|
const db = this.#getDb('put');
|
|
112
106
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
.selectFrom('dataRefs')
|
|
116
|
-
.select('dataSize')
|
|
117
|
-
.where('tenant', '=', tenant)
|
|
118
|
-
.where('recordId', '=', recordId)
|
|
119
|
-
.where('dataCid', '=', dataCid)
|
|
120
|
-
.executeTakeFirst();
|
|
121
|
-
|
|
122
|
-
if (existingRef) {
|
|
107
|
+
const existingDataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
108
|
+
if (existingDataSize !== undefined) {
|
|
123
109
|
await DataStream.toBytes(dataStream);
|
|
124
|
-
return { dataSize:
|
|
110
|
+
return { dataSize: existingDataSize };
|
|
125
111
|
}
|
|
126
112
|
|
|
127
113
|
// Check if another ref for this dataCid already exists (dedup path).
|
|
128
|
-
const
|
|
129
|
-
.selectFrom('dataRefs')
|
|
130
|
-
.select('dataSize')
|
|
131
|
-
.where('dataCid', '=', dataCid)
|
|
132
|
-
.executeTakeFirst();
|
|
114
|
+
const otherDataSize = await DataRefs.getAnyDataRefSize(db, dataCid);
|
|
133
115
|
|
|
134
116
|
let dataSize: number;
|
|
135
117
|
|
|
136
|
-
if (
|
|
137
|
-
// S3 object already exists — skip upload.
|
|
138
|
-
await DataStream.toBytes(dataStream);
|
|
139
|
-
dataSize = Number(otherRef.dataSize);
|
|
140
|
-
} else {
|
|
118
|
+
if (otherDataSize === undefined) {
|
|
141
119
|
// New data — upload to S3 with a counting passthrough.
|
|
142
120
|
dataSize = await this.#uploadToS3(dataCid, dataStream);
|
|
121
|
+
} else {
|
|
122
|
+
// S3 object already exists — skip upload.
|
|
123
|
+
await DataStream.toBytes(dataStream);
|
|
124
|
+
dataSize = otherDataSize;
|
|
143
125
|
}
|
|
144
126
|
|
|
145
|
-
|
|
146
|
-
await db
|
|
147
|
-
.insertInto('dataRefs')
|
|
148
|
-
.values({ tenant, recordId, dataCid, dataSize })
|
|
149
|
-
.execute();
|
|
150
|
-
|
|
127
|
+
dataSize = await DataRefs.insertDataRef(db, { tenant, recordId, dataCid }, dataSize);
|
|
151
128
|
return { dataSize };
|
|
152
129
|
}
|
|
153
130
|
|
|
@@ -158,22 +135,10 @@ export class DataStoreS3 implements DataStore {
|
|
|
158
135
|
): Promise<void> {
|
|
159
136
|
const db = this.#getDb('delete');
|
|
160
137
|
|
|
161
|
-
|
|
162
|
-
await db
|
|
163
|
-
.deleteFrom('dataRefs')
|
|
164
|
-
.where('tenant', '=', tenant)
|
|
165
|
-
.where('recordId', '=', recordId)
|
|
166
|
-
.where('dataCid', '=', dataCid)
|
|
167
|
-
.execute();
|
|
138
|
+
await DataRefs.deleteDataRef(db, { tenant, recordId, dataCid });
|
|
168
139
|
|
|
169
140
|
// Garbage-collect the S3 object if no more refs point to this dataCid.
|
|
170
|
-
|
|
171
|
-
.selectFrom('dataRefs')
|
|
172
|
-
.select('dataCid')
|
|
173
|
-
.where('dataCid', '=', dataCid)
|
|
174
|
-
.executeTakeFirst();
|
|
175
|
-
|
|
176
|
-
if (!remaining) {
|
|
141
|
+
if (!await DataRefs.hasAnyDataRef(db, dataCid)) {
|
|
177
142
|
await this.#s3.send(new DeleteObjectCommand({
|
|
178
143
|
Bucket : this.#bucket,
|
|
179
144
|
Key : dataCid,
|
package/src/data-store-sql.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { DwnDatabaseType } from './types.js';
|
|
|
3
3
|
import type { ImportResult } from 'ipfs-unixfs-importer';
|
|
4
4
|
import type { DataStore, DataStoreGetResult, DataStorePutResult } from '@enbox/dwn-sdk-js';
|
|
5
5
|
|
|
6
|
+
import * as DataRefs from './utils/data-refs.js';
|
|
6
7
|
import { BlockstoreSql } from './blockstore-sql.js';
|
|
7
8
|
import { CID } from 'multiformats';
|
|
8
9
|
import { DataStream } from '@enbox/dwn-sdk-js';
|
|
@@ -53,16 +54,8 @@ export class DataStoreSql implements DataStore {
|
|
|
53
54
|
): Promise<DataStoreGetResult | undefined> {
|
|
54
55
|
const db = this.#getDb('get');
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
.selectFrom('dataRefs')
|
|
59
|
-
.select('dataSize')
|
|
60
|
-
.where('tenant', '=', tenant)
|
|
61
|
-
.where('recordId', '=', recordId)
|
|
62
|
-
.where('dataCid', '=', dataCid)
|
|
63
|
-
.executeTakeFirst();
|
|
64
|
-
|
|
65
|
-
if (!ref) {
|
|
57
|
+
const dataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
58
|
+
if (dataSize === undefined) {
|
|
66
59
|
return undefined;
|
|
67
60
|
}
|
|
68
61
|
|
|
@@ -84,7 +77,7 @@ export class DataStoreSql implements DataStore {
|
|
|
84
77
|
});
|
|
85
78
|
|
|
86
79
|
return {
|
|
87
|
-
dataSize
|
|
80
|
+
dataSize,
|
|
88
81
|
dataStream,
|
|
89
82
|
};
|
|
90
83
|
}
|
|
@@ -97,19 +90,11 @@ export class DataStoreSql implements DataStore {
|
|
|
97
90
|
): Promise<DataStorePutResult> {
|
|
98
91
|
const db = this.#getDb('put');
|
|
99
92
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
.selectFrom('dataRefs')
|
|
103
|
-
.select('dataSize')
|
|
104
|
-
.where('tenant', '=', tenant)
|
|
105
|
-
.where('recordId', '=', recordId)
|
|
106
|
-
.where('dataCid', '=', dataCid)
|
|
107
|
-
.executeTakeFirst();
|
|
108
|
-
|
|
109
|
-
if (existingRef) {
|
|
93
|
+
const existingDataSize = await DataRefs.getDataRefSize(db, { tenant, recordId, dataCid });
|
|
94
|
+
if (existingDataSize !== undefined) {
|
|
110
95
|
// Drain the stream — caller expects it to be consumed.
|
|
111
96
|
await DataStream.toBytes(dataStream);
|
|
112
|
-
return { dataSize:
|
|
97
|
+
return { dataSize: existingDataSize };
|
|
113
98
|
}
|
|
114
99
|
|
|
115
100
|
// Check if blocks for this dataCid already exist (dedup path).
|
|
@@ -122,20 +107,15 @@ export class DataStoreSql implements DataStore {
|
|
|
122
107
|
if (blocksExist) {
|
|
123
108
|
// Blocks already stored by a previous ref with the same dataCid.
|
|
124
109
|
// Get the data size from that existing ref.
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
.select('dataSize')
|
|
128
|
-
.where('dataCid', '=', dataCid)
|
|
129
|
-
.executeTakeFirst();
|
|
130
|
-
|
|
131
|
-
if (otherRef) {
|
|
132
|
-
dataSize = Number(otherRef.dataSize);
|
|
133
|
-
// Drain the stream — caller expects it to be consumed.
|
|
134
|
-
await DataStream.toBytes(dataStream);
|
|
135
|
-
} else {
|
|
110
|
+
const otherDataSize = await DataRefs.getAnyDataRefSize(db, dataCid);
|
|
111
|
+
if (otherDataSize === undefined) {
|
|
136
112
|
// Edge case: blocks exist but no ref (interrupted previous put).
|
|
137
113
|
// Count bytes without full buffering.
|
|
138
114
|
dataSize = await DataStoreSql.#countStreamBytes(dataStream);
|
|
115
|
+
} else {
|
|
116
|
+
dataSize = otherDataSize;
|
|
117
|
+
// Drain the stream — caller expects it to be consumed.
|
|
118
|
+
await DataStream.toBytes(dataStream);
|
|
139
119
|
}
|
|
140
120
|
} else {
|
|
141
121
|
// New data — clean up any partial blocks from interrupted imports,
|
|
@@ -155,12 +135,7 @@ export class DataStoreSql implements DataStore {
|
|
|
155
135
|
dataSize = Number(dataDagRoot.unixfs?.fileSize() ?? dataDagRoot.size);
|
|
156
136
|
}
|
|
157
137
|
|
|
158
|
-
|
|
159
|
-
await db
|
|
160
|
-
.insertInto('dataRefs')
|
|
161
|
-
.values({ tenant, recordId, dataCid, dataSize })
|
|
162
|
-
.execute();
|
|
163
|
-
|
|
138
|
+
dataSize = await DataRefs.insertDataRef(db, { tenant, recordId, dataCid }, dataSize);
|
|
164
139
|
return { dataSize };
|
|
165
140
|
}
|
|
166
141
|
|
|
@@ -171,22 +146,10 @@ export class DataStoreSql implements DataStore {
|
|
|
171
146
|
): Promise<void> {
|
|
172
147
|
const db = this.#getDb('delete');
|
|
173
148
|
|
|
174
|
-
|
|
175
|
-
await db
|
|
176
|
-
.deleteFrom('dataRefs')
|
|
177
|
-
.where('tenant', '=', tenant)
|
|
178
|
-
.where('recordId', '=', recordId)
|
|
179
|
-
.where('dataCid', '=', dataCid)
|
|
180
|
-
.execute();
|
|
149
|
+
await DataRefs.deleteDataRef(db, { tenant, recordId, dataCid });
|
|
181
150
|
|
|
182
151
|
// Garbage-collect blocks if no more refs point to this dataCid.
|
|
183
|
-
|
|
184
|
-
.selectFrom('dataRefs')
|
|
185
|
-
.select('dataCid')
|
|
186
|
-
.where('dataCid', '=', dataCid)
|
|
187
|
-
.executeTakeFirst();
|
|
188
|
-
|
|
189
|
-
if (!remaining) {
|
|
152
|
+
if (!await DataRefs.hasAnyDataRef(db, dataCid)) {
|
|
190
153
|
await db
|
|
191
154
|
.deleteFrom('dataBlocks')
|
|
192
155
|
.where('rootDataCid', '=', dataCid)
|
package/src/message-store-sql.ts
CHANGED
|
@@ -15,6 +15,7 @@ import * as cbor from '@ipld/dag-cbor';
|
|
|
15
15
|
import { executeWithTransaction } from './utils/transaction.js';
|
|
16
16
|
import { extractTagsAndSanitizeIndexes } from './utils/sanitize.js';
|
|
17
17
|
import { filterSelectQuery } from './utils/filter.js';
|
|
18
|
+
import { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
18
19
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
19
20
|
import { TagTables } from './utils/tags.js';
|
|
20
21
|
import {
|
|
@@ -398,57 +399,4 @@ export class MessageStoreSql implements MessageStore {
|
|
|
398
399
|
}
|
|
399
400
|
}
|
|
400
401
|
|
|
401
|
-
|
|
402
|
-
* Detect whether an error is a unique constraint violation from any
|
|
403
|
-
* supported database dialect.
|
|
404
|
-
*
|
|
405
|
-
* Each dialect surfaces the error differently:
|
|
406
|
-
*
|
|
407
|
-
* | Dialect | Error code / errno | Message pattern |
|
|
408
|
-
* |------------|-------------------------------|----------------------------------------------------|
|
|
409
|
-
* | PostgreSQL | `code === '23505'` | "duplicate key value violates unique constraint" |
|
|
410
|
-
* | MySQL | `errno === 1062` | "Duplicate entry '...' for key '...'" |
|
|
411
|
-
* | SQLite | `code === 'SQLITE_CONSTRAINT'`| "UNIQUE constraint failed: ..." |
|
|
412
|
-
* | bun:sqlite | `code === 'SQLITE_CONSTRAINT_PRIMARYKEY'` or includes "UNIQUE" | same as above |
|
|
413
|
-
*
|
|
414
|
-
* @internal Exported for testing.
|
|
415
|
-
*/
|
|
416
|
-
export function isDuplicateKeyError(error: unknown): boolean {
|
|
417
|
-
if (error == null || typeof error !== 'object') {
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const err = error as Record<string, unknown>;
|
|
422
|
-
const code = err.code;
|
|
423
|
-
const errno = err.errno;
|
|
424
|
-
const message = typeof err.message === 'string' ? err.message : '';
|
|
425
|
-
|
|
426
|
-
// PostgreSQL: error code 23505 = unique_violation
|
|
427
|
-
if (code === '23505') {
|
|
428
|
-
return true;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// MySQL: errno 1062 = ER_DUP_ENTRY
|
|
432
|
-
if (errno === 1062) {
|
|
433
|
-
return true;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// SQLite (better-sqlite3 / bun:sqlite): SQLITE_CONSTRAINT with UNIQUE
|
|
437
|
-
if (
|
|
438
|
-
typeof code === 'string' &&
|
|
439
|
-
code.startsWith('SQLITE_CONSTRAINT') &&
|
|
440
|
-
message.includes('UNIQUE')
|
|
441
|
-
) {
|
|
442
|
-
return true;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
// Fallback: message-based detection for unknown drivers
|
|
446
|
-
if (
|
|
447
|
-
(message.includes('duplicate key') || message.includes('Duplicate entry')) &&
|
|
448
|
-
(message.includes('messageCid') || message.includes('unique constraint'))
|
|
449
|
-
) {
|
|
450
|
-
return true;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
return false;
|
|
454
|
-
}
|
|
402
|
+
export { isDuplicateKeyError } from './utils/duplicate-key-error.js';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { DwnDatabaseType } from '../types.js';
|
|
2
|
+
import type { Kysely } from 'kysely';
|
|
3
|
+
|
|
4
|
+
import { isDuplicateKeyError } from './duplicate-key-error.js';
|
|
5
|
+
|
|
6
|
+
export type DataRefKey = {
|
|
7
|
+
tenant: string;
|
|
8
|
+
recordId: string;
|
|
9
|
+
dataCid: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export async function getDataRefSize(
|
|
13
|
+
db: Kysely<DwnDatabaseType>,
|
|
14
|
+
{ tenant, recordId, dataCid }: DataRefKey,
|
|
15
|
+
): Promise<number | undefined> {
|
|
16
|
+
const ref = await db
|
|
17
|
+
.selectFrom('dataRefs')
|
|
18
|
+
.select('dataSize')
|
|
19
|
+
.where('tenant', '=', tenant)
|
|
20
|
+
.where('recordId', '=', recordId)
|
|
21
|
+
.where('dataCid', '=', dataCid)
|
|
22
|
+
.executeTakeFirst();
|
|
23
|
+
|
|
24
|
+
return ref === undefined ? undefined : Number(ref.dataSize);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function getAnyDataRefSize(
|
|
28
|
+
db: Kysely<DwnDatabaseType>,
|
|
29
|
+
dataCid: string,
|
|
30
|
+
): Promise<number | undefined> {
|
|
31
|
+
const ref = await db
|
|
32
|
+
.selectFrom('dataRefs')
|
|
33
|
+
.select('dataSize')
|
|
34
|
+
.where('dataCid', '=', dataCid)
|
|
35
|
+
.executeTakeFirst();
|
|
36
|
+
|
|
37
|
+
return ref === undefined ? undefined : Number(ref.dataSize);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function insertDataRef(
|
|
41
|
+
db: Kysely<DwnDatabaseType>,
|
|
42
|
+
key: DataRefKey,
|
|
43
|
+
dataSize: number,
|
|
44
|
+
): Promise<number> {
|
|
45
|
+
try {
|
|
46
|
+
await db
|
|
47
|
+
.insertInto('dataRefs')
|
|
48
|
+
.values({ ...key, dataSize })
|
|
49
|
+
.execute();
|
|
50
|
+
|
|
51
|
+
return dataSize;
|
|
52
|
+
} catch (error: unknown) {
|
|
53
|
+
if (!isDuplicateKeyError(error)) {
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const racedDataSize = await getDataRefSize(db, key);
|
|
58
|
+
if (racedDataSize === undefined) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return racedDataSize;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function deleteDataRef(
|
|
67
|
+
db: Kysely<DwnDatabaseType>,
|
|
68
|
+
{ tenant, recordId, dataCid }: DataRefKey,
|
|
69
|
+
): Promise<void> {
|
|
70
|
+
await db
|
|
71
|
+
.deleteFrom('dataRefs')
|
|
72
|
+
.where('tenant', '=', tenant)
|
|
73
|
+
.where('recordId', '=', recordId)
|
|
74
|
+
.where('dataCid', '=', dataCid)
|
|
75
|
+
.execute();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function hasAnyDataRef(
|
|
79
|
+
db: Kysely<DwnDatabaseType>,
|
|
80
|
+
dataCid: string,
|
|
81
|
+
): Promise<boolean> {
|
|
82
|
+
const ref = await db
|
|
83
|
+
.selectFrom('dataRefs')
|
|
84
|
+
.select('dataCid')
|
|
85
|
+
.where('dataCid', '=', dataCid)
|
|
86
|
+
.executeTakeFirst();
|
|
87
|
+
|
|
88
|
+
return ref !== undefined;
|
|
89
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect whether an error is a unique constraint violation from any
|
|
3
|
+
* supported database dialect.
|
|
4
|
+
*/
|
|
5
|
+
export function isDuplicateKeyError(error: unknown): boolean {
|
|
6
|
+
if (error == null || typeof error !== 'object') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const err = error as Record<string, unknown>;
|
|
11
|
+
const code = err.code;
|
|
12
|
+
const errno = err.errno;
|
|
13
|
+
const message = typeof err.message === 'string' ? err.message : '';
|
|
14
|
+
|
|
15
|
+
if (code === '23505') {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (errno === 1062) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (
|
|
24
|
+
typeof code === 'string' &&
|
|
25
|
+
code.startsWith('SQLITE_CONSTRAINT') &&
|
|
26
|
+
message.includes('UNIQUE')
|
|
27
|
+
) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (
|
|
32
|
+
(message.includes('duplicate key') || message.includes('Duplicate entry')) &&
|
|
33
|
+
(message.includes('messageCid') ||
|
|
34
|
+
message.includes('dataRefs') ||
|
|
35
|
+
message.includes('dataBlocks') ||
|
|
36
|
+
message.includes('unique constraint'))
|
|
37
|
+
) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return false;
|
|
42
|
+
}
|