Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions sqlitecloud/src/main/cpp/sqcloud.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down
2 changes: 2 additions & 0 deletions sqlitecloud/src/main/cpp/sqcloud.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down