diff --git a/Sources/CLibsql/CLibsql.xcframework/Info.plist b/Sources/CLibsql/CLibsql.xcframework/Info.plist index 78447f0..cd6cf0c 100644 --- a/Sources/CLibsql/CLibsql.xcframework/Info.plist +++ b/Sources/CLibsql/CLibsql.xcframework/Info.plist @@ -56,6 +56,25 @@ SupportedPlatformVariant simulator + + BinaryPath + liblibsql.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64_x86_64-maccatalyst + LibraryPath + liblibsql.a + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + maccatalyst + CFBundlePackageType XFWK diff --git a/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/libsql.h b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/libsql.h new file mode 100644 index 0000000..5a4a3fe --- /dev/null +++ b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/libsql.h @@ -0,0 +1,249 @@ +#ifndef LIBSQL_H +#define LIBSQL_H + +#include +#include +#include + +typedef struct libsql_error_t libsql_error_t; + +typedef enum { + LIBSQL_CYPHER_DEFAULT = 0, + LIBSQL_CYPHER_AES256, +} libsql_cypher_t; + +typedef enum { + LIBSQL_TYPE_INTEGER = 1, + LIBSQL_TYPE_REAL = 2, + LIBSQL_TYPE_TEXT = 3, + LIBSQL_TYPE_BLOB = 4, + LIBSQL_TYPE_NULL = 5, +} libsql_type_t; + +typedef enum { + LIBSQL_TRACING_LEVEL_ERROR = 1, + LIBSQL_TRACING_LEVEL_WARN, + LIBSQL_TRACING_LEVEL_INFO, + LIBSQL_TRACING_LEVEL_DEBUG, + LIBSQL_TRACING_LEVEL_TRACE, +} libsql_tracing_level_t; + +typedef struct { + const char *message; + const char *target; + const char *file; + uint64_t timestamp; + size_t line; + libsql_tracing_level_t level; +} libsql_log_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_database_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_connection_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_statement_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_transaction_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_rows_t; + +typedef struct { + libsql_error_t *err; + void *inner; +} libsql_row_t; + +typedef struct { + libsql_error_t *err; +} libsql_batch_t; + +typedef struct { + const void *ptr; + size_t len; +} libsql_slice_t; + +typedef union { + int64_t integer; + double real; + libsql_slice_t text; + libsql_slice_t blob; +} libsql_value_union_t; + +typedef struct { + libsql_value_union_t value; + libsql_type_t type; +} libsql_value_t; + +typedef struct { + libsql_error_t *err; + libsql_value_t ok; +} libsql_result_value_t; + +typedef struct { + libsql_error_t *err; + uint64_t frame_no; + uint64_t frames_synced; +} libsql_sync_t; + +typedef struct { + libsql_error_t *err; +} libsql_bind_t; + +typedef struct { + libsql_error_t *err; + uint64_t rows_changed; +} libsql_execute_t; + +typedef struct { + libsql_error_t *err; + int64_t last_inserted_rowid; + uint64_t total_changes; +} libsql_connection_info_t; + +/** + * Database description. + */ +typedef struct { + /** The url to the primary database */ + const char *url; + /** Path to the database file or `:memory:` */ + const char *path; + /** Auth token to access the primary */ + const char *auth_token; + /** Encryption key to encrypt and decrypt the database in `path` */ + const char *encryption_key; + /** Interval to periodicaly sync with primary */ + uint64_t sync_interval; + /** Cypher to be used with `encryption_key` */ + libsql_cypher_t cypher; + /** If set, disable `read_your_writes`. To mantain consistency. */ + bool disable_read_your_writes; + /** Enable Webpki connector */ + bool webpki; + /** Offline writes */ + bool synced; + /** Safety assert */ + bool disable_safety_assert; +} libsql_database_desc_t; + +typedef struct { + void (*logger)(libsql_log_t log); + const char *version; +} libsql_config_t; + +/** Setup some global info */ +const libsql_error_t *libsql_setup(libsql_config_t config); + +/** Get the error message from a error */ +const char *libsql_error_message(libsql_error_t *self); + +/** Create or open a database */ +libsql_database_t libsql_database_init(libsql_database_desc_t desc); + +/** Sync frames with the primary */ +libsql_sync_t libsql_database_sync(libsql_database_t self); + +/** Connect with the database */ +libsql_connection_t libsql_database_connect(libsql_database_t self); + +/** Begin a transaction */ +libsql_transaction_t libsql_connection_transaction(libsql_connection_t self); + +/** Send a batch statement in a connection */ +libsql_batch_t +libsql_connection_batch(libsql_connection_t self, const char *sql); + +/** Send a batch statement in a connection */ +libsql_connection_info_t libsql_connection_info(libsql_connection_t self); + +/** Send a batch statement in a transaction */ +libsql_batch_t +libsql_transaction_batch(libsql_transaction_t self, const char *sql); + +/** Prepare a statement in a connection */ +libsql_statement_t +libsql_connection_prepare(libsql_connection_t self, const char *sql); +/** Prepare a statement in a transaction */ +libsql_statement_t +libsql_transaction_prepare(libsql_transaction_t self, const char *sql); + +/** Execute a statement */ +libsql_execute_t libsql_statement_execute(libsql_statement_t self); +/** Query a statement */ +libsql_rows_t libsql_statement_query(libsql_statement_t self); +/** Reset a statement */ +void libsql_statement_reset(libsql_statement_t self); +/** Column count */ +size_t libsql_statement_column_count(libsql_statement_t self); + +/** Get the next row from rows */ +libsql_row_t libsql_rows_next(libsql_rows_t self); +/** Get the column name at the index */ +libsql_slice_t libsql_rows_column_name(libsql_rows_t self, int32_t index); +/** Get rows column count */ +int32_t libsql_rows_column_count(libsql_rows_t self); + +/** Get the value at the the index */ +libsql_result_value_t libsql_row_value(libsql_row_t self, int32_t index); +/** Get the column name at the the index */ +libsql_slice_t libsql_row_name(libsql_row_t self, int32_t index); +/** Get row column count */ +int32_t libsql_row_length(libsql_row_t self); +/** Check if the row is empty, indicating the end of `libsql_rows_next` */ +bool libsql_row_empty(libsql_row_t self); + +/** Bind a named argument to a statement */ +libsql_bind_t libsql_statement_bind_named( + libsql_statement_t self, + const char *name, + libsql_value_t value +); +/** Bind a positional argument to a statement */ +libsql_bind_t +libsql_statement_bind_value(libsql_statement_t self, libsql_value_t value); + +/** Create a libsql integer value */ +libsql_value_t libsql_integer(int64_t integer); +/** Create a libsql real value */ +libsql_value_t libsql_real(double real); +/** Create a libsql text value */ +libsql_value_t libsql_text(const char *ptr, size_t len); +/** Create a libsql blob value */ +libsql_value_t libsql_blob(const uint8_t *ptr, size_t len); +/** Create a libsql null value */ +libsql_value_t libsql_null(); + +/** Deallocate and close a error */ +void libsql_error_deinit(libsql_error_t *self); +/** Deallocate and close a database */ +void libsql_database_deinit(libsql_database_t self); +/** Deallocate and close a connection */ +void libsql_connection_deinit(libsql_connection_t self); +/** Deallocate and close a statement */ +void libsql_statement_deinit(libsql_statement_t self); +/** Deallocate and commit a transaction (transaction becomes invalid) */ +void libsql_transaction_commit(libsql_transaction_t self); +/** Deallocate and rollback a transaction (transaction becomes invalid) */ +void libsql_transaction_rollback(libsql_transaction_t self); +/** Deallocate and close rows */ +void libsql_rows_deinit(libsql_rows_t self); +/** Deallocate and close a row */ +void libsql_row_deinit(libsql_row_t self); +/** Deallocate a slice */ +void libsql_slice_deinit(libsql_slice_t value); + +#endif /* LIBSQL_H */ diff --git a/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/module.modulemap b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/module.modulemap new file mode 100644 index 0000000..46889fa --- /dev/null +++ b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/Headers/module.modulemap @@ -0,0 +1,4 @@ +module CLibsql { + header "libsql.h" + export * +} diff --git a/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/liblibsql.a b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/liblibsql.a new file mode 100644 index 0000000..dd8e9bb Binary files /dev/null and b/Sources/CLibsql/CLibsql.xcframework/ios-arm64_x86_64-maccatalyst/liblibsql.a differ diff --git a/Sources/CLibsql/build.sh b/Sources/CLibsql/build.sh index 75d32eb..8ba6143 100755 --- a/Sources/CLibsql/build.sh +++ b/Sources/CLibsql/build.sh @@ -1,59 +1,80 @@ #!/usr/bin/env sh -set -xe +f +set -eu +set -x cd libsql-c export IPHONEOS_DEPLOYMENT_TARGET=15.1 -function build_ios() { - iphone=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk - iphonesimulator=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk +macos_sdk="$(xcrun --sdk macosx --show-sdk-path)" +xcframework_root="../CLibsql.xcframework" +xcframework_output="../CLibsql.xcframework.new" - CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_DEBUG=true - RUSTFLAGS="-C link-arg=-F$SDKROOT/System/Library/Frameworks" - CFLAGS="-DHAVE_GETHOSTUUID=0" +rustup target add aarch64-apple-ios-macabi x86_64-apple-ios-macabi - SDKROOT="$iphone" - cargo build --target aarch64-apple-ios --release +wrapper_dir="$(mktemp -d)" +include_dir="$(mktemp -d)" - SDKROOT="$iphonesimulator" - cargo build --target x86_64-apple-ios --release +cleanup() { + rm -rf "$wrapper_dir" "$include_dir" +} - SDKROOT="$iphonesimulator" - cargo build --target aarch64-apple-ios-sim --release +trap cleanup EXIT - mkdir -p ./target/universal-ios-sim/release +cat > "$wrapper_dir/clang-macabi-wrapper" <<'EOF' +#!/usr/bin/env sh +set -eu +real_clang="$(xcrun --find clang)" +python3 - "$real_clang" "$@" <<'PY' +import os +import sys + +real = sys.argv[1] +args = [arg.replace("macabimacabi", "macabi") for arg in sys.argv[2:]] +os.execv(real, [real, *args]) +PY +EOF +chmod +x "$wrapper_dir/clang-macabi-wrapper" + +build_maccatalyst() { + env \ + -u IPHONEOS_DEPLOYMENT_TARGET \ + SDKROOT="$macos_sdk" \ + CC_aarch64_apple_ios_macabi="$wrapper_dir/clang-macabi-wrapper" \ + cargo build --target aarch64-apple-ios-macabi --release + + env \ + -u IPHONEOS_DEPLOYMENT_TARGET \ + SDKROOT="$macos_sdk" \ + CC_x86_64_apple_ios_macabi="$wrapper_dir/clang-macabi-wrapper" \ + cargo build --target x86_64-apple-ios-macabi --release + + mkdir -p ./target/universal-maccatalyst/release lipo \ - ./target/x86_64-apple-ios/release/liblibsql.a \ - ./target/aarch64-apple-ios-sim/release/liblibsql.a \ - -create -output ./target/universal-ios-sim/release/liblibsql.a + ./target/x86_64-apple-ios-macabi/release/liblibsql.a \ + ./target/aarch64-apple-ios-macabi/release/liblibsql.a \ + -create -output ./target/universal-maccatalyst/release/liblibsql.a } -build_ios - -nix develop .# -c "./build.sh" - -mkdir -p ./target/universal-macos/release +build_maccatalyst -lipo \ - ./target/x86_64-apple-darwin/release/liblibsql.a \ - ./target/aarch64-apple-darwin/release/liblibsql.a \ - -create -output ./target/universal-macos/release/liblibsql.a +test -f "$xcframework_root/ios-arm64/liblibsql.a" +test -f "$xcframework_root/ios-arm64_x86_64-simulator/liblibsql.a" +test -f "$xcframework_root/macos-arm64_x86_64/liblibsql.a" -rm -rf ../CLibsql.xcframework +cp ./libsql.h "$include_dir/" +cp ../module.modulemap "$include_dir/" -include_dir=`mktemp -d` - -cp ./libsql.h $include_dir/ -cp ../module.modulemap $include_dir/ +rm -rf "$xcframework_output" xcodebuild -create-xcframework \ - -library ./target/universal-ios-sim/release/liblibsql.a -headers $include_dir \ - -library ./target/aarch64-apple-ios/release/liblibsql.a -headers $include_dir \ - -library ./target/universal-macos/release/liblibsql.a -headers $include_dir \ - -output ../CLibsql.xcframework - -rm -rf $include_dir - + -library "$xcframework_root/ios-arm64/liblibsql.a" -headers "$include_dir" \ + -library "$xcframework_root/ios-arm64_x86_64-simulator/liblibsql.a" -headers "$include_dir" \ + -library "$xcframework_root/macos-arm64_x86_64/liblibsql.a" -headers "$include_dir" \ + -library ./target/universal-maccatalyst/release/liblibsql.a -headers "$include_dir" \ + -output "$xcframework_output" + +rm -rf "$xcframework_root" +mv "$xcframework_output" "$xcframework_root"