diff --git a/Cargo.toml b/Cargo.toml index 8c38e5c..202498f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,4 @@ env_logger = { version = "0.11.6", default-features = false } tracing = "0.1.41" tracing-appender = "0.2.3" tracing-subscriber = {version = "0.3.20", features = ["env-filter"] } -turso_core = { version = "0.2.0" } +turso_core = { version = "0.3.2" } diff --git a/connection.go b/connection.go index 7bc253e..6937c38 100644 --- a/connection.go +++ b/connection.go @@ -447,6 +447,11 @@ func (tx *tursoTx) Commit() error { defer stmt.Close() _, err := stmt.Exec(nil) + if err != nil { + if connErr := tx.conn.getError(); connErr != nil { + err = connErr + } + } return err } diff --git a/libs/MANIFEST-SHA256.txt b/libs/MANIFEST-SHA256.txt index 8734b98..2087f7c 100644 --- a/libs/MANIFEST-SHA256.txt +++ b/libs/MANIFEST-SHA256.txt @@ -1,7 +1,7 @@ -4d9eefabfbe73acd0689338b02ef0cfad60af67a698d941e55347e86b3455fef linux_amd64/libturso_go.so -79563841b65d818d4a62eecfcc56ebe26ef3d3dc26599996af48a6dddf77ccdd linux_arm64/libturso_go.so -7778ae2d0580d92cedbc00e96af8bbb86b3b88733370134b6c4788d389f3e003 darwin_amd64/libturso_go.dylib -2ec716186ea285fb2b0dfd8765b6833e62771e240c8e73ac3ee0fa77f09135d9 darwin_arm64/libturso_go.dylib -612ec40fa3115ae723047bd82bf30cba894b3b6b376ff879ab614978eab80f8b linux_musl_amd64/libturso_go.a -584ea88c65b062f58bed256717ddaddc08ca3ee2e87b6c9e4b208d8a1f7710cf linux_musl_arm64/libturso_go.a -b9eafafe344109935cace9fe026a7a03d8074c397797af46c9b3e76db9bbc114 windows_amd64/turso_go.dll +77c5ce17c736780194ae3b77955d4e1fd9f261d5f895c45f7c69658676680818 linux_amd64/libturso_go.so +ef47c6e23dc3c48f7be7a05c03d74a177c38bb41602d4fe895b0a1ecf9ada84c linux_arm64/libturso_go.so +4088dca6f8ff3e64c7d94f550a523570b7671a301605bbd547712fcd62996ebc darwin_amd64/libturso_go.dylib +8061fea6b656a343897e8a98a8e86d479b152b0652f5b1a7af243b1d25eaa1e4 darwin_arm64/libturso_go.dylib +60117a7d739c389367d41bd4c2aeb812607f7862e25a2ceeb83eed9dbbdf21a9 linux_musl_amd64/libturso_go.a +33539c31b92f50f80ea44e7517c97c19811b090dbe789f414a1f3aed8af4b1d9 linux_musl_arm64/libturso_go.a +2d6296cec27e0d8024b15427766a07e7f47d6c116b3b0431479091237817f9d3 windows_amd64/turso_go.dll diff --git a/libs/darwin_amd64/libturso_go.dylib b/libs/darwin_amd64/libturso_go.dylib index 613746d..250aacb 100644 Binary files a/libs/darwin_amd64/libturso_go.dylib and b/libs/darwin_amd64/libturso_go.dylib differ diff --git a/libs/darwin_amd64/libturso_go.dylib.sha256 b/libs/darwin_amd64/libturso_go.dylib.sha256 index 9c11474..d431ac5 100644 --- a/libs/darwin_amd64/libturso_go.dylib.sha256 +++ b/libs/darwin_amd64/libturso_go.dylib.sha256 @@ -1 +1 @@ -7778ae2d0580d92cedbc00e96af8bbb86b3b88733370134b6c4788d389f3e003 +4088dca6f8ff3e64c7d94f550a523570b7671a301605bbd547712fcd62996ebc diff --git a/libs/darwin_arm64/libturso_go.dylib b/libs/darwin_arm64/libturso_go.dylib index d7fbea5..d91745e 100644 Binary files a/libs/darwin_arm64/libturso_go.dylib and b/libs/darwin_arm64/libturso_go.dylib differ diff --git a/libs/darwin_arm64/libturso_go.dylib.sha256 b/libs/darwin_arm64/libturso_go.dylib.sha256 index 1d80ae6..297b45f 100644 --- a/libs/darwin_arm64/libturso_go.dylib.sha256 +++ b/libs/darwin_arm64/libturso_go.dylib.sha256 @@ -1 +1 @@ -2ec716186ea285fb2b0dfd8765b6833e62771e240c8e73ac3ee0fa77f09135d9 +8061fea6b656a343897e8a98a8e86d479b152b0652f5b1a7af243b1d25eaa1e4 diff --git a/libs/linux_amd64/libturso_go.so b/libs/linux_amd64/libturso_go.so index c858f3b..b6b8f1c 100644 Binary files a/libs/linux_amd64/libturso_go.so and b/libs/linux_amd64/libturso_go.so differ diff --git a/libs/linux_amd64/libturso_go.so.sha256 b/libs/linux_amd64/libturso_go.so.sha256 index fdb3081..938cf48 100644 --- a/libs/linux_amd64/libturso_go.so.sha256 +++ b/libs/linux_amd64/libturso_go.so.sha256 @@ -1 +1 @@ -4d9eefabfbe73acd0689338b02ef0cfad60af67a698d941e55347e86b3455fef +77c5ce17c736780194ae3b77955d4e1fd9f261d5f895c45f7c69658676680818 diff --git a/libs/linux_arm64/libturso_go.so b/libs/linux_arm64/libturso_go.so index 0551742..27d1528 100644 Binary files a/libs/linux_arm64/libturso_go.so and b/libs/linux_arm64/libturso_go.so differ diff --git a/libs/linux_arm64/libturso_go.so.sha256 b/libs/linux_arm64/libturso_go.so.sha256 index 942c729..e5d6b44 100644 --- a/libs/linux_arm64/libturso_go.so.sha256 +++ b/libs/linux_arm64/libturso_go.so.sha256 @@ -1 +1 @@ -79563841b65d818d4a62eecfcc56ebe26ef3d3dc26599996af48a6dddf77ccdd +ef47c6e23dc3c48f7be7a05c03d74a177c38bb41602d4fe895b0a1ecf9ada84c diff --git a/libs/linux_musl_amd64/libturso_go.a b/libs/linux_musl_amd64/libturso_go.a index 48e93cb..9bd4a31 100644 Binary files a/libs/linux_musl_amd64/libturso_go.a and b/libs/linux_musl_amd64/libturso_go.a differ diff --git a/libs/linux_musl_amd64/libturso_go.a.sha256 b/libs/linux_musl_amd64/libturso_go.a.sha256 index a88b507..36c4918 100644 --- a/libs/linux_musl_amd64/libturso_go.a.sha256 +++ b/libs/linux_musl_amd64/libturso_go.a.sha256 @@ -1 +1 @@ -612ec40fa3115ae723047bd82bf30cba894b3b6b376ff879ab614978eab80f8b +60117a7d739c389367d41bd4c2aeb812607f7862e25a2ceeb83eed9dbbdf21a9 diff --git a/libs/linux_musl_arm64/libturso_go.a b/libs/linux_musl_arm64/libturso_go.a index c684524..e5223cb 100644 Binary files a/libs/linux_musl_arm64/libturso_go.a and b/libs/linux_musl_arm64/libturso_go.a differ diff --git a/libs/linux_musl_arm64/libturso_go.a.sha256 b/libs/linux_musl_arm64/libturso_go.a.sha256 index 5b3e5b5..67a95f0 100644 --- a/libs/linux_musl_arm64/libturso_go.a.sha256 +++ b/libs/linux_musl_arm64/libturso_go.a.sha256 @@ -1 +1 @@ -584ea88c65b062f58bed256717ddaddc08ca3ee2e87b6c9e4b208d8a1f7710cf +33539c31b92f50f80ea44e7517c97c19811b090dbe789f414a1f3aed8af4b1d9 diff --git a/libs/windows_amd64/turso_go.dll b/libs/windows_amd64/turso_go.dll index 92ec9ca..3bb7f8f 100644 Binary files a/libs/windows_amd64/turso_go.dll and b/libs/windows_amd64/turso_go.dll differ diff --git a/libs/windows_amd64/turso_go.dll.sha256 b/libs/windows_amd64/turso_go.dll.sha256 index 9630fae..1418e72 100644 --- a/libs/windows_amd64/turso_go.dll.sha256 +++ b/libs/windows_amd64/turso_go.dll.sha256 @@ -1 +1 @@ -b9eafafe344109935cace9fe026a7a03d8074c397797af46c9b3e76db9bbc114 +2d6296cec27e0d8024b15427766a07e7f47d6c116b3b0431479091237817f9d3 diff --git a/rows.go b/rows.go index 8f3d8de..87242fc 100644 --- a/rows.go +++ b/rows.go @@ -139,6 +139,25 @@ func (r *tursoRows) Close() error { } r.mu.Lock() r.closed = true + if r.err == nil { + for { + rc := ResultCode(rowsNext(r.ctx)) + if rc == Row { + continue + } else if rc == Done { + break + } else if rc == ConstraintViolation { + r.err = errors.New("constraint violation") + } else { + if e := r.getError(); e != nil { + r.err = e + } else { + r.err = fmt.Errorf("query failed: %s", rc.String()) + } + } + break + } + } closeRows(r.ctx) r.ctx = 0 r.mu.Unlock() diff --git a/rs_src/lib.rs b/rs_src/lib.rs index 664b774..4891551 100644 --- a/rs_src/lib.rs +++ b/rs_src/lib.rs @@ -7,7 +7,7 @@ use std::{ sync::{Arc, OnceLock}, }; extern crate turso_core; -use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; use turso_core::{Connection, LimboError}; use crate::types::ResultCode; @@ -32,8 +32,18 @@ pub unsafe extern "C" fn db_open(path: *const c_char) -> *mut c_void { let encryption = false; let views = false; let strict = false; - let Ok((io, conn)) = Connection::from_uri(path, indexes, mvcc, views, strict, encryption) - else { + let custom_modules = false; + let autovacuum = false; + let Ok((io, conn)) = Connection::from_uri( + path, + indexes, + mvcc, + views, + strict, + encryption, + custom_modules, + autovacuum, + ) else { panic!("Failed to open connection with path: {path}"); }; TursoConn::new(conn, io).to_ptr() diff --git a/turso_test.go b/turso_test.go index c81f8be..fff6b67 100644 --- a/turso_test.go +++ b/turso_test.go @@ -1022,6 +1022,30 @@ func TestUpsertReturning_databaseSQL_Prepared(t *testing.T) { } } +func TestInsertReturning(t *testing.T) { + db := openMem(t) + _, err := db.Exec(`CREATE TABLE IF NOT EXISTS t (x)`) + if err != nil { + t.Fatalf("create table: %v", err) + } + + var returnedID int64 + if err := db.QueryRow("INSERT INTO t VALUES (1) RETURNING x").Scan(&returnedID); err != nil { + t.Fatalf("queryrow/scan: %v", err) + } + if returnedID != 1 { + t.Fatalf("unexpected returnedId: %v", err) + } + t.Log(returnedID) + if err := db.QueryRow("SELECT * FROM t").Scan(&returnedID); err != nil { + t.Fatalf("queryrow/scan (conflict): %v", err) + } + if returnedID != 1 { + t.Fatalf("unexpected returnedId: %v", err) + } + t.Log(returnedID) +} + func TestUpsertReturning_databaseSQL_Prepared_ArgCountMismatch(t *testing.T) { db := openMem(t) createDatabasesTable(t, db)