1- import Database from "better-sqlite3" ;
1+ import { DatabaseSync } from "node:sqlite" ;
2+ import fs from "node:fs" ;
3+ import path from "node:path" ;
24
3- export const connectImpl = ( path , logger ) => {
4- logger ( "Connecting to database at " + path ) ;
5- let db = new Database ( path , {
6- fileMustExist : false ,
7- // verbose: logger,
5+ export const connectImpl = ( databasePath , logger ) => {
6+ logger ( "Connecting to database at " + databasePath ) ;
7+
8+ // Ensure directory exists
9+ const dir = path . dirname ( databasePath ) ;
10+ fs . mkdirSync ( dir , { recursive : true } ) ;
11+
12+ const db = new DatabaseSync ( databasePath , {
13+ enableForeignKeyConstraints : true ,
814 } ) ;
9- db . pragma ( "journal_mode = WAL" ) ;
10- db . pragma ( "foreign_keys = ON" ) ;
15+
16+ db . exec ( "PRAGMA journal_mode = WAL" ) ;
17+ db . exec ( "PRAGMA foreign_keys = ON" ) ;
1118
1219 db . prepare ( `CREATE TABLE IF NOT EXISTS package_sets
1320 ( version TEXT PRIMARY KEY NOT NULL
@@ -31,21 +38,21 @@ export const connectImpl = (path, logger) => {
3138 , last_fetched TEXT NOT NULL
3239 )` ) . run ( ) ;
3340 // it would be lovely if we'd have a foreign key on package_metadata, but that would
34- // require reading metadatas before manifests, which we can't always guarantee
41+ // require reading metadata before manifests, which we can't always guarantee
3542 db . prepare ( `CREATE TABLE IF NOT EXISTS package_manifests
3643 ( name TEXT NOT NULL
3744 , version TEXT NOT NULL
3845 , manifest TEXT NOT NULL
3946 , PRIMARY KEY (name, version)
4047 )` ) . run ( ) ;
4148 return db ;
42- } ;
49+ }
4350
4451export const insertPackageSetImpl = ( db , packageSet ) => {
4552 db . prepare (
4653 "INSERT INTO package_sets (version, compiler, date) VALUES (@version, @compiler, @date)"
4754 ) . run ( packageSet ) ;
48- } ;
55+ }
4956
5057export const insertPackageSetEntryImpl = ( db , packageSetEntry ) => {
5158 db . prepare (
@@ -55,8 +62,8 @@ export const insertPackageSetEntryImpl = (db, packageSetEntry) => {
5562
5663export const selectLatestPackageSetByCompilerImpl = ( db , compiler ) => {
5764 const row = db
58- . prepare ( "SELECT * FROM package_sets WHERE compiler = ? ORDER BY date DESC LIMIT 1" )
59- . get ( compiler ) ;
65+ . prepare ( "SELECT * FROM package_sets WHERE compiler = @compiler ORDER BY date DESC LIMIT 1" )
66+ . get ( { compiler } ) ;
6067 return row ;
6168}
6269
@@ -69,22 +76,22 @@ export const selectPackageSetsImpl = (db) => {
6976
7077export const selectPackageSetEntriesBySetImpl = ( db , packageSetVersion ) => {
7178 const row = db
72- . prepare ( "SELECT * FROM package_set_entries WHERE packageSetVersion = ? " )
73- . all ( packageSetVersion ) ;
79+ . prepare ( "SELECT * FROM package_set_entries WHERE packageSetVersion = @packageSetVersion " )
80+ . all ( { packageSetVersion } ) ;
7481 return row ;
7582}
7683
7784export const selectPackageSetEntriesByPackageImpl = ( db , packageName , packageVersion ) => {
7885 const row = db
79- . prepare ( "SELECT * FROM package_set_entries WHERE packageName = ? AND packageVersion = ? " )
80- . all ( packageName , packageVersion ) ;
86+ . prepare ( "SELECT * FROM package_set_entries WHERE packageName = @packageName AND packageVersion = @packageVersion " )
87+ . all ( { packageName, packageVersion } ) ;
8188 return row ;
8289}
8390
8491export const getLastPullImpl = ( db , key ) => {
8592 const row = db
86- . prepare ( "SELECT * FROM last_git_pull WHERE key = ? LIMIT 1" )
87- . get ( key ) ;
93+ . prepare ( "SELECT * FROM last_git_pull WHERE key = @key LIMIT 1" )
94+ . get ( { key } ) ;
8895 return row ?. date ;
8996}
9097
@@ -94,8 +101,8 @@ export const updateLastPullImpl = (db, key, date) => {
94101
95102export const getManifestImpl = ( db , name , version ) => {
96103 const row = db
97- . prepare ( "SELECT * FROM package_manifests WHERE name = ? AND version = ? LIMIT 1" )
98- . get ( name , version ) ;
104+ . prepare ( "SELECT * FROM package_manifests WHERE name = @name AND version = @version LIMIT 1" )
105+ . get ( { name, version } ) ;
99106 return row ?. manifest ;
100107}
101108
@@ -104,7 +111,7 @@ export const insertManifestImpl = (db, name, version, manifest) => {
104111}
105112
106113export const removeManifestImpl = ( db , name , version ) => {
107- db . prepare ( "DELETE FROM package_manifests WHERE name = ? AND version = ? " ) . run ( name , version ) ;
114+ db . prepare ( "DELETE FROM package_manifests WHERE name = @name AND version = @version " ) . run ( { name, version } ) ;
108115}
109116
110117export const insertMetadataImpl = ( db , name , metadata , last_fetched ) => {
@@ -113,6 +120,6 @@ export const insertMetadataImpl = (db, name, metadata, last_fetched) => {
113120
114121export const getMetadataForPackagesImpl = ( db , names ) => {
115122 // There can be a lot of package names here, potentially hitting the max number of sqlite parameters, so we use json to bypass this
116- const query = db . prepare ( "SELECT * FROM package_metadata WHERE name IN (SELECT value FROM json_each(? ));" ) ;
117- return query . all ( JSON . stringify ( names ) ) ;
118- } ;
123+ const query = db . prepare ( "SELECT * FROM package_metadata WHERE name IN (SELECT value FROM json_each(@names ));" ) ;
124+ return query . all ( { names : JSON . stringify ( names ) } ) ;
125+ }
0 commit comments