#include "attachment.h"
#include "note.h"
+#include "store.h"
#include <cx/printf.h>
#include <cx/buffer.h>
attachment->bin_content = data;
}
-void attachment_save(UiObject *obj, Attachment *attachment) {
-
+/*
+ * saves the attachment
+ *
+ * If cleanup_content is true, attachment->bin_content is set to NULL
+ */
+void attachment_save(UiObject *obj, Attachment *attachment, bool cleanup_content) {
+ if(!attachment->saved || !attachment->content_saved) {
+ cxmutstr content;
+ if(cleanup_content) {
+ // bin_content can be moved to note_store_save_attachment_async
+ content = attachment->bin_content;
+ attachment->bin_content = (cxmutstr){NULL, 0};
+ } else {
+ content = attachment->bin_content.ptr ? cx_strdup(cx_strcast(attachment->bin_content)) : (cxmutstr){NULL, 0};
+ }
+ note_store_save_attachment_async(obj, attachment, NULL, NULL);
+ }
}
#define SQL_NOTE_DELETE "delete from resources where resource_id = ? ;"
+#define SQL_ATTACHMENT_RESOURCE_NEW "insert into resources(parent_id, name, lastmodified, creationdate, bin_content) values ((select parent_id from resources where resource_id = ?), ?, datetime(), datetime(), ?) returning resource_id;"
+#define SQL_ATTACHMENT_NEW "insert into attachments(attachment_resource_id, parent_resource_id, type) values (?, ?, ?) returning attachment_id;"
+
static DBUConnection *connection;
static UiThreadpool *queue;
return 0;
}
-static void uithr_save_delete_finished(UiEvent *event, DeleteNoteJob *job) {
+static void uithr_delete_finished(UiEvent *event, DeleteNoteJob *job) {
if(job->resultcb) {
job->resultcb(event, job->error, job->userdata);
}
job->resultcb = resultcb;
job->userdata = userdata;
job->error = 0;
- ui_threadpool_job(queue, obj, (ui_threadfunc)qthr_delete_note, job, (ui_callback)uithr_save_delete_finished, job);
+ ui_threadpool_job(queue, obj, (ui_threadfunc)qthr_delete_note, job, (ui_callback)uithr_delete_finished, job);
+}
+
+
+typedef struct SaveAttachmentJob {
+ int64_t resource_id;
+ int64_t attachment_id;
+ cxmutstr content;
+ int type;
+ char *name;
+ execresult_func resultcb;
+ void *userdata;
+ int error;
+} SaveAttachmentJob;
+
+static int qthr_save_attachment(SaveAttachmentJob *job) {
+ if(job->attachment_id == 0) {
+ DBUQuery *q = connection->createQuery(connection, NULL);
+ dbuQuerySetSQL(q, SQL_ATTACHMENT_RESOURCE_NEW);
+ dbuQuerySetParamInt64(q, 1, job->resource_id);
+ dbuQuerySetParamString(q, 2, cx_str(job->name));
+ dbuQuerySetParamBytes(q, 3, job->content.ptr, job->content.length);
+ if(dbuQueryExec(q)) {
+ job->error = 1;
+ } else {
+ DBUResult *result = dbuQueryGetResult(q);
+ int64_t resource_id;
+ if(dbuResultAsInt64(result, &resource_id)) {
+ job->error = 2;
+ } else {
+ dbuQueryFree(q);
+ q = connection->createQuery(connection, NULL);
+ dbuQuerySetSQL(q, SQL_ATTACHMENT_NEW);
+ dbuQuerySetParamInt64(q, 1, job->resource_id);
+ dbuQuerySetParamInt64(q, 1, job->resource_id);
+ dbuQuerySetParamInt64(q, 1, job->type);
+ dbuQuerySetParamBytes(q, 3, job->content.ptr, job->content.length);
+ if(dbuQueryExec(q)) {
+ job->error = 3;
+ } else {
+ DBUResult *result = dbuQueryGetResult(q);
+ int64_t attachment_id;
+ if(dbuResultAsInt64(result, &attachment_id)) {
+ job->error = 4;
+ }
+ }
+ }
+ }
+ dbuQueryFree(q);
+ } else {
+ // TODO
+ }
+
+ return 0;
+}
+
+static void uithr_save_attachment_finished(UiEvent *event, SaveAttachmentJob *job) {
+ if(job->resultcb) {
+ job->resultcb(event, job->error, job->userdata);
+ }
+
+ free(job->content.ptr);
+ free(job->name);
+ free(job);
+}
+
+void note_store_save_attachment_async(UiObject *obj, Attachment *attachment, execresult_func resultcb, void *userdata) {
+ SaveAttachmentJob *job = malloc(sizeof(SaveAttachmentJob));
+ job->resource_id = attachment->parent_resource_id;
+ job->attachment_id = attachment->attachment_id;
+ job->type = attachment->type;
+ job->name = strdup(attachment->name);
+ job->content = attachment->bin_content.ptr ? cx_strdup(cx_strcast(attachment->bin_content)) : (cxmutstr){NULL, 0};
+ job->resultcb = resultcb;
+ job->userdata = userdata;
+ ui_threadpool_job(queue, obj, (ui_threadfunc)qthr_save_attachment, job, (ui_callback)uithr_save_attachment_finished, job);
}