summaryrefslogtreecommitdiff
path: root/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'db.c')
-rw-r--r--db.c160
1 files changed, 93 insertions, 67 deletions
diff --git a/db.c b/db.c
index 746ad3e8..5730e2df 100644
--- a/db.c
+++ b/db.c
@@ -325,7 +325,7 @@ int db_rollback_savepoint_transaction(const char* name)
return DM_SUCCESS;
}
-int db_get_physmessage_id(u64_t message_idnr, u64_t * physmessage_id)
+int db_get_physmessage_id(u64_t mailbox_idnr, u64_t message_idnr, u64_t * physmessage_id)
{
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
@@ -335,7 +335,7 @@ int db_get_physmessage_id(u64_t message_idnr, u64_t * physmessage_id)
snprintf(query, DEF_QUERYSIZE,
"SELECT physmessage_id FROM %smessages "
- "WHERE message_idnr = %" U64_T_FORMAT, DBPFX, message_idnr);
+ "WHERE mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT, DBPFX, mailbox_idnr, message_idnr);
if (db_query(query) == -1) {
TRACE(TRACE_ERROR, "error getting physmessage_id");
@@ -1060,6 +1060,7 @@ int db_get_reply_body(u64_t user_idnr, char **reply_body)
return DM_SUCCESS;
}
+/* Cannot really have this w/ per-mailbox uids.... */
u64_t db_get_mailbox_from_message(u64_t message_idnr)
{
u64_t mailbox_idnr;
@@ -1087,7 +1088,7 @@ u64_t db_get_mailbox_from_message(u64_t message_idnr)
return mailbox_idnr;
}
-u64_t db_get_useridnr(u64_t message_idnr)
+u64_t db_get_useridnr(u64_t mailbox_idnr, u64_t message_idnr)
{
const char *query_result;
u64_t user_idnr;
@@ -1098,8 +1099,9 @@ u64_t db_get_useridnr(u64_t message_idnr)
snprintf(query, DEF_QUERYSIZE,
"SELECT %smailboxes.owner_idnr FROM %smailboxes, %smessages "
"WHERE %smailboxes.mailbox_idnr = %smessages.mailbox_idnr "
+ "AND %smessages.mailbox_idnr = %" U64_T_FORMAT " "
"AND %smessages.message_idnr = %" U64_T_FORMAT, DBPFX,DBPFX,DBPFX,
- DBPFX,DBPFX,DBPFX,message_idnr);
+ DBPFX,DBPFX,DBPFX,mailbox_idnr,DBPFX,message_idnr);
if (db_query(query) == -1) {
/* query failed */
TRACE(TRACE_ERROR, "query failed" );
@@ -1133,12 +1135,14 @@ int db_insert_physmessage_with_internal_date(timestring_t internal_date,
to_date_str = char2date_str(internal_date);
snprintf(query, DEF_QUERYSIZE,
"INSERT INTO %sphysmessage (messagesize, internal_date) "
- "VALUES (0, %s)", DBPFX,to_date_str);
+ "VALUES (0, %s) %s", DBPFX,to_date_str,
+ db_returning("id"));
g_free(to_date_str);
} else {
snprintf(query, DEF_QUERYSIZE,
"INSERT INTO %sphysmessage (messagesize, internal_date) "
- "VALUES (0, %s)", DBPFX,db_get_sql(SQL_CURRENT_TIMESTAMP));
+ "VALUES (0, %s) %s", DBPFX,db_get_sql(SQL_CURRENT_TIMESTAMP),
+ db_returning("id"));
}
if (db_query(query) == -1) {
@@ -1155,7 +1159,7 @@ int db_insert_physmessage(u64_t * physmessage_id)
return db_insert_physmessage_with_internal_date(NULL, physmessage_id);
}
-int db_message_set_unique_id(u64_t message_idnr, const char *unique_id)
+int db_message_set_unique_id(u64_t mailbox_idnr, u64_t message_idnr, const char *unique_id)
{
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
@@ -1164,11 +1168,11 @@ int db_message_set_unique_id(u64_t message_idnr, const char *unique_id)
snprintf(query, DEF_QUERYSIZE,
"UPDATE %smessages SET unique_id = '%s', status = %d "
- "WHERE message_idnr = %" U64_T_FORMAT, DBPFX, unique_id, MESSAGE_STATUS_NEW,
- message_idnr);
+ "WHERE mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT, DBPFX,
+ unique_id, MESSAGE_STATUS_NEW, mailbox_idnr, message_idnr);
if (db_query(query) == DM_EQUERY) {
- TRACE(TRACE_ERROR, "setting unique id for message [%" U64_T_FORMAT "] failed",
- message_idnr);
+ TRACE(TRACE_ERROR, "setting unique id for mailbox [%" U64_T_FORMAT "] message [%" U64_T_FORMAT "] failed",
+ mailbox_idnr, message_idnr);
return DM_EQUERY;
}
return DM_SUCCESS;
@@ -1194,27 +1198,27 @@ int db_physmessage_set_sizes(u64_t physmessage_id, u64_t message_size,
return DM_SUCCESS;
}
-int db_update_message(u64_t message_idnr, const char *unique_id,
+int db_update_message(u64_t mailbox_idnr, u64_t message_idnr, const char *unique_id,
u64_t message_size, u64_t rfc_size)
{
assert(unique_id);
u64_t physmessage_id = 0;
- if (db_message_set_unique_id(message_idnr, unique_id))
+ if (db_message_set_unique_id(mailbox_idnr, message_idnr, unique_id))
return DM_EQUERY;
/* update the fields in the physmessage table */
- if (db_get_physmessage_id(message_idnr, &physmessage_id))
+ if (db_get_physmessage_id(mailbox_idnr, message_idnr, &physmessage_id))
return DM_EQUERY;
if (db_physmessage_set_sizes(physmessage_id, message_size, rfc_size))
return DM_EQUERY;
- if (user_quotum_inc(db_get_useridnr(message_idnr), message_size)) {
+ if (user_quotum_inc(db_get_useridnr(mailbox_idnr, message_idnr), message_size)) {
TRACE(TRACE_ERROR, "error calculating quotum "
"used for user [%" U64_T_FORMAT "]. Database might be "
"inconsistent. Run dbmail-util.",
- db_get_useridnr(message_idnr));
+ db_get_useridnr(mailbox_idnr, message_idnr));
return DM_EQUERY;
}
return DM_SUCCESS;
@@ -1255,8 +1259,8 @@ int db_insert_message_block_physmessage(const char *block,
/* escape & add data */
esclen = db_escape_binary(&escaped_query[startlen], block, block_size);
snprintf(&escaped_query[esclen + startlen],
- maxesclen - esclen - startlen, "', %" U64_T_FORMAT ", %" U64_T_FORMAT ")",
- block_size, physmessage_id);
+ maxesclen - esclen - startlen, "', %" U64_T_FORMAT ", %" U64_T_FORMAT ") %s",
+ block_size, physmessage_id, db_returning("messageblk_idnr"));
if (db_query(escaped_query) == DM_EQUERY) {
g_free(escaped_query);
@@ -1271,7 +1275,7 @@ int db_insert_message_block_physmessage(const char *block,
}
int db_insert_message_block(const char *block, u64_t block_size,
- u64_t message_idnr, u64_t *physmessage_id, u64_t * messageblk_idnr, unsigned is_header)
+ u64_t mailbox_idnr, u64_t message_idnr, u64_t *physmessage_id, u64_t * messageblk_idnr, unsigned is_header)
{
assert(messageblk_idnr != NULL);
*messageblk_idnr = 0;
@@ -1280,7 +1284,7 @@ int db_insert_message_block(const char *block, u64_t block_size,
return DM_EQUERY;
}
- if ((! *physmessage_id) && (db_get_physmessage_id(message_idnr, physmessage_id) == DM_EQUERY)) {
+ if ((! *physmessage_id) && (db_get_physmessage_id(mailbox_idnr, message_idnr, physmessage_id) == DM_EQUERY)) {
TRACE(TRACE_ERROR, "error getting physmessage_id");
return DM_EQUERY;
}
@@ -1600,7 +1604,7 @@ int db_icheck_physmessages(gboolean cleanup)
int db_icheck_messages(struct dm_list *lost_list)
{
- u64_t message_idnr;
+ static box_uid_t box_uid = { .mailbox = 0, .uid = 0 };
int i, n;
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
@@ -1609,7 +1613,7 @@ int db_icheck_messages(struct dm_list *lost_list)
dm_list_init(lost_list);
snprintf(query, DEF_QUERYSIZE,
- "SELECT msg.message_idnr FROM %smessages msg "
+ "SELECT msg.mailbox_idnr, msg.message_idnr FROM %smessages msg "
"LEFT JOIN %smailboxes mbx ON "
"msg.mailbox_idnr=mbx.mailbox_idnr "
"WHERE mbx.mailbox_idnr IS NULL",DBPFX,DBPFX);
@@ -1627,11 +1631,14 @@ int db_icheck_messages(struct dm_list *lost_list)
}
for (i = 0; i < n; i++) {
- if (!(message_idnr = db_get_result_u64(i, 0)))
+ if (!(box_uid.mailbox = db_get_result_u64(i, 0)))
continue;
- TRACE(TRACE_INFO, "found lost message id [%" U64_T_FORMAT "]", message_idnr);
- if (!dm_list_nodeadd(lost_list, &message_idnr, sizeof(u64_t))) {
+ if (!(box_uid.uid = db_get_result_u64(i, 1)))
+ continue;
+
+ TRACE(TRACE_INFO, "found lost message id [%" U64_T_FORMAT "/%" U64_T_FORMAT "]", box_uid.mailbox, box_uid.uid);
+ if (!dm_list_nodeadd(lost_list, &box_uid, sizeof(box_uid_t))) {
TRACE(TRACE_ERROR, "could not add message to list");
dm_list_free(&lost_list->start);
db_free_result();
@@ -1734,7 +1741,7 @@ int db_icheck_null_physmessages(struct dm_list *lost_list)
int db_icheck_null_messages(struct dm_list *lost_list)
{
- u64_t message_idnr;
+ static box_uid_t box_uid = { .mailbox = 0, .uid = 0 };
int i, n;
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
@@ -1743,7 +1750,7 @@ int db_icheck_null_messages(struct dm_list *lost_list)
dm_list_init(lost_list);
snprintf(query, DEF_QUERYSIZE,
- "SELECT msg.message_idnr FROM %smessages msg "
+ "SELECT msg.mailbox_idnr, msg.message_idnr FROM %smessages msg "
"LEFT JOIN %sphysmessage pm ON "
"msg.physmessage_id = pm.id WHERE pm.id is NULL",DBPFX,DBPFX);
@@ -1760,11 +1767,14 @@ int db_icheck_null_messages(struct dm_list *lost_list)
}
for (i = 0; i < n; i++) {
- if (!(message_idnr = db_get_result_u64(i, 0)))
+ if (!(box_uid.mailbox = db_get_result_u64(i, 0)))
+ continue;
+
+ if (!(box_uid.uid = db_get_result_u64(i, 1)))
continue;
- TRACE(TRACE_INFO, "found empty message id [%" U64_T_FORMAT "]", message_idnr);
- if (!dm_list_nodeadd(lost_list, &message_idnr, sizeof(u64_t))) {
+ TRACE(TRACE_INFO, "found empty mailbox id [ %" U64_T_FORMAT "] message id [%" U64_T_FORMAT "]", box_uid.mailbox, box_uid.uid);
+ if (!dm_list_nodeadd(lost_list, &box_uid, sizeof(box_uid_t))) {
TRACE(TRACE_ERROR, "could not add message to list");
dm_list_free(&lost_list->start);
db_free_result();
@@ -2046,13 +2056,13 @@ int db_icheck_envelope(GList **lost)
}
-int db_set_message_status(u64_t message_idnr, MessageStatus_t status)
+int db_set_message_status(u64_t mailbox_idnr, u64_t message_idnr, MessageStatus_t status)
{
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
- snprintf(query, DEF_QUERYSIZE, "UPDATE %smessages SET status = %d WHERE message_idnr = %" U64_T_FORMAT,
- DBPFX, status, message_idnr);
+ snprintf(query, DEF_QUERYSIZE, "UPDATE %smessages SET status = %d WHERE mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT,
+ DBPFX, status, mailbox_idnr, message_idnr);
return db_query(query);
}
@@ -2092,7 +2102,7 @@ int db_delete_physmessage(u64_t physmessage_id)
return DM_EGENERAL;
}
-int db_delete_message(u64_t message_idnr)
+int db_delete_message(u64_t mailbox_idnr, u64_t message_idnr)
{
u64_t physmessage_id;
int rows;
@@ -2100,25 +2110,25 @@ int db_delete_message(u64_t message_idnr)
memset(query,0,DEF_QUERYSIZE);
- if (db_get_physmessage_id(message_idnr, &physmessage_id) == DM_EQUERY)
+ if (db_get_physmessage_id(mailbox_idnr, message_idnr, &physmessage_id) == DM_EQUERY)
return DM_EQUERY;
/* now delete the message from the message table */
snprintf(query, DEF_QUERYSIZE, "DELETE FROM %smessages "
- "WHERE message_idnr = %" U64_T_FORMAT,
- DBPFX, message_idnr);
+ "WHERE mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT,
+ DBPFX, mailbox_idnr, message_idnr);
if (db_query(query) == DM_EQUERY) {
- TRACE(TRACE_ERROR,"error deleting message [%" U64_T_FORMAT "]", message_idnr);
+ TRACE(TRACE_ERROR,"error deleting mailbox [%" U64_T_FORMAT "] message [%" U64_T_FORMAT "]", mailbox_idnr, message_idnr);
return DM_EQUERY;
}
/* find other messages pointing to the same physmessage entry */
- snprintf(query, DEF_QUERYSIZE, "SELECT message_idnr FROM %smessages "
+ snprintf(query, DEF_QUERYSIZE, "SELECT mailbox_idnr, message_idnr FROM %smessages "
"WHERE physmessage_id = %" U64_T_FORMAT,DBPFX, physmessage_id);
if (db_query(query) == -1) {
- TRACE(TRACE_ERROR, "error finding physmessage for message [%" U64_T_FORMAT "]", message_idnr);
+ TRACE(TRACE_ERROR, "error finding physmessage for mailbox [%" U64_T_FORMAT "] message [%" U64_T_FORMAT "]", mailbox_idnr, message_idnr);
return DM_EQUERY;
}
@@ -2183,7 +2193,7 @@ static int mailbox_empty(u64_t mailbox_idnr)
db_free_result();
/* delete every message in the mailbox */
for (i = 0; i < n; i++) {
- if (db_delete_message(message_idnrs[i]) == -1) {
+ if (db_delete_message(mailbox_idnr, message_idnrs[i]) == -1) {
g_free(message_idnrs);
return DM_EQUERY;
}
@@ -2243,7 +2253,7 @@ int db_delete_mailbox(u64_t mailbox_idnr, int only_empty,
return DM_SUCCESS;
}
-int db_send_message_lines(void *fstream, u64_t message_idnr, long lines, int no_end_dot)
+int db_send_message_lines(void *fstream, u64_t mailbox_idnr, u64_t message_idnr, long lines, int no_end_dot)
{
struct DbmailMessage *msg;
@@ -2256,7 +2266,7 @@ int db_send_message_lines(void *fstream, u64_t message_idnr, long lines, int no_
TRACE(TRACE_DEBUG, "request for [%ld] lines", lines);
/* first find the physmessage_id */
- if (db_get_physmessage_id(message_idnr, &physmessage_id) != DM_SUCCESS)
+ if (db_get_physmessage_id(mailbox_idnr, message_idnr, &physmessage_id) != DM_SUCCESS)
return DM_EGENERAL;
TRACE(TRACE_DEBUG, "sending [%ld] lines from message [%" U64_T_FORMAT "]",
@@ -2320,6 +2330,8 @@ int db_createsession(u64_t user_idnr, PopSession_t * session_ptr)
g_return_val_if_fail(mailbox_idnr > 0, DM_EQUERY);
+ session_ptr->mailbox_idnr = mailbox_idnr;
+
/* query is < MESSAGE_STATUS_DELETE because we don't want deleted
* messages
*/
@@ -2420,14 +2432,19 @@ int db_update_pop(PopSession_t * session_ptr)
user_idnr =
db_get_useridnr(((struct message *)
tmpelement->data)->
+ mailbox,
+ ((struct message *)
+ tmpelement->data)->
realmessageid);
/* yes they need an update, do the query */
snprintf(query, DEF_QUERYSIZE,
"UPDATE %smessages set status=%d WHERE "
- "message_idnr=%" U64_T_FORMAT " AND status < %d",DBPFX,
+ "mailbox_idnr=%" U64_T_FORMAT " AND message_idnr=%" U64_T_FORMAT " AND status < %d",DBPFX,
((struct message *)
tmpelement->data)->virtual_messagestatus,
+ ((struct message *)
+ tmpelement->data)->mailbox,
((struct message *) tmpelement->data)->
realmessageid, MESSAGE_STATUS_DELETE);
@@ -2497,6 +2514,7 @@ int db_deleted_purge(u64_t * affected_rows)
char query[DEF_QUERYSIZE];
memset(query,0,DEF_QUERYSIZE);
+ u64_t *mailbox_idnrs;
u64_t *message_idnrs;
assert(affected_rows != NULL);
@@ -2504,12 +2522,12 @@ int db_deleted_purge(u64_t * affected_rows)
/* first we're deleting all the messageblks */
snprintf(query, DEF_QUERYSIZE,
- "SELECT message_idnr FROM %smessages WHERE status=%d",DBPFX,
+ "SELECT mailbox_idnr, message_idnr FROM %smessages WHERE status=%d",DBPFX,
MESSAGE_STATUS_PURGE);
TRACE(TRACE_DEBUG, "executing query [%s]", query);
if (db_query(query) == -1) {
- TRACE(TRACE_ERROR, "Cound not fetch message ID numbers");
+ TRACE(TRACE_ERROR, "Cound not fetch mailbox/message ID number tuples");
return DM_EQUERY;
}
@@ -2520,21 +2538,26 @@ int db_deleted_purge(u64_t * affected_rows)
return DM_SUCCESS;
}
+ mailbox_idnrs = g_new0(u64_t, *affected_rows);
message_idnrs = g_new0(u64_t, *affected_rows);
/* delete each message */
- for (i = 0; i < *affected_rows; i++)
- message_idnrs[i] = db_get_result_u64(i, 0);
-
+ for (i = 0; i < *affected_rows; i++) {
+ mailbox_idnrs[i] = db_get_result_u64(i, 0);
+ message_idnrs[i] = db_get_result_u64(i, 1);
+ }
+
db_free_result();
for (i = 0; i < *affected_rows; i++) {
- if (db_delete_message(message_idnrs[i]) == -1) {
- TRACE(TRACE_ERROR, "error deleting message");
+ if (db_delete_message(mailbox_idnrs[i], message_idnrs[i]) == -1) {
+ TRACE(TRACE_ERROR, "error deleting mailbox [%" U64_T_FORMAT "] message [%" U64_T_FORMAT "]",
+ mailbox_idnrs[i], message_idnrs[i]);
g_free(message_idnrs);
return DM_EQUERY;
}
}
g_free(message_idnrs);
+ g_free(mailbox_idnrs);
return DM_EGENERAL;
}
@@ -2593,8 +2616,8 @@ int db_imap_append_msg(const char *msgdata, u64_t datalen UNUSED,
}
dbmail_message_store(message);
- result = db_copymsg(message->id, mailbox_idnr, user_idnr, msg_idnr);
- db_delete_message(message->id);
+ result = db_copymsg(message->mailbox, message->id, mailbox_idnr, user_idnr, msg_idnr);
+ db_delete_message(mailbox_idnr, message->id);
dbmail_message_free(message);
switch (result) {
@@ -2615,7 +2638,7 @@ int db_imap_append_msg(const char *msgdata, u64_t datalen UNUSED,
TRACE(TRACE_MESSAGE, "message id=%" U64_T_FORMAT " is inserted", *msg_idnr);
- return db_set_message_status(*msg_idnr, MESSAGE_STATUS_SEEN);
+ return db_set_message_status(mailbox_idnr, *msg_idnr, MESSAGE_STATUS_SEEN);
}
int db_findmailbox(const char *fq_name, u64_t owner_idnr, u64_t * mailbox_idnr)
@@ -3404,8 +3427,9 @@ int db_createmailbox(const char * name, u64_t owner_idnr, u64_t * mailbox_idnr)
"INSERT INTO %smailboxes (name, owner_idnr,"
"seen_flag, answered_flag, deleted_flag, flagged_flag, "
"recent_flag, draft_flag, permission)"
- " VALUES ('%s', %" U64_T_FORMAT ", 1, 1, 1, 1, 1, 1, %d)",DBPFX,
- escaped_simple_name, owner_idnr, IMAPPERM_READWRITE);
+ " VALUES ('%s', %" U64_T_FORMAT ", 1, 1, 1, 1, 1, 1, %d) %s",DBPFX,
+ escaped_simple_name, owner_idnr, IMAPPERM_READWRITE,
+ db_returning("mailbox_idnr"));
g_free(escaped_simple_name);
@@ -3801,7 +3825,7 @@ int db_mailbox_has_message_id(u64_t mailbox_idnr, const char *messageid)
}
-static u64_t message_get_size(u64_t message_idnr)
+static u64_t message_get_size(u64_t mailbox_idnr, u64_t message_idnr)
{
u64_t size = 0;
char query[DEF_QUERYSIZE];
@@ -3811,7 +3835,7 @@ static u64_t message_get_size(u64_t message_idnr)
snprintf(query, DEF_QUERYSIZE,
"SELECT pm.messagesize FROM %sphysmessage pm, %smessages msg "
"WHERE pm.id = msg.physmessage_id "
- "AND message_idnr = %" U64_T_FORMAT,DBPFX,DBPFX, message_idnr);
+ "AND mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT,DBPFX,DBPFX, mailbox_idnr, message_idnr);
if (db_query(query))
return size; /* err */
@@ -3823,8 +3847,8 @@ static u64_t message_get_size(u64_t message_idnr)
return size;
}
-int db_copymsg(u64_t msg_idnr, u64_t mailbox_to, u64_t user_idnr,
- u64_t * newmsg_idnr)
+int db_copymsg(u64_t mailbox_from, u64_t msg_idnr, u64_t mailbox_to,
+ u64_t user_idnr, u64_t * newmsg_idnr)
{
u64_t msgsize;
char unique_id[UID_SIZE];
@@ -3833,9 +3857,9 @@ int db_copymsg(u64_t msg_idnr, u64_t mailbox_to, u64_t user_idnr,
/* Get the size of the message to be copied. */
- if (! (msgsize = message_get_size(msg_idnr))) {
+ if (! (msgsize = message_get_size(mailbox_from, msg_idnr))) {
TRACE(TRACE_ERROR, "error getting message size for "
- "message [%" U64_T_FORMAT "]", msg_idnr);
+ "mailbox [%" U64_T_FORMAT "] message [%" U64_T_FORMAT "]", mailbox_from, msg_idnr);
return DM_EQUERY;
}
@@ -3850,7 +3874,7 @@ int db_copymsg(u64_t msg_idnr, u64_t mailbox_to, u64_t user_idnr,
return -2;
}
- create_unique_id(unique_id, msg_idnr);
+ create_unique_id(unique_id, mailbox_to, msg_idnr);
/* Copy the message table entry of the message. */
snprintf(query, DEF_QUERYSIZE,
@@ -3860,8 +3884,9 @@ int db_copymsg(u64_t msg_idnr, u64_t mailbox_to, u64_t user_idnr,
"SELECT %" U64_T_FORMAT ", "
"physmessage_id, seen_flag, answered_flag, deleted_flag, "
"flagged_flag, recent_flag, draft_flag, '%s', status "
- "FROM %smessages WHERE message_idnr = %" U64_T_FORMAT,DBPFX,
- mailbox_to, unique_id,DBPFX, msg_idnr);
+ "FROM %smessages WHERE mailbox_idnr = %" U64_T_FORMAT " AND message_idnr = %" U64_T_FORMAT " %s",
+ DBPFX, mailbox_to, unique_id, DBPFX, mailbox_from, msg_idnr,
+ db_returning("message_idnr"));
if (db_query(query) == -1) {
TRACE(TRACE_ERROR, "error copying message");
@@ -4914,9 +4939,10 @@ int db_user_create(const char *username, const char *password, const char *encty
snprintf(query, DEF_QUERYSIZE, "INSERT INTO %susers "
"(userid,user_idnr,passwd,client_idnr,maxmail_size,"
"encryption_type, last_login) VALUES "
- "('%s',%" U64_T_FORMAT ",'%s',%" U64_T_FORMAT ",%" U64_T_FORMAT ",'%s', %s)",
+ "('%s',%" U64_T_FORMAT ",'%s',%" U64_T_FORMAT ",%" U64_T_FORMAT ",'%s', %s) %s",
DBPFX,escaped_username,*user_idnr, escaped_password,clientid,
- maxmail, enctype ? enctype : "", db_get_sql(SQL_CURRENT_TIMESTAMP));
+ maxmail, enctype ? enctype : "", db_get_sql(SQL_CURRENT_TIMESTAMP),
+ db_returning("user_idnr"));
}
g_free(escaped_username);
g_free(escaped_password);