From d802c0023b34db8f178ace10f8e2132663117180 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Thu, 14 Apr 2022 23:47:06 +0000 Subject: [PATCH] Added a database exchange operation, and some context when uploading a file. git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3865 ed5197a5-7fde-0310-b194-c3ffbd925b24 --- core/client.js | 2 +- src/database.js.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/core/client.js b/core/client.js index adf57494..7cf81cfe 100644 --- a/core/client.js +++ b/core/client.js @@ -637,7 +637,7 @@ function message(event) { return response.text(); }).then(function(text) { var iframe = document.getElementById("document"); - iframe.contentWindow.postMessage({'storeBlobComplete': {name: event.data.blob.name, path: text, type: event.data.blob.type}}, '*'); + iframe.contentWindow.postMessage({'storeBlobComplete': {name: event.data.blob.name, path: text, type: event.data.blob.type, context: event.data.context}}, '*'); }); } else { send({event: "message", message: event.data}); diff --git a/src/database.js.c b/src/database.js.c index b309d05f..3d602425 100644 --- a/src/database.js.c +++ b/src/database.js.c @@ -149,7 +149,27 @@ static JSValue _database_exchange(JSContext* context, JSValueConst this_val, int if (database) { sqlite3_stmt* statement; - if (sqlite3_prepare(database->db, "UPDATE properties SET value = $1 WHERE id = $2 AND key = $3 AND value = $4", -1, &statement, NULL) == SQLITE_OK) + if (JS_IsNull(argv[1]) || JS_IsUndefined(argv[1])) + { + if (sqlite3_prepare(database->db, "INSERT INTO properties (id, key, value) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) + { + size_t key_length; + size_t set_length; + const char* key = JS_ToCStringLen(context, &key_length, argv[0]); + const char* set = JS_ToCStringLen(context, &set_length, argv[2]); + if (sqlite3_bind_text(statement, 1, database->id, -1, NULL) == SQLITE_OK && + sqlite3_bind_text(statement, 2, key, key_length, NULL) == SQLITE_OK && + sqlite3_bind_text(statement, 3, set, set_length, NULL) == SQLITE_OK && + sqlite3_step(statement) == SQLITE_DONE) + { + exchanged = sqlite3_changes(database->db) != 0 ? JS_TRUE : JS_FALSE; + } + JS_FreeCString(context, key); + JS_FreeCString(context, set); + sqlite3_finalize(statement); + } + } + else if (sqlite3_prepare(database->db, "UPDATE properties SET value = $1 WHERE id = $2 AND key = $3 AND value = $4", -1, &statement, NULL) == SQLITE_OK) { size_t key_length; size_t expected_length; @@ -166,6 +186,8 @@ static JSValue _database_exchange(JSContext* context, JSValueConst this_val, int exchanged = sqlite3_changes(database->db) != 0 ? JS_TRUE : JS_FALSE; } JS_FreeCString(context, key); + JS_FreeCString(context, expected); + JS_FreeCString(context, set); sqlite3_finalize(statement); } }