Преглед на файлове

chore: extract SQLite abstraction into separate PR (#refactor/sqlite-abstraction)

Dax Raad преди 1 месец
родител
ревизия
2bfe81ee5c
променени са 4 файла, в които са добавени 24 реда и са изтрити 35 реда
  1. 0 7
      packages/opencode/package.json
  2. 0 8
      packages/opencode/src/storage/db.bun.ts
  3. 0 8
      packages/opencode/src/storage/db.node.ts
  4. 24 12
      packages/opencode/src/storage/db.ts

+ 0 - 7
packages/opencode/package.json

@@ -26,13 +26,6 @@
   "exports": {
     "./*": "./src/*.ts"
   },
-  "imports": {
-    "#db": {
-      "bun": "./src/storage/db.bun.ts",
-      "node": "./src/storage/db.node.ts",
-      "default": "./src/storage/db.bun.ts"
-    }
-  },
   "devDependencies": {
     "@babel/core": "7.28.4",
     "@effect/language-service": "0.79.0",

+ 0 - 8
packages/opencode/src/storage/db.bun.ts

@@ -1,8 +0,0 @@
-import { Database } from "bun:sqlite"
-import { drizzle } from "drizzle-orm/bun-sqlite"
-
-export function init(path: string) {
-  const sqlite = new Database(path, { create: true })
-  const db = drizzle({ client: sqlite })
-  return db
-}

+ 0 - 8
packages/opencode/src/storage/db.node.ts

@@ -1,8 +0,0 @@
-import { DatabaseSync } from "node:sqlite"
-import { drizzle } from "drizzle-orm/node-sqlite"
-
-export function init(path: string) {
-  const sqlite = new DatabaseSync(path)
-  const db = drizzle({ client: sqlite })
-  return db
-}

+ 24 - 12
packages/opencode/src/storage/db.ts

@@ -1,4 +1,5 @@
-import { type SQLiteBunDatabase } from "drizzle-orm/bun-sqlite"
+import { Database as BunDatabase } from "bun:sqlite"
+import { drizzle, type SQLiteBunDatabase } from "drizzle-orm/bun-sqlite"
 import { migrate } from "drizzle-orm/bun-sqlite/migrator"
 import { type SQLiteTransaction } from "drizzle-orm/sqlite-core"
 export * from "drizzle-orm"
@@ -10,10 +11,10 @@ import { NamedError } from "@opencode-ai/util/error"
 import z from "zod"
 import path from "path"
 import { readFileSync, readdirSync, existsSync } from "fs"
+import * as schema from "./schema"
 import { Installation } from "../installation"
 import { Flag } from "../flag/flag"
 import { iife } from "@/util/iife"
-import { init } from "#db"
 
 declare const OPENCODE_MIGRATIONS: { sql: string; timestamp: number; name: string }[] | undefined
 
@@ -35,12 +36,17 @@ export namespace Database {
     return path.join(Global.Path.data, `opencode-${safe}.db`)
   })
 
-  export type Transaction = SQLiteTransaction<"sync", void>
+  type Schema = typeof schema
+  export type Transaction = SQLiteTransaction<"sync", void, Schema>
 
   type Client = SQLiteBunDatabase
 
   type Journal = { sql: string; timestamp: number; name: string }[]
 
+  const state = {
+    sqlite: undefined as BunDatabase | undefined,
+  }
+
   function time(tag: string) {
     const match = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/.exec(tag)
     if (!match) return 0
@@ -77,14 +83,17 @@ export namespace Database {
   export const Client = lazy(() => {
     log.info("opening database", { path: Path })
 
-    const db = init(Path)
+    const sqlite = new BunDatabase(Path, { create: true })
+    state.sqlite = sqlite
+
+    sqlite.run("PRAGMA journal_mode = WAL")
+    sqlite.run("PRAGMA synchronous = NORMAL")
+    sqlite.run("PRAGMA busy_timeout = 5000")
+    sqlite.run("PRAGMA cache_size = -64000")
+    sqlite.run("PRAGMA foreign_keys = ON")
+    sqlite.run("PRAGMA wal_checkpoint(PASSIVE)")
 
-    db.run("PRAGMA journal_mode = WAL")
-    db.run("PRAGMA synchronous = NORMAL")
-    db.run("PRAGMA busy_timeout = 5000")
-    db.run("PRAGMA cache_size = -64000")
-    db.run("PRAGMA foreign_keys = ON")
-    db.run("PRAGMA wal_checkpoint(PASSIVE)")
+    const db = drizzle({ client: sqlite })
 
     // Apply schema migrations
     const entries =
@@ -108,11 +117,14 @@ export namespace Database {
   })
 
   export function close() {
-    Client().$client.close()
+    const sqlite = state.sqlite
+    if (!sqlite) return
+    sqlite.close()
+    state.sqlite = undefined
     Client.reset()
   }
 
-  export type TxOrDb = Transaction | Client
+  export type TxOrDb = SQLiteTransaction<"sync", void, any, any> | Client
 
   const ctx = Context.create<{
     tx: TxOrDb