diff options
Diffstat (limited to 'db.c')
-rw-r--r-- | db.c | 160 |
1 files changed, 93 insertions, 67 deletions
@@ -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); |