@velarscript-labs/sqlite 0.3.1 → 0.3.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/CHANGELOG.md +5 -0
- package/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/dist/index.veli.json +93 -93
- package/dist/velar-library.json +6 -6
- package/package.json +3 -3
- package/src/index.vel +37 -73
package/dist/velar-library.json
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
"abiVersion": 1,
|
|
5
5
|
"package": {
|
|
6
6
|
"name": "@velarscript-labs/sqlite",
|
|
7
|
-
"version": "0.3.
|
|
7
|
+
"version": "0.3.2"
|
|
8
8
|
},
|
|
9
9
|
"target": "node",
|
|
10
|
-
"compilerVersion": "0.
|
|
10
|
+
"compilerVersion": "0.15.0",
|
|
11
11
|
"sourceEntry": "src/index.vel",
|
|
12
12
|
"sources": [
|
|
13
13
|
{
|
|
14
14
|
"path": "src/index.vel",
|
|
15
|
-
"sha256": "
|
|
15
|
+
"sha256": "d35ec69e071fdeab0e379a78209c7f075cabf1b9b5148c9ba033a325e9c482b6"
|
|
16
16
|
}
|
|
17
17
|
],
|
|
18
18
|
"entry": {
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"sourceMap": "index.js.map",
|
|
21
21
|
"interface": "index.veli.json",
|
|
22
22
|
"sha256": {
|
|
23
|
-
"javascript": "
|
|
24
|
-
"sourceMap": "
|
|
25
|
-
"interface": "
|
|
23
|
+
"javascript": "33086d56ae3878ed41d4c31405ce57e17b8aca65ec3160a9a82ceada7b4b49d7",
|
|
24
|
+
"sourceMap": "d2e01a92404964ef4674985191acf85be17185a1ea75fb2369f5acaf6fb8aecf",
|
|
25
|
+
"interface": "93ed6516f8b9c501b068b4550424e472d536e1e7a9b3451bba536b3c3e736012"
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@velarscript-labs/sqlite",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Injection-resistant bounded SQLite capability for VelarScript Node applications.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"entry": "src/index.vel",
|
|
35
35
|
"artifacts": { "node": "dist/velar-library.json" },
|
|
36
36
|
"targets": ["node"],
|
|
37
|
-
"requires": {"capabilities": ["node"], "language": ">=0.
|
|
37
|
+
"requires": {"capabilities": ["node"], "language": ">=0.15 <0.16"}
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@velarscript-labs/database": "0.3.
|
|
40
|
+
"@velarscript-labs/database": "0.3.2",
|
|
41
41
|
"sqlite3-parser": "0.7.1"
|
|
42
42
|
}
|
|
43
43
|
}
|
package/src/index.vel
CHANGED
|
@@ -19,7 +19,7 @@ export type SqliteOptions:
|
|
|
19
19
|
journalMode: SqliteJournalMode?
|
|
20
20
|
readOnly: bool?
|
|
21
21
|
|
|
22
|
-
extern js
|
|
22
|
+
extern js`
|
|
23
23
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
24
24
|
import { Worker } from "node:worker_threads";
|
|
25
25
|
|
|
@@ -537,32 +537,25 @@ export class SqliteError extends Error:
|
|
|
537
537
|
self.retryable = retryable
|
|
538
538
|
|
|
539
539
|
export class SqliteBackpressureError extends SqliteError:
|
|
540
|
-
constructor(message: string = "SQLite queue is full"):
|
|
541
|
-
super(message, "SQLITE_BACKPRESSURE", "queue", true)
|
|
540
|
+
constructor(message: string = "SQLite queue is full"): super(message, "SQLITE_BACKPRESSURE", "queue", true)
|
|
542
541
|
|
|
543
542
|
export class SqliteConcurrencyError extends SqliteError:
|
|
544
543
|
constructor(message: string = "SQLite connection cannot be used from its transaction callback"):
|
|
545
544
|
super(message, "SQLITE_CONCURRENCY", "transaction", true)
|
|
546
545
|
|
|
547
546
|
def sqliteFailure(error: NativeSqliteError) -> SqliteError:
|
|
548
|
-
if error is NativeSqliteBackpressureError:
|
|
549
|
-
|
|
550
|
-
if error is
|
|
551
|
-
return SqliteConcurrencyError(error.message)
|
|
552
|
-
if error is NativeSqliteError:
|
|
553
|
-
return SqliteError(error.message, error.sqliteCode, error.operation, error.retryable)
|
|
547
|
+
if error is NativeSqliteBackpressureError: return SqliteBackpressureError(error.message)
|
|
548
|
+
if error is NativeSqliteConcurrencyError: return SqliteConcurrencyError(error.message)
|
|
549
|
+
if error is NativeSqliteError: return SqliteError(error.message, error.sqliteCode, error.operation, error.retryable)
|
|
554
550
|
return SqliteError(error.message)
|
|
555
551
|
|
|
556
552
|
/// Produces a SQLite literal only for grammar positions where bound parameters
|
|
557
553
|
/// are not legal, such as schema defaults and PRAGMA assignments. Ordinary
|
|
558
554
|
/// query values must still use sqlParameter/sqlTuple/sqlRows.
|
|
559
555
|
export def sqliteLiteral(value: unknown) -> DatabaseStatement:
|
|
560
|
-
if value == null:
|
|
561
|
-
|
|
562
|
-
if value is
|
|
563
|
-
return trustedSql(value ? "1" : "0")
|
|
564
|
-
if value is string:
|
|
565
|
-
return trustedSql("'" + value.replaceAll("'", "''") + "'")
|
|
556
|
+
if value == null: return trustedSql("NULL")
|
|
557
|
+
if value is bool: return trustedSql(value ? "1" : "0")
|
|
558
|
+
if value is string: return trustedSql("'" + value.replaceAll("'", "''") + "'")
|
|
566
559
|
if value is number:
|
|
567
560
|
assert value.isFinite() else "SQLite numeric literals must be finite"
|
|
568
561
|
assert not value.isInteger() or (value >= -9007199254740991 and value <= 9007199254740991) else "SQLite integer literals must be safe integers"
|
|
@@ -576,39 +569,31 @@ export def sqliteIdentifier(value: string) -> DatabaseStatement:
|
|
|
576
569
|
return trustedSql(`"` + value.replaceAll(`"`, `""`) + `"`)
|
|
577
570
|
|
|
578
571
|
export class SqliteTransaction:
|
|
579
|
-
constructor(private const native: NativeSqliteTransaction):
|
|
580
|
-
pass
|
|
572
|
+
constructor(private const native: NativeSqliteTransaction): pass
|
|
581
573
|
|
|
582
574
|
async def execute(statement: DatabaseStatement) -> number:
|
|
583
575
|
const data = statement.data()
|
|
584
|
-
try:
|
|
585
|
-
return await self.native.execute(data.fragments, data.parameters)
|
|
576
|
+
try: return await self.native.execute(data.fragments, data.parameters)
|
|
586
577
|
catch error:
|
|
587
|
-
if error is NativeSqliteError:
|
|
588
|
-
throw sqliteFailure(error)
|
|
578
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
589
579
|
throw SqliteError(error.message)
|
|
590
580
|
|
|
591
581
|
/// Projects this transaction into the engine-neutral functional operation layer.
|
|
592
582
|
def executor() -> DatabaseExecutor:
|
|
593
|
-
async def executeStatement(statement: DatabaseStatement) -> number:
|
|
594
|
-
return await self.execute(statement)
|
|
583
|
+
async def executeStatement(statement: DatabaseStatement) -> number: return await self.execute(statement)
|
|
595
584
|
|
|
596
585
|
async def oneRow(statement: DatabaseStatement) -> unknown:
|
|
597
586
|
const data = statement.data()
|
|
598
|
-
try:
|
|
599
|
-
return await self.native.one(data.fragments, data.parameters)
|
|
587
|
+
try: return await self.native.one(data.fragments, data.parameters)
|
|
600
588
|
catch error:
|
|
601
|
-
if error is NativeSqliteError:
|
|
602
|
-
throw sqliteFailure(error)
|
|
589
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
603
590
|
throw SqliteError(error.message)
|
|
604
591
|
|
|
605
592
|
async def allRows(statement: DatabaseStatement) -> List<unknown>:
|
|
606
593
|
const data = statement.data()
|
|
607
|
-
try:
|
|
608
|
-
return await self.native.all(data.fragments, data.parameters)
|
|
594
|
+
try: return await self.native.all(data.fragments, data.parameters)
|
|
609
595
|
catch error:
|
|
610
|
-
if error is NativeSqliteError:
|
|
611
|
-
throw sqliteFailure(error)
|
|
596
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
612
597
|
throw SqliteError(error.message)
|
|
613
598
|
|
|
614
599
|
return {execute: executeStatement, one: oneRow, all: allRows}
|
|
@@ -617,12 +602,10 @@ export class SqliteTransaction:
|
|
|
617
602
|
const data = statement.data()
|
|
618
603
|
try:
|
|
619
604
|
const row = await self.native.one(data.fragments, data.parameters)
|
|
620
|
-
if row == null:
|
|
621
|
-
return null
|
|
605
|
+
if row == null: return null
|
|
622
606
|
return RowType.parse(row)
|
|
623
607
|
catch error:
|
|
624
|
-
if error is NativeSqliteError:
|
|
625
|
-
throw sqliteFailure(error)
|
|
608
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
626
609
|
throw SqliteError(error.message)
|
|
627
610
|
|
|
628
611
|
async def all<T>(statement: DatabaseStatement, RowType: Type<T>) -> List<T>:
|
|
@@ -631,44 +614,35 @@ export class SqliteTransaction:
|
|
|
631
614
|
const rows = await self.native.all(data.fragments, data.parameters)
|
|
632
615
|
return rows.map(row => RowType.parse(row))
|
|
633
616
|
catch error:
|
|
634
|
-
if error is NativeSqliteError:
|
|
635
|
-
throw sqliteFailure(error)
|
|
617
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
636
618
|
throw SqliteError(error.message)
|
|
637
619
|
|
|
638
620
|
export class SqliteConnection:
|
|
639
|
-
constructor(private const native: NativeSqliteConnection):
|
|
640
|
-
pass
|
|
621
|
+
constructor(private const native: NativeSqliteConnection): pass
|
|
641
622
|
|
|
642
623
|
async def execute(statement: DatabaseStatement) -> number:
|
|
643
624
|
const data = statement.data()
|
|
644
|
-
try:
|
|
645
|
-
return await self.native.execute(data.fragments, data.parameters)
|
|
625
|
+
try: return await self.native.execute(data.fragments, data.parameters)
|
|
646
626
|
catch error:
|
|
647
|
-
if error is NativeSqliteError:
|
|
648
|
-
throw sqliteFailure(error)
|
|
627
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
649
628
|
throw SqliteError(error.message)
|
|
650
629
|
|
|
651
630
|
/// Projects this connection into the engine-neutral functional operation layer.
|
|
652
631
|
def executor() -> DatabaseExecutor:
|
|
653
|
-
async def executeStatement(statement: DatabaseStatement) -> number:
|
|
654
|
-
return await self.execute(statement)
|
|
632
|
+
async def executeStatement(statement: DatabaseStatement) -> number: return await self.execute(statement)
|
|
655
633
|
|
|
656
634
|
async def oneRow(statement: DatabaseStatement) -> unknown:
|
|
657
635
|
const data = statement.data()
|
|
658
|
-
try:
|
|
659
|
-
return await self.native.one(data.fragments, data.parameters)
|
|
636
|
+
try: return await self.native.one(data.fragments, data.parameters)
|
|
660
637
|
catch error:
|
|
661
|
-
if error is NativeSqliteError:
|
|
662
|
-
throw sqliteFailure(error)
|
|
638
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
663
639
|
throw SqliteError(error.message)
|
|
664
640
|
|
|
665
641
|
async def allRows(statement: DatabaseStatement) -> List<unknown>:
|
|
666
642
|
const data = statement.data()
|
|
667
|
-
try:
|
|
668
|
-
return await self.native.all(data.fragments, data.parameters)
|
|
643
|
+
try: return await self.native.all(data.fragments, data.parameters)
|
|
669
644
|
catch error:
|
|
670
|
-
if error is NativeSqliteError:
|
|
671
|
-
throw sqliteFailure(error)
|
|
645
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
672
646
|
throw SqliteError(error.message)
|
|
673
647
|
|
|
674
648
|
return {execute: executeStatement, one: oneRow, all: allRows}
|
|
@@ -677,12 +651,10 @@ export class SqliteConnection:
|
|
|
677
651
|
const data = statement.data()
|
|
678
652
|
try:
|
|
679
653
|
const row = await self.native.one(data.fragments, data.parameters)
|
|
680
|
-
if row == null:
|
|
681
|
-
return null
|
|
654
|
+
if row == null: return null
|
|
682
655
|
return RowType.parse(row)
|
|
683
656
|
catch error:
|
|
684
|
-
if error is NativeSqliteError:
|
|
685
|
-
throw sqliteFailure(error)
|
|
657
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
686
658
|
throw SqliteError(error.message)
|
|
687
659
|
|
|
688
660
|
async def all<T>(statement: DatabaseStatement, RowType: Type<T>) -> List<T>:
|
|
@@ -691,38 +663,30 @@ export class SqliteConnection:
|
|
|
691
663
|
const rows = await self.native.all(data.fragments, data.parameters)
|
|
692
664
|
return rows.map(row => RowType.parse(row))
|
|
693
665
|
catch error:
|
|
694
|
-
if error is NativeSqliteError:
|
|
695
|
-
throw sqliteFailure(error)
|
|
666
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
696
667
|
throw SqliteError(error.message)
|
|
697
668
|
|
|
698
669
|
async def transaction<T>(operation: (SqliteTransaction) -> Promise<T>) -> T:
|
|
699
670
|
const results: List<T> = []
|
|
700
|
-
async def run<T>(native: NativeSqliteTransaction):
|
|
701
|
-
results.append(await operation(SqliteTransaction(native)))
|
|
671
|
+
async def run<T>(native: NativeSqliteTransaction): results.append(await operation(SqliteTransaction(native)))
|
|
702
672
|
try:
|
|
703
673
|
await self.native.transaction(run)
|
|
704
674
|
assert results.size == 1 else "SQLite transaction did not return exactly one result"
|
|
705
675
|
return results[0]
|
|
706
676
|
catch error:
|
|
707
|
-
if error is NativeSqliteError:
|
|
708
|
-
throw sqliteFailure(error)
|
|
677
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
709
678
|
throw error
|
|
710
679
|
|
|
711
680
|
async def close():
|
|
712
|
-
try:
|
|
713
|
-
await self.native.close()
|
|
681
|
+
try: await self.native.close()
|
|
714
682
|
catch error:
|
|
715
|
-
if error is NativeSqliteError:
|
|
716
|
-
throw sqliteFailure(error)
|
|
683
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
717
684
|
throw SqliteError(error.message)
|
|
718
685
|
|
|
719
|
-
@dispose:
|
|
720
|
-
await self.close()
|
|
686
|
+
@dispose: await self.close()
|
|
721
687
|
|
|
722
688
|
export async def openSqlite(path: string, options: SqliteOptions = {}) -> SqliteConnection:
|
|
723
|
-
try:
|
|
724
|
-
return SqliteConnection(await openNativeSqlite(path, options))
|
|
689
|
+
try: return SqliteConnection(await openNativeSqlite(path, options))
|
|
725
690
|
catch error:
|
|
726
|
-
if error is NativeSqliteError:
|
|
727
|
-
throw sqliteFailure(error)
|
|
691
|
+
if error is NativeSqliteError: throw sqliteFailure(error)
|
|
728
692
|
throw SqliteError(error.message)
|