From 57af632b489e9622f2f74355298e7bb4ac11710e Mon Sep 17 00:00:00 2001 From: Alexander Ignition Date: Sat, 18 Jan 2025 15:19:21 +0300 Subject: [PATCH 1/3] Xcode 16.2 Actions: Xcode 16.2 will replace Xcode 16.0 in macOS-14 Images --- .github/workflows/test.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 786708a..50ba8b2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,6 @@ jobs: Apple: name: Test ${{ matrix.name }} runs-on: macOS-latest - env: - DEVELOPER_DIR: /Applications/Xcode_16.1.app/Contents/Developer strategy: fail-fast: false matrix: @@ -44,8 +42,6 @@ jobs: SPM: name: Test with SPM runs-on: macOS-latest - env: - DEVELOPER_DIR: /Applications/Xcode_16.1.app/Contents/Developer steps: - name: Checkout uses: actions/checkout@v4 From 6be89b89e9cb00f87eb26941a087601d79cfbb11 Mon Sep 17 00:00:00 2001 From: Alexander Ignition Date: Sat, 18 Jan 2025 15:24:20 +0300 Subject: [PATCH 2/3] Revert "Xcode 16.2" This reverts commit 57af632b489e9622f2f74355298e7bb4ac11710e. --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 50ba8b2..786708a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,6 +25,8 @@ jobs: Apple: name: Test ${{ matrix.name }} runs-on: macOS-latest + env: + DEVELOPER_DIR: /Applications/Xcode_16.1.app/Contents/Developer strategy: fail-fast: false matrix: @@ -42,6 +44,8 @@ jobs: SPM: name: Test with SPM runs-on: macOS-latest + env: + DEVELOPER_DIR: /Applications/Xcode_16.1.app/Contents/Developer steps: - name: Checkout uses: actions/checkout@v4 From 3c6b3a0c1123f543f18f56efeedabcbccaaba481 Mon Sep 17 00:00:00 2001 From: Alexander Ignition Date: Sat, 18 Jan 2025 15:34:31 +0300 Subject: [PATCH 3/3] retain database --- Sources/SQLyra/Database.swift | 2 +- Sources/SQLyra/PreparedStatement.swift | 4 +++- Tests/SQLyraTests/PreparedStatementTests.swift | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Sources/SQLyra/Database.swift b/Sources/SQLyra/Database.swift index de55912..cef1500 100644 --- a/Sources/SQLyra/Database.swift +++ b/Sources/SQLyra/Database.swift @@ -133,6 +133,6 @@ public final class Database: DatabaseHandle { public func prepare(_ sql: String) throws -> PreparedStatement { var stmt: OpaquePointer! try check(sqlite3_prepare_v2(db, sql, -1, &stmt, nil)) - return PreparedStatement(stmt: stmt) + return PreparedStatement(stmt: stmt, database: self) } } diff --git a/Sources/SQLyra/PreparedStatement.swift b/Sources/SQLyra/PreparedStatement.swift index 57bfd16..0887706 100644 --- a/Sources/SQLyra/PreparedStatement.swift +++ b/Sources/SQLyra/PreparedStatement.swift @@ -7,6 +7,7 @@ import SQLite3 /// Or, in other words, these routines are constructors for the prepared statement object. public final class PreparedStatement: DatabaseHandle { let stmt: OpaquePointer + let database: Database // release database after all statements /// Find the database handle of a prepared statement. var db: OpaquePointer! { sqlite3_db_handle(stmt) } @@ -17,8 +18,9 @@ public final class PreparedStatement: DatabaseHandle { } ) - init(stmt: OpaquePointer) { + init(stmt: OpaquePointer, database: Database) { self.stmt = stmt + self.database = database } deinit { diff --git a/Tests/SQLyraTests/PreparedStatementTests.swift b/Tests/SQLyraTests/PreparedStatementTests.swift index f75d3ec..a154699 100644 --- a/Tests/SQLyraTests/PreparedStatementTests.swift +++ b/Tests/SQLyraTests/PreparedStatementTests.swift @@ -114,4 +114,18 @@ struct PreparedStatementTests { """ #expect(df.description == expected + "\n") } + + @Test static func retainDatabase() throws { + weak var db: Database? + var statement: PreparedStatement? + do { + let suite = try PreparedStatementTests() + db = suite.db + statement = try suite.db.prepare("SELECT * FROM contacts;") + } + try #require(statement != nil) + #expect(db != nil) + statement = nil + #expect(db == nil) + } }