Skip to content

Commit

Permalink
Add GRDB_SQLITE_INLINE and GRDB_PERFORMANCE_TESTS envrionment variabl…
Browse files Browse the repository at this point in the history
…es to control whether to use the new GRDBSQLiteDynamic module and enable performance tests
  • Loading branch information
marcprux committed Jan 20, 2025
1 parent 253bda5 commit 3055e07
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 12 deletions.
29 changes: 27 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ if ProcessInfo.processInfo.environment["SPI_BUILDER"] == "1" {
dependencies.append(.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"))
}

// When enabled, the GRDBSQLite dependency will use the system SQLite3
// rather than the new GRDBSQLiteDynamic target
let SQLiteInline = ProcessInfo.processInfo.environment["GRDB_SQLITE_INLINE"] == "1"

let package = Package(
name: "GRDB",
defaultLocalization: "en", // for tests
Expand All @@ -43,8 +47,9 @@ let package = Package(
],
dependencies: dependencies,
targets: [
.target(
name: "GRDBSQLite"),
SQLiteInline ?
.systemLibrary(name: "GRDBSQLite", providers: [.apt(["libsqlite3-dev"])]) :
.target(name:"GRDBSQLite", path: "Sources/GRDBSQLiteDynamic"),
.target(
name: "GRDB",
dependencies: ["GRDBSQLite"],
Expand Down Expand Up @@ -84,3 +89,23 @@ let package = Package(
],
swiftLanguageModes: [.v6]
)

// The GRDB_PERFORMANCE_TESTS environment variable enables
// the performance tests to be included in the package, which can be run with:
// GRDB_PERFORMANCE_TESTS=1 swift test --filter GRDBPerformanceTests
if ProcessInfo.processInfo.environment["GRDB_PERFORMANCE_TESTS"] == "1" {
package.targets.append(
Target.testTarget(
name: "GRDBPerformanceTests",
dependencies: ["GRDB"],
path: "Tests/Performance/GRDBPerformance",
cSettings: cSettings,
swiftSettings: swiftSettings + [
// Tests still use the Swift 5 language mode.
.swiftLanguageMode(.v5),
.enableUpcomingFeature("InferSendableFromCaptures"),
.enableUpcomingFeature("GlobalActorIsolatedTypesUsability"),
])
)
}

5 changes: 5 additions & 0 deletions Sources/GRDBSQLite/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module GRDBSQLite [system] {
header "shim.h"
link "sqlite3"
export *
}
49 changes: 49 additions & 0 deletions Sources/GRDBSQLite/shim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <sqlite3.h>

typedef void(*_errorLogCallback)(void *pArg, int iErrCode, const char *zMsg);

/// Wrapper around sqlite3_config(SQLITE_CONFIG_LOG, ...) which is a variadic
/// function that can't be used from Swift.
static inline void _registerErrorLogCallback(_errorLogCallback callback) {
sqlite3_config(SQLITE_CONFIG_LOG, callback, 0);
}

#if SQLITE_VERSION_NUMBER >= 3029000
/// Wrapper around sqlite3_db_config() which is a variadic function that can't
/// be used from Swift.
static inline void _disableDoubleQuotedStringLiterals(sqlite3 *db) {
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DDL, 0, (void *)0);
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DML, 0, (void *)0);
}

/// Wrapper around sqlite3_db_config() which is a variadic function that can't
/// be used from Swift.
static inline void _enableDoubleQuotedStringLiterals(sqlite3 *db) {
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DDL, 1, (void *)0);
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DML, 1, (void *)0);
}
#else
static inline void _disableDoubleQuotedStringLiterals(sqlite3 *db) { }
static inline void _enableDoubleQuotedStringLiterals(sqlite3 *db) { }
#endif

// Expose APIs that are missing from system <sqlite3.h>
#ifdef GRDB_SQLITE_ENABLE_PREUPDATE_HOOK
SQLITE_API void *sqlite3_preupdate_hook(
sqlite3 *db,
void(*xPreUpdate)(
void *pCtx, /* Copy of third arg to preupdate_hook() */
sqlite3 *db, /* Database handle */
int op, /* SQLITE_UPDATE, DELETE or INSERT */
char const *zDb, /* Database name */
char const *zName, /* Table name */
sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */
sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */
),
void*
);
SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **);
SQLITE_API int sqlite3_preupdate_count(sqlite3 *);
SQLITE_API int sqlite3_preupdate_depth(sqlite3 *);
SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **);
#endif /* GRDB_SQLITE_ENABLE_PREUPDATE_HOOK */
File renamed without changes.
File renamed without changes.
20 changes: 10 additions & 10 deletions Tests/Performance/GRDBPerformance/PerformanceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ import RealmSwift
// MARK:- SQLite

let itemTable = Table("item")
let i0Column = Expression<Int>("i0")
let i1Column = Expression<Int>("i1")
let i2Column = Expression<Int>("i2")
let i3Column = Expression<Int>("i3")
let i4Column = Expression<Int>("i4")
let i5Column = Expression<Int>("i5")
let i6Column = Expression<Int>("i6")
let i7Column = Expression<Int>("i7")
let i8Column = Expression<Int>("i8")
let i9Column = Expression<Int>("i9")
let i0Column = SQLite.Expression<Int>("i0")
let i1Column = SQLite.Expression<Int>("i1")
let i2Column = SQLite.Expression<Int>("i2")
let i3Column = SQLite.Expression<Int>("i3")
let i4Column = SQLite.Expression<Int>("i4")
let i5Column = SQLite.Expression<Int>("i5")
let i6Column = SQLite.Expression<Int>("i6")
let i7Column = SQLite.Expression<Int>("i7")
let i8Column = SQLite.Expression<Int>("i8")
let i9Column = SQLite.Expression<Int>("i9")


// MARK: - Realm
Expand Down

0 comments on commit 3055e07

Please sign in to comment.