diff --git a/database_dal.go b/database_dal.go index 07d2b1b..20b7073 100644 --- a/database_dal.go +++ b/database_dal.go @@ -5,7 +5,8 @@ import ( "github.com/dal-go/dalgo/dal" "github.com/dal-go/dalgo/recordset" - "github.com/dal-go/dalgo/update" + dalrecord "github.com/dal-go/record" + "github.com/dal-go/record/update" ) // Compile-time assertion: *Database must satisfy dal.DB. @@ -21,15 +22,15 @@ func (d *Database) RunReadwriteTransaction(ctx context.Context, f dal.RWTxWorker return d.innerDB.RunReadwriteTransaction(ctx, f, opts...) } -func (d *Database) Get(ctx context.Context, record dal.Record) error { +func (d *Database) Get(ctx context.Context, record dalrecord.Record) error { return d.innerDB.Get(ctx, record) } -func (d *Database) GetMulti(ctx context.Context, records []dal.Record) error { +func (d *Database) GetMulti(ctx context.Context, records []dalrecord.Record) error { return d.innerDB.GetMulti(ctx, records) } -func (d *Database) Exists(ctx context.Context, key *dal.Key) (bool, error) { +func (d *Database) Exists(ctx context.Context, key *dalrecord.Key) (bool, error) { return d.innerDB.Exists(ctx, key) } @@ -47,51 +48,51 @@ func (d *Database) ExecuteQueryToRecordsetReader(ctx context.Context, query dal. // Note: UpdateRecord is intentionally excluded — dalgo2sql's database type // implements it only on transactions, not on the top-level database object. type writeDB interface { - Set(ctx context.Context, record dal.Record) error - SetMulti(ctx context.Context, records []dal.Record) error - Insert(ctx context.Context, record dal.Record, opts ...dal.InsertOption) error - Upsert(ctx context.Context, record dal.Record) error - Delete(ctx context.Context, key *dal.Key) error - DeleteMulti(ctx context.Context, keys []*dal.Key) error - Update(ctx context.Context, key *dal.Key, updates []update.Update, preconditions ...dal.Precondition) error - UpdateMulti(ctx context.Context, keys []*dal.Key, updates []update.Update, preconditions ...dal.Precondition) error + Set(ctx context.Context, record dalrecord.Record) error + SetMulti(ctx context.Context, records []dalrecord.Record) error + Insert(ctx context.Context, record dalrecord.Record, opts ...dal.InsertOption) error + Upsert(ctx context.Context, record dalrecord.Record) error + Delete(ctx context.Context, key *dalrecord.Key) error + DeleteMulti(ctx context.Context, keys []*dalrecord.Key) error + Update(ctx context.Context, key *dalrecord.Key, updates []update.Update, preconditions ...dal.Precondition) error + UpdateMulti(ctx context.Context, keys []*dalrecord.Key, updates []update.Update, preconditions ...dal.Precondition) error } -func (d *Database) Set(ctx context.Context, record dal.Record) error { +func (d *Database) Set(ctx context.Context, record dalrecord.Record) error { return d.innerDB.(writeDB).Set(ctx, record) } -func (d *Database) SetMulti(ctx context.Context, records []dal.Record) error { +func (d *Database) SetMulti(ctx context.Context, records []dalrecord.Record) error { return d.innerDB.(writeDB).SetMulti(ctx, records) } -func (d *Database) Insert(ctx context.Context, record dal.Record, opts ...dal.InsertOption) error { +func (d *Database) Insert(ctx context.Context, record dalrecord.Record, opts ...dal.InsertOption) error { return d.innerDB.(writeDB).Insert(ctx, record, opts...) } -func (d *Database) Upsert(ctx context.Context, record dal.Record) error { +func (d *Database) Upsert(ctx context.Context, record dalrecord.Record) error { return d.innerDB.(writeDB).Upsert(ctx, record) } -func (d *Database) Delete(ctx context.Context, key *dal.Key) error { +func (d *Database) Delete(ctx context.Context, key *dalrecord.Key) error { return d.innerDB.(writeDB).Delete(ctx, key) } -func (d *Database) DeleteMulti(ctx context.Context, keys []*dal.Key) error { +func (d *Database) DeleteMulti(ctx context.Context, keys []*dalrecord.Key) error { return d.innerDB.(writeDB).DeleteMulti(ctx, keys) } -func (d *Database) Update(ctx context.Context, key *dal.Key, updates []update.Update, preconditions ...dal.Precondition) error { +func (d *Database) Update(ctx context.Context, key *dalrecord.Key, updates []update.Update, preconditions ...dal.Precondition) error { return d.innerDB.(writeDB).Update(ctx, key, updates, preconditions...) } -func (d *Database) UpdateMulti(ctx context.Context, keys []*dal.Key, updates []update.Update, preconditions ...dal.Precondition) error { +func (d *Database) UpdateMulti(ctx context.Context, keys []*dalrecord.Key, updates []update.Update, preconditions ...dal.Precondition) error { return d.innerDB.(writeDB).UpdateMulti(ctx, keys, updates, preconditions...) } // UpdateRecord is not supported at the database level by dalgo2sql; use // Update with an explicit key instead, or call UpdateRecord inside a // RunReadwriteTransaction where the transaction object does support it. -func (d *Database) UpdateRecord(ctx context.Context, record dal.Record, updates []update.Update, preconditions ...dal.Precondition) error { +func (d *Database) UpdateRecord(ctx context.Context, record dalrecord.Record, updates []update.Update, preconditions ...dal.Precondition) error { return dal.ErrNotImplementedYet } diff --git a/end2end/sqlite_e2e_test.go b/end2end/sqlite_e2e_test.go index 0d6c488..3766a3e 100644 --- a/end2end/sqlite_e2e_test.go +++ b/end2end/sqlite_e2e_test.go @@ -13,6 +13,7 @@ import ( "github.com/dal-go/dalgo/ddl" "github.com/dal-go/dalgo2sql" "github.com/dal-go/dalgo2sqlite" + "github.com/dal-go/record" ) // TestE2E_CreateDescribeRoundTrip exercises the Feature's round-trip @@ -143,15 +144,15 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { // 3. Insert two records using map[string]any data. // The key.ID becomes the PK column value; the map contains non-PK fields. - rec1 := dal.NewRecordWithData( - dal.NewKeyWithID("widgets", "w1"), + rec1 := record.NewRecordWithData( + record.NewKeyWithID("widgets", "w1"), map[string]any{"name": "Sprocket", "price": "9.99"}, ) if err := db.Insert(ctx, rec1); err != nil { t.Fatalf("Insert w1: %v", err) } - rec2 := dal.NewRecordWithData( - dal.NewKeyWithID("widgets", "w2"), + rec2 := record.NewRecordWithData( + record.NewKeyWithID("widgets", "w2"), map[string]any{"name": "Bolt", "price": "1.50"}, ) if err := db.Insert(ctx, rec2); err != nil { @@ -169,7 +170,7 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { } defer func() { _ = rr.Close() }() - var allRecords []dal.Record + var allRecords []record.Record for { rec, err := rr.Next() if errors.Is(err, io.EOF) { @@ -213,7 +214,7 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { // 6. db.Get() with map[string]any — previously broken, now fixed. // Get returns SELECT * so the PK column is also present in the map. gotMap := make(map[string]any) - getRec := dal.NewRecordWithData(dal.NewKeyWithID("widgets", "w1"), gotMap) + getRec := record.NewRecordWithData(record.NewKeyWithID("widgets", "w1"), gotMap) if err := db.Get(ctx, getRec); err != nil { t.Fatalf("db.Get with map data: %v", err) } @@ -228,18 +229,18 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { t.Errorf("db.Get map id = %v, want w1", gotMap["id"]) } - // 7. db.Get() for a missing key must return dal.IsNotFound. + // 7. db.Get() for a missing key must return record.IsNotFound. missingMap := make(map[string]any) - missingRec := dal.NewRecordWithData(dal.NewKeyWithID("widgets", "no-such-widget"), missingMap) + missingRec := record.NewRecordWithData(record.NewKeyWithID("widgets", "no-such-widget"), missingMap) if notFoundErr := db.Get(ctx, missingRec); notFoundErr == nil { t.Error("db.Get for missing key: expected not-found error, got nil") - } else if !dal.IsNotFound(notFoundErr) { + } else if !record.IsNotFound(notFoundErr) { t.Errorf("db.Get for missing key: expected IsNotFound, got: %v", notFoundErr) } // 8. db.Set() upsert with map[string]any: insert new then update. - setRec := dal.NewRecordWithData( - dal.NewKeyWithID("widgets", "w3"), + setRec := record.NewRecordWithData( + record.NewKeyWithID("widgets", "w3"), map[string]any{"name": "Gear", "price": "5.00"}, ) if err := db.Set(ctx, setRec); err != nil { @@ -247,7 +248,7 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { } // Verify via Get. gotSet := make(map[string]any) - getSetRec := dal.NewRecordWithData(dal.NewKeyWithID("widgets", "w3"), gotSet) + getSetRec := record.NewRecordWithData(record.NewKeyWithID("widgets", "w3"), gotSet) if err := db.Get(ctx, getSetRec); err != nil { t.Fatalf("db.Get after Set (insert): %v", err) } @@ -255,15 +256,15 @@ func TestE2E_MapDataRoundTrip(t *testing.T) { t.Errorf("name after Set insert = %v, want Gear", gotSet["name"]) } // Now update via Set. - updRec := dal.NewRecordWithData( - dal.NewKeyWithID("widgets", "w3"), + updRec := record.NewRecordWithData( + record.NewKeyWithID("widgets", "w3"), map[string]any{"name": "Big Gear", "price": "15.00"}, ) if err := db.Set(ctx, updRec); err != nil { t.Fatalf("db.Set (update): %v", err) } gotUpd := make(map[string]any) - getUpdRec := dal.NewRecordWithData(dal.NewKeyWithID("widgets", "w3"), gotUpd) + getUpdRec := record.NewRecordWithData(record.NewKeyWithID("widgets", "w3"), gotUpd) if err := db.Get(ctx, getUpdRec); err != nil { t.Fatalf("db.Get after Set (update): %v", err) } diff --git a/go.mod b/go.mod index 1723088..8ec8393 100644 --- a/go.mod +++ b/go.mod @@ -2,27 +2,26 @@ module github.com/dal-go/dalgo2sqlite go 1.25.0 -//replace github.com/dal-go/dalgo => ../dalgo - require ( - github.com/dal-go/dalgo v0.63.0 - github.com/dal-go/dalgo2sql v0.9.0 + github.com/dal-go/dalgo v0.63.1 + github.com/dal-go/dalgo2sql v0.9.7 + github.com/dal-go/record v0.1.0 modernc.org/sqlite v1.54.0 ) require ( - github.com/RoaringBitmap/roaring/v2 v2.21.0 // indirect - github.com/bits-and-blooms/bitset v1.24.4 // indirect + github.com/RoaringBitmap/roaring/v2 v2.22.0 // indirect + github.com/bits-and-blooms/bitset v1.24.6 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/georgysavva/scany/v2 v2.1.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.23 // indirect github.com/mschoch/smat v0.2.0 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/strongo/random v0.0.1 // indirect - golang.org/x/sys v0.46.0 // indirect - modernc.org/libc v1.74.1 // indirect + golang.org/x/sys v0.47.0 // indirect + modernc.org/libc v1.74.3 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 4035e16..23645ac 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,17 @@ github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/RoaringBitmap/roaring/v2 v2.19.0 h1:zsWtVE+biht4eVl0YDLvykUqGkftR3Qc5UCbeKB4UQ4= -github.com/RoaringBitmap/roaring/v2 v2.19.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= -github.com/RoaringBitmap/roaring/v2 v2.21.0 h1:RKVgkD+c9ouyCydF2PW/mztDyZTsb7ksas/IofnguDg= -github.com/RoaringBitmap/roaring/v2 v2.21.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= -github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= -github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/RoaringBitmap/roaring/v2 v2.22.0 h1:aGqjvTSkJSTP7W6q518EHiK9RRRb5gJbCaaciCFr/Lg= +github.com/RoaringBitmap/roaring/v2 v2.22.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= +github.com/bits-and-blooms/bitset v1.24.6 h1:qcrftZUVBIwfs+m+nhoCBAPT+ZPZZjti8SbHbDQQkZ4= +github.com/bits-and-blooms/bitset v1.24.6/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/cockroachdb/cockroach-go/v2 v2.2.0 h1:/5znzg5n373N/3ESjHF5SMLxiW4RKB05Ql//KWfeTFs= github.com/cockroachdb/cockroach-go/v2 v2.2.0/go.mod h1:u3MiKYGupPPjkn3ozknpMUpxPaNLTFWAya419/zv6eI= -github.com/dal-go/dalgo v0.62.9 h1:waLS0kC2kraEyG2U8PHTtniO6tBUgdA0Eo54r8qAomk= -github.com/dal-go/dalgo v0.62.9/go.mod h1:afkKVmM5Nc7LyJXYKup+5lJwAK+qIT0PDbUcsHpF0AQ= -github.com/dal-go/dalgo v0.62.10 h1:a62m+mWfjch7za3G8iCUM/GDfSV7uF1o/1XVZ9k2DhA= -github.com/dal-go/dalgo v0.62.10/go.mod h1:afkKVmM5Nc7LyJXYKup+5lJwAK+qIT0PDbUcsHpF0AQ= -github.com/dal-go/dalgo v0.62.12 h1:3rpX6G5UBv2BEE1orBNrxRqHhWXi6gdo9N7Nc/mjzgw= -github.com/dal-go/dalgo v0.62.12/go.mod h1:afkKVmM5Nc7LyJXYKup+5lJwAK+qIT0PDbUcsHpF0AQ= -github.com/dal-go/dalgo v0.62.13 h1:uZkIDHlCMGHvRIHgLR2sNJs/xeCyWNFaePbvRt1mF84= -github.com/dal-go/dalgo v0.62.13/go.mod h1:2M7GW1jH1orFHr75MGkoBxiljuJeZI5KISsUxqWqkeo= -github.com/dal-go/dalgo v0.62.15 h1:ZToGaqcV7iLaZMAXkOxGwTFmoHHydkSy9oSC4dsWqIk= -github.com/dal-go/dalgo v0.62.15/go.mod h1:D24Vcd8SLqunLf27hXRkrC5uM8kTPBga6JVKbBuW9Tw= -github.com/dal-go/dalgo v0.63.0 h1:oBjfDH27y/CYQ/yeH+gfjBXeMnPQXT4CATnz7tXfIUg= -github.com/dal-go/dalgo v0.63.0/go.mod h1:D24Vcd8SLqunLf27hXRkrC5uM8kTPBga6JVKbBuW9Tw= -github.com/dal-go/dalgo2sql v0.9.0 h1:khop7behY5KZyZYez/NE69qUYeMMxYzAW5yxUjog2dY= -github.com/dal-go/dalgo2sql v0.9.0/go.mod h1:ih6hfRxEz7RX6R5u106QbLHUTUoBNOax+29Belk3HI4= +github.com/dal-go/dalgo v0.63.1 h1:GEJAGlNH5xGLdFasSIRrYdqGfd0+4A9DGQ843qJQbyA= +github.com/dal-go/dalgo v0.63.1/go.mod h1:LtD5XVzb1kAdXaRcWVNy4F2ROC4fqR4jqD3q/GD4fJQ= +github.com/dal-go/dalgo2sql v0.9.7 h1:2m5tDVR6fCZwCq3wezpx8th0eIpsakwQF4vkawqRsIY= +github.com/dal-go/dalgo2sql v0.9.7/go.mod h1:yP20ORPKFDmtNEcHzBfrFVJuJPOCqWLYNYaMdE2nuTQ= +github.com/dal-go/record v0.1.0 h1:hA4143oZwIgtBH/1BRTUEZMCpDfXQr3ONlVXX8USCNg= +github.com/dal-go/record v0.1.0/go.mod h1:quwsVJTT0f6y3Mhx+yHpTobY7luX1M6kyO6fdJ/AFYE= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -50,8 +40,8 @@ github.com/jackc/puddle/v2 v2.0.0 h1:Kwk/AlLigcnZsDssc3Zun1dk1tAtQNPaBBxBHWn0Mjc github.com/jackc/puddle/v2 v2.0.0/go.mod h1:itE7ZJY8xnoo0JqJEpSMprN0f+NQkMCuEV/N9j8h0oc= github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.23 h1:cYwCQTQf3HB6xUC+BtyCLZNr7IzbOmoZbmssVNzSyiQ= +github.com/mattn/go-isatty v0.0.23/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= @@ -70,39 +60,36 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/strongo/random v0.0.1 h1:OZHJBb/3uEa7OX8L2Dv2pLnSeewRmXMyTACoeto6O8I= github.com/strongo/random v0.0.1/go.mod h1:/pSI+SjBNLBkjljNtVdYr6ERddA+LqSa87o0/s+9iuU= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.28.4 h1:Hd/4Es+MBj+/7hSdZaisNyu6bv3V0Dp2MdllyfqaH+c= -modernc.org/cc/v4 v4.28.4/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= -modernc.org/ccgo/v4 v4.34.4 h1:OVnSOWQjVKOYkFxoHYB+qQmSHK5gqMqARM+K9DpR/Ws= -modernc.org/ccgo/v4 v4.34.4/go.mod h1:qdKqE8FNIYyysougB1RX9MxCzp5oJOcQXSobANJ4TuE= +modernc.org/cc/v4 v4.29.1 h1:MKgdCV3WykTSPqpVrnxdEDS0HEd2FHpKZDzxzU5LyeI= +modernc.org/cc/v4 v4.29.1/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= +modernc.org/ccgo/v4 v4.34.6 h1:sBgfIwyN0TQ9C5hwIeuqyeAKyMWnbvj2fvpF4L11uzU= +modernc.org/ccgo/v4 v4.34.6/go.mod h1:SZ8YcN9NG7XVsQYdm6jYBvi8PQP1qi+kqB6OhjqI3Fk= modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.3 h1:6QAplYyVO+KdPW3pGnqmJDUxtkec8ooEWvks/hhU3lc= -modernc.org/gc/v3 v3.1.3/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/gc/v3 v3.1.4 h1:2g65LGVSmFQrXeITAw97x7hCRvZFcyE1uDP+7Vng7JI= +modernc.org/gc/v3 v3.1.4/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.73.4 h1:+ra4Ui8ngyt8HDcO1FTDPWlkAh6yOdaO2yAoh8MddQA= -modernc.org/libc v1.73.4/go.mod h1:DXZ3eO8qMCNn2SnmTNCiC71nJ9Rcq3PsnpU6Vc4rWK8= -modernc.org/libc v1.74.1 h1:bdR4VTKFMC4966QSNZ05XLGI/VwzVa2kTUX51Dm0riQ= -modernc.org/libc v1.74.1/go.mod h1:uH4t5bOx3G3g9Xcmj10YKlTcVISlRDwv8VoQJG9n8Os= +modernc.org/libc v1.74.3 h1:a4J+Z8aVaxPyjyxRAdJzw246PqpcFGvVPnfT/AuM5Ws= +modernc.org/libc v1.74.3/go.mod h1:4H7h/MJ8wnjL8RAbp9v3OXgnk22X7MouHIhDbvP3gj4= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -111,8 +98,6 @@ modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.53.0 h1:20WG8N9q4ji/dEqGk4uiI0c6OPjSeLTNYGFCc3+7c1M= -modernc.org/sqlite v1.53.0/go.mod h1:xoEpOIpGrgT48H5iiyt/YXPCZPEzlfmfFwtk8Lklw8s= modernc.org/sqlite v1.54.0 h1:JCxR4qwkJvOaqAoYcgDoO25Nc+ROg6EJ2LfBVzdrgog= modernc.org/sqlite v1.54.0/go.mod h1:4ntCLuNmnH8+GNqjka1wNg7KJd5/Hi5FYp8K+XQ7GZw= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= diff --git a/schema_reader.go b/schema_reader.go index 4e87344..5eda295 100644 --- a/schema_reader.go +++ b/schema_reader.go @@ -8,12 +8,13 @@ import ( "github.com/dal-go/dalgo/dal" "github.com/dal-go/dalgo/dbschema" + "github.com/dal-go/record" ) // ListCollections returns the user-defined tables in alphabetical -// order. The parent *dal.Key is ignored — SQLite has no +// order. The parent *record.Key is ignored — SQLite has no // catalog/schema hierarchy. -func (d *Database) ListCollections(ctx context.Context, parent *dal.Key) ([]dal.CollectionRef, error) { +func (d *Database) ListCollections(ctx context.Context, parent *record.Key) ([]dal.CollectionRef, error) { _ = parent // ignored rows, err := d.sqlDB.QueryContext(ctx, `SELECT name FROM sqlite_master diff --git a/spec/features/dbschema-ddl-coverage/README.md b/spec/features/dbschema-ddl-coverage/README.md index 5cccef5..ffa6492 100644 --- a/spec/features/dbschema-ddl-coverage/README.md +++ b/spec/features/dbschema-ddl-coverage/README.md @@ -94,7 +94,7 @@ The `dbschema.SchemaReader` interface in `dal-go/dalgo` (file `dbschema/reader.g #### REQ: list-collections -`Database.ListCollections(ctx context.Context, parent *dal.Key) ([]dal.CollectionRef, error)` MUST return the user-defined tables in the database. The `parent *dal.Key` argument is ignored (SQLite has no catalog/schema hierarchy) — when non-nil it is treated as "everything visible" (same as nil). The result MUST come from `SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name` and be returned as a slice of `dal.CollectionRef` whose `Name` field is the table name. SQLite's internal tables (`sqlite_sequence`, `sqlite_stat1`, etc.) MUST be excluded. +`Database.ListCollections(ctx context.Context, parent *record.Key) ([]dal.CollectionRef, error)` MUST return the user-defined tables in the database. The `parent *record.Key` argument is ignored (SQLite has no catalog/schema hierarchy) — when non-nil it is treated as "everything visible" (same as nil). The result MUST come from `SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name` and be returned as a slice of `dal.CollectionRef` whose `Name` field is the table name. SQLite's internal tables (`sqlite_sequence`, `sqlite_stat1`, etc.) MUST be excluded. #### REQ: describe-collection diff --git a/spec/plans/2026-05-13-dbschema-ddl-coverage.md b/spec/plans/2026-05-13-dbschema-ddl-coverage.md index 2d4658c..baa03e3 100644 --- a/spec/plans/2026-05-13-dbschema-ddl-coverage.md +++ b/spec/plans/2026-05-13-dbschema-ddl-coverage.md @@ -348,7 +348,8 @@ import ( "github.com/dal-go/dalgo/dal" "github.com/dal-go/dalgo/recordset" - "github.com/dal-go/dalgo/update" + "github.com/dal-go/record" + "github.com/dal-go/record/update" ) // The following methods delegate the full dal.DB surface to the @@ -363,47 +364,47 @@ func (d *Database) RunReadwriteTransaction(ctx context.Context, f dal.RWTxWorker return d.innerDB.RunReadwriteTransaction(ctx, f, opts...) } -func (d *Database) Get(ctx context.Context, record dal.Record) error { +func (d *Database) Get(ctx context.Context, record record.Record) error { return d.innerDB.Get(ctx, record) } -func (d *Database) GetMulti(ctx context.Context, records []dal.Record) error { +func (d *Database) GetMulti(ctx context.Context, records []record.Record) error { return d.innerDB.GetMulti(ctx, records) } -func (d *Database) Exists(ctx context.Context, key *dal.Key) (bool, error) { +func (d *Database) Exists(ctx context.Context, key *record.Key) (bool, error) { return d.innerDB.Exists(ctx, key) } -func (d *Database) Set(ctx context.Context, record dal.Record) error { +func (d *Database) Set(ctx context.Context, record record.Record) error { return d.innerDB.Set(ctx, record) } -func (d *Database) SetMulti(ctx context.Context, records []dal.Record) error { +func (d *Database) SetMulti(ctx context.Context, records []record.Record) error { return d.innerDB.SetMulti(ctx, records) } -func (d *Database) Insert(ctx context.Context, record dal.Record, opts ...dal.InsertOption) error { +func (d *Database) Insert(ctx context.Context, record record.Record, opts ...dal.InsertOption) error { return d.innerDB.Insert(ctx, record, opts...) } -func (d *Database) Upsert(ctx context.Context, record dal.Record) error { +func (d *Database) Upsert(ctx context.Context, record record.Record) error { return d.innerDB.Upsert(ctx, record) } -func (d *Database) Update(ctx context.Context, key *dal.Key, updates []update.Update, preconditions ...dal.Precondition) error { +func (d *Database) Update(ctx context.Context, key *record.Key, updates []update.Update, preconditions ...dal.Precondition) error { return d.innerDB.Update(ctx, key, updates, preconditions...) } -func (d *Database) UpdateMulti(ctx context.Context, keys []*dal.Key, updates []update.Update, preconditions ...dal.Precondition) error { +func (d *Database) UpdateMulti(ctx context.Context, keys []*record.Key, updates []update.Update, preconditions ...dal.Precondition) error { return d.innerDB.UpdateMulti(ctx, keys, updates, preconditions...) } -func (d *Database) Delete(ctx context.Context, key *dal.Key) error { +func (d *Database) Delete(ctx context.Context, key *record.Key) error { return d.innerDB.Delete(ctx, key) } -func (d *Database) DeleteMulti(ctx context.Context, keys []*dal.Key) error { +func (d *Database) DeleteMulti(ctx context.Context, keys []*record.Key) error { return d.innerDB.DeleteMulti(ctx, keys) } @@ -1052,6 +1053,7 @@ import ( "github.com/dal-go/dalgo/dal" "github.com/dal-go/dalgo/dbschema" + "github.com/dal-go/record" "github.com/dal-go/dalgo/ddl" ) @@ -1608,9 +1610,9 @@ import ( ) // ListCollections returns the user-defined tables in alphabetical -// order. The parent *dal.Key is ignored — SQLite has no +// order. The parent *record.Key is ignored — SQLite has no // catalog/schema hierarchy. -func (d *Database) ListCollections(ctx context.Context, parent *dal.Key) ([]dal.CollectionRef, error) { +func (d *Database) ListCollections(ctx context.Context, parent *record.Key) ([]dal.CollectionRef, error) { _ = parent // ignored rows, err := d.sqlDB.QueryContext(ctx, `SELECT name FROM sqlite_master