replacement in tools/sql.go at line 155
[3.4434]→[3.4434:4543](∅→∅) − func executeSQLQuery(ctx context.Context, database *sql.DB, query string, params []any) (*sql.Rows, error) {
+ func executeSQLQuery(ctx context.Context, q db.Querier, query string, params []any) (*sql.Rows, error) {
replacement in tools/sql.go at line 157
[3.4565]→[3.4565:4619](∅→∅) − return database.QueryContext(ctx, query, params...)
+ return q.QueryContext(ctx, query, params...)
replacement in tools/sql.go at line 159
[3.4622]→[3.4622:4664](∅→∅) − return database.QueryContext(ctx, query)
+ return q.QueryContext(ctx, query)
edit in tools/export.go at line 14
+
+ // writer is the local interface for write operations in export.
+ // Defined here per project convention: each consumer defines its own minimal interface.
+ // Uses Context variants exclusively so interfaces compose as compatible subsets of *sql.DB.
+ type writer interface {
+ ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
+ QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
+ }
replacement in tools/export.go at line 201
[3.12599]→[3.12599:12718](∅→∅) − func getOrderedTableManifest(sourceDB *sql.DB) ([]TableRelationship, error) {
− fkOrder, err := db.GetFKOrder(sourceDB)
+ func getOrderedTableManifest(q db.Querier) ([]TableRelationship, error) {
+ fkOrder, err := db.GetFKOrder(q)
replacement in tools/export.go at line 210
[3.12945]→[3.12945:13090](∅→∅) − func countAllTableRows(ctx context.Context, sourceDB *sql.DB, tables []TableRelationship, datasetID string, output *ExportDatasetOutput) error {
+ func countAllTableRows(ctx context.Context, q db.Querier, tables []TableRelationship, datasetID string, output *ExportDatasetOutput) error {
replacement in tools/export.go at line 212
[3.13119]→[3.13119:13180](∅→∅) − count, err := countTableRows(ctx, sourceDB, tr, datasetID)
+ count, err := countTableRows(ctx, q, tr, datasetID)
replacement in tools/export.go at line 235
[3.13759]→[2.2691:2916](∅→∅) − func copyDataToOutput(ctx context.Context, outputDB *sql.DB, tables []TableRelationship, datasetID string, sourceDBPath string) error {
− _, err := outputDB.ExecContext(ctx, fmt.Sprintf("ATTACH '%s' AS source", sourceDBPath))
+ func copyDataToOutput(ctx context.Context, w writer, tables []TableRelationship, datasetID string, sourceDBPath string) error {
+ _, err := w.ExecContext(ctx, fmt.Sprintf("ATTACH '%s' AS source", sourceDBPath))
replacement in tools/export.go at line 243
[3.14101]→[3.14101:14149](∅→∅) − err = copyTableAsIs(ctx, outputDB, tr.Table)
+ err = copyTableAsIs(ctx, w, tr.Table)
replacement in tools/export.go at line 245
[3.14160]→[3.14160:14213](∅→∅) − err = copyTableData(ctx, outputDB, tr, datasetID)
+ err = copyTableData(ctx, w, tr, datasetID)
replacement in tools/export.go at line 260
[3.365004]→[3.365004:365101](∅→∅) − connStr := outputPath + "?access_mode=read_write"
− database, err := sql.Open("duckdb", connStr)
+ database, err := db.OpenWriteableDB(outputPath)
replacement in tools/export.go at line 294
[3.366188]→[3.366188:366268](∅→∅) − func copyTableAsIs(ctx context.Context, outputDB *sql.DB, table string) error {
+ func copyTableAsIs(ctx context.Context, w writer, table string) error {
replacement in tools/export.go at line 296
[3.366346]→[3.366346:366390](∅→∅) − _, err := outputDB.ExecContext(ctx, query)
+ _, err := w.ExecContext(ctx, query)
replacement in tools/export.go at line 301
[3.366465]→[3.366465:366571](∅→∅) − func copyTableData(ctx context.Context, outputDB *sql.DB, tr TableRelationship, datasetID string) error {
+ func copyTableData(ctx context.Context, w writer, tr TableRelationship, datasetID string) error {
replacement in tools/export.go at line 321
[3.367100]→[3.367100:367155](∅→∅) − _, err := outputDB.ExecContext(ctx, query, datasetID)
+ _, err := w.ExecContext(ctx, query, datasetID)
replacement in tools/export.go at line 355
[3.368441]→[3.368441:368551](∅→∅) − func countTableRows(ctx context.Context, db *sql.DB, tr TableRelationship, datasetID string) (int64, error) {
+ func countTableRows(ctx context.Context, q db.Querier, tr TableRelationship, datasetID string) (int64, error) {
replacement in tools/export.go at line 375
[3.368979]→[3.368979:369042](∅→∅) − err := db.QueryRowContext(ctx, query, datasetID).Scan(&count)
+ err := q.QueryRowContext(ctx, query, datasetID).Scan(&count)
replacement in tools/cluster.go at line 86
[3.381890]→[2.3354:3487](∅→∅) − err := db.WithWriteTx(ctx, resolveDBPath(input.DBPath), "create_or_update_cluster", func(database *sql.DB, tx *db.LoggedTx) error {
+ err := db.WithWriteTx(ctx, resolveDBPath(input.DBPath), "create_or_update_cluster", func(_ *sql.DB, tx *db.LoggedTx) error {
replacement in tools/cluster.go at line 210
[3.11113]→[3.11113:11184](∅→∅),
[3.11184]→[2.3578:3633](∅→∅) − func validateClusterActive(database *sql.DB, clusterID string) error {
− return db.ClusterExistsAndActive(database, clusterID)
+ func validateClusterActive(q db.Querier, clusterID string) error {
+ return db.ClusterExistsAndActive(q, clusterID)
replacement in tools/cluster.go at line 215
[3.8573]→[3.8573:8653](∅→∅) − func validateClusterCyclicPattern(database *sql.DB, input ClusterInput) error {
+ func validateClusterCyclicPattern(q db.Querier, input ClusterInput) error {
replacement in tools/cluster.go at line 223
[3.8812]→[2.3634:3687](∅→∅) − return db.PatternExistsAndActive(database, trimmed)
+ return db.PatternExistsAndActive(q, trimmed)
replacement in tools/cluster.go at line 297
[3.12965]→[2.3688:3820](∅→∅),
[2.3820]→[3.20672:20741](∅→∅),
[3.20672]→[3.20672:20741](∅→∅) − err = db.WithWriteTx(ctx, resolveDBPath(input.DBPath), "create_or_update_cluster", func(database *sql.DB, tx *db.LoggedTx) error {
− if err := validateClusterActive(database, clusterID); err != nil {
+ err = db.WithWriteTx(ctx, resolveDBPath(input.DBPath), "create_or_update_cluster", func(_ *sql.DB, tx *db.LoggedTx) error {
+ if err := validateClusterActive(tx, clusterID); err != nil {
replacement in tools/cluster.go at line 302
[3.13577]→[3.20760:20832](∅→∅) − if err := validateClusterCyclicPattern(database, input); err != nil {
+ if err := validateClusterCyclicPattern(tx, input); err != nil {
replacement in db/schema.go at line 4
[3.1000229]→[3.1000229:1000245](∅→∅) replacement in db/schema.go at line 157
[3.1004330]→[3.1004330:1004378](∅→∅),
[3.1004378]→[3.7848:7904](∅→∅) − func GetFKOrder(db *sql.DB) ([]string, error) {
− dependsOnMe, tables, err := buildFKDependencyGraph(db)
+ func GetFKOrder(q Querier) ([]string, error) {
+ dependsOnMe, tables, err := buildFKDependencyGraph(q)
replacement in db/schema.go at line 163
[3.7943]→[3.7943:7997](∅→∅) − if err := collectAllTables(db, tables); err != nil {
+ if err := collectAllTables(q, tables); err != nil {
replacement in db/schema.go at line 173
[3.8269]→[3.8269:8357](∅→∅) − func buildFKDependencyGraph(db *sql.DB) (map[string][]string, map[string]bool, error) {
+ func buildFKDependencyGraph(q Querier) (map[string][]string, map[string]bool, error) {
replacement in db/schema.go at line 177
[3.8433]→[3.8433:8458](∅→∅) − rows, err := db.Query(`
+ rows, err := q.QueryContext(context.Background(), `
replacement in db/schema.go at line 205
[3.8794]→[3.8794:8885](∅→∅) − func collectAllTables(db *sql.DB, tables map[string]bool) error {
− rows, err := db.Query(`
+ func collectAllTables(q Querier, tables map[string]bool) error {
+ rows, err := q.QueryContext(context.Background(), `