From 06497dad750a90226fb589b6cd73dc33813e8fcb Mon Sep 17 00:00:00 2001 From: Marco Bambini Date: Tue, 25 Feb 2025 12:06:06 +0100 Subject: [PATCH] Updated C SDK --- sqlitecloud/src/main/cpp/sqcloud.c | 22 ++++++++++++++++++---- sqlitecloud/src/main/cpp/sqcloud.h | 2 ++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sqlitecloud/src/main/cpp/sqcloud.c b/sqlitecloud/src/main/cpp/sqcloud.c index 63dfa9f..fe6c7d6 100644 --- a/sqlitecloud/src/main/cpp/sqcloud.c +++ b/sqlitecloud/src/main/cpp/sqcloud.c @@ -1531,14 +1531,13 @@ abort_read: { return NULL; } -static bool internal_socket_raw_write (SQCloudConnection *connection, const char *buffer) { +static bool internal_socket_raw_write (SQCloudConnection *connection, const char *buffer, size_t len) { // this function is used only to debug possible security issues int fd = connection->fd; #ifndef SQLITECLOUD_DISABLE_TLS struct tls *tls = connection->tls_context; #endif - size_t len = strlen(buffer); size_t written = 0; while (len > 0) { #ifndef SQLITECLOUD_DISABLE_TLS @@ -2332,7 +2331,7 @@ bool _reserved5 (SQCloudResult *res) { bool _reserved6 (SQCloudConnection *connection, const char *buffer) { internal_clear_error(connection); - return internal_socket_raw_write(connection, buffer); + return internal_socket_raw_write(connection, buffer, strlen(buffer)); } bool _reserved8 (SQCloudConnection *connection, const char *dbname, const char *key, uint64_t snapshotid, bool isinternaldb, void *xdata, int64_t dbsize, int (*xCallback)(void *xdata, void *buffer, uint32_t *blen, int64_t ntot, int64_t nprogress)) { @@ -2407,7 +2406,7 @@ bool _reserved13 (SQCloudConnection *connection, const char *dbname, void *xdata // prepare command to execute char buffer[512]; - snprintf(buffer, sizeof(buffer), "DOWNLOAD DATABASE %s%s", dbname, (ifexists) ? " IF EXISTS" : ""); + snprintf(buffer, sizeof(buffer), "DOWNLOAD DATABASE '%s' %s", dbname, (ifexists) ? "IF EXISTS" : ""); // execute command on server side SQCloudResult *res = SQCloudExec(connection, buffer); @@ -2632,6 +2631,17 @@ SQCloudResult *SQCloudExec (SQCloudConnection *connection, const char *command) return internal_run_command(connection, command, strlen(command), true); } +SQCloudResult *SQCloudExecRaw (SQCloudConnection *connection, const char *command, size_t len) { + internal_clear_error(connection); + + TIME_GET(tstart); + if (!internal_socket_raw_write(connection, command, len)) return NULL; + SQCloudResult *result = internal_socket_read(connection, true); + TIME_GET(tend); + if (result) result->time = TIME_VAL(tstart, tend); + return result; +} + SQCloudResult *SQCloudExecArray (SQCloudConnection *connection, const char *command, const char **values, uint32_t len[], SQCLOUD_VALUE_TYPE types[], uint32_t n) { if (!command) return NULL; if (n == 0) return SQCloudExec(connection, command); @@ -2890,6 +2900,10 @@ float SQCloudResultFloat (SQCloudResult *result) { return (float)strtof(buffer, NULL); } +double SQCloudResultTime (SQCloudResult *result) { + return result->time; +} + void SQCloudResultFree (SQCloudResult *result) { if (!result || (result == &SQCloudResultOK) || (result == &SQCloudResultNULL)) return; diff --git a/sqlitecloud/src/main/cpp/sqcloud.h b/sqlitecloud/src/main/cpp/sqcloud.h index 1328ea1..7624a31 100644 --- a/sqlitecloud/src/main/cpp/sqcloud.h +++ b/sqlitecloud/src/main/cpp/sqcloud.h @@ -172,6 +172,7 @@ typedef enum { SQCloudConnection *SQCloudConnect (const char *hostname, int port, SQCloudConfig *config); SQCloudConnection *SQCloudConnectWithString (const char *s, SQCloudConfig *config); SQCloudResult *SQCloudExec (SQCloudConnection *connection, const char *command); +SQCloudResult *SQCloudExecRaw (SQCloudConnection *connection, const char *command, size_t len); SQCloudConfig *SQCloudGetConfig (SQCloudConnection *connection); const char *SQCloudUUID (SQCloudConnection *connection); void SQCloudDisconnect (SQCloudConnection *connection); @@ -199,6 +200,7 @@ int32_t SQCloudResultInt32 (SQCloudResult *result); int64_t SQCloudResultInt64 (SQCloudResult *result); double SQCloudResultDouble (SQCloudResult *result); float SQCloudResultFloat (SQCloudResult *result); +double SQCloudResultTime (SQCloudResult *result); void SQCloudResultFree (SQCloudResult *result); bool SQCloudResultIsOK (SQCloudResult *result); bool SQCloudResultIsError (SQCloudResult *result);