// QUESTION: How many affected rows should there be? Couldn't it be much higher if there are several details deleted? int_t contact_delete(uint64_t contactnum, uint64_t usernum, uint64_t foldernum) { int64_t affected; MYSQL_BIND parameters[3]; mm_wipe(parameters, sizeof(parameters)); // Contact Number parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].buffer_length = sizeof(uint64_t); parameters[0].buffer = &contactnum; parameters[0].is_unsigned = true; // User Number parameters[1].buffer_type = MYSQL_TYPE_LONGLONG; parameters[1].buffer_length = sizeof(uint64_t); parameters[1].buffer = &usernum; parameters[1].is_unsigned = true; // Folder parameters[2].buffer_type = MYSQL_TYPE_LONGLONG; parameters[2].buffer_length = sizeof(uint64_t); parameters[2].buffer = &foldernum; parameters[2].is_unsigned = true; // Since the updated column is always updated this function should only return 0 if the query doesn't match any rows, otherwise 1 to indicate success. if ((affected = stmt_exec_affected(stmts.delete_contact, parameters)) == -1) { log_pedantic("The contact entry time stamp update triggered an error. { usernum = %lu / foldernum = %lu / contact = %lu }", usernum, foldernum, contactnum); return -1; } log_check(affected > 2); return (int_t)affected; }
/** * @brief Delete the specified contact detail of a contact entry from the database. * @param contactnum the numerical id of the contact entry to have the specified detail removed. * @param key a managed string containing the name of the contact detail to be removed from the entry. * @return -1 on error, 0 if no matching detail was found in the database, or 1 if the delete operation was successful. */ int_t contact_detail_delete(uint64_t contactnum, stringer_t *key) { int64_t affected; MYSQL_BIND parameters[4]; mm_wipe(parameters, sizeof(parameters)); // Contact Number parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].buffer_length = sizeof(uint64_t); parameters[0].buffer = &contactnum; parameters[0].is_unsigned = true; // Key parameters[1].buffer_type = MYSQL_TYPE_STRING; parameters[1].buffer_length = st_length_get(key); parameters[1].buffer = st_char_get(key); if ((affected = stmt_exec_affected(stmts.delete_contact_details, parameters)) == -1) { log_pedantic("The contact detail deletion request triggered an error. { contact = %lu / key = %.*s }", contactnum, st_length_int(key), st_char_get(key)); return -1; } log_check(affected > 2); return (int_t)affected; }
/** * @brief Delete a user config entry from the database by key. * @param usernum the numerical userid of the user to whom the requested config key belongs. * @param key a managed string containing the name of the config key to be deleted. * @return 1 if the config option was successfully deleted, 0 if the config key couldn't be found in the database, or -1 on general failure. */ int_t user_config_delete(uint64_t usernum, stringer_t *key) { uint64_t affected; MYSQL_BIND parameters[4]; mm_wipe(parameters, sizeof(parameters)); // User Number parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].buffer_length = sizeof(uint64_t); parameters[0].buffer = &usernum; parameters[0].is_unsigned = true; // Key parameters[1].buffer_type = MYSQL_TYPE_STRING; parameters[1].buffer_length = st_length_get(key); parameters[1].buffer = st_char_get(key); if (!(affected = stmt_exec_affected(stmts.delete_user_config, parameters)) == (my_ulonglong)-1) { log_pedantic("The user config deletion request triggered an error. { user = %lu / key = %.*s }", usernum, st_length_int(key), st_char_get(key)); return -1; } log_check(affected > 2); return (int_t)affected; }
/** * @brief Update a user contact entry in the database. * @param contactnum the numerical id of the contact entry to be modified. * @param usernum the numerical id of the user to whom the specified contact entry belongs. * @param cur_folder the numerical id of the parent contact containing the specified contact entry. * @param target_folder if not 0, sets the new parent contact folder to which the specified contact entry will belong. * @param name if not NULL, sets the new name of the specified contact entry. * @return -1 on error, 0 if the specified contact entry was not found in the database, or 1 if the contact entry was successfully updated. */ int_t contact_update(uint64_t contactnum, uint64_t usernum, uint64_t cur_folder, uint64_t target_folder, stringer_t *name) { int64_t affected; MYSQL_BIND parameters[5]; mm_wipe(parameters, sizeof(parameters)); // Destination Folder if (target_folder) { parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].buffer_length = sizeof(uint64_t); parameters[0].buffer = &target_folder; parameters[0].is_unsigned = true; } else { parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].is_null = ISNULL(true); } // Name if (!st_empty(name)) { parameters[1].buffer_type = MYSQL_TYPE_STRING; parameters[1].buffer_length = st_length_get(name); parameters[1].buffer = st_char_get(name); } else { parameters[1].buffer_type = MYSQL_TYPE_LONGLONG; parameters[1].is_null = ISNULL(true); } // Contact Number parameters[2].buffer_type = MYSQL_TYPE_LONGLONG; parameters[2].buffer_length = sizeof(uint64_t); parameters[2].buffer = &contactnum; parameters[2].is_unsigned = true; // User Number parameters[3].buffer_type = MYSQL_TYPE_LONGLONG; parameters[3].buffer_length = sizeof(uint64_t); parameters[3].buffer = &usernum; parameters[3].is_unsigned = true; // Current Folder parameters[4].buffer_type = MYSQL_TYPE_LONGLONG; parameters[4].buffer_length = sizeof(uint64_t); parameters[4].buffer = &cur_folder; parameters[4].is_unsigned = true; // Since the updated column is always updated this function should only return 0 if the query doesn't match any rows, otherwise 1 to indicate success. if ((affected = stmt_exec_affected(stmts.update_contact, parameters)) == -1) { log_pedantic("The contact entry update triggered an error. { usernum = %lu / foldernum = %lu / contact = %lu }", usernum, cur_folder, contactnum); return -1; } log_check(affected > 2); return (int_t)affected; }
/** * @brief Update a specified contact detail in the database, or insert it if it does not exist. * @param contactnum the numerical id of the contact entry to be modified. * @param key a managed string containing the name of the contact detail to be updated. * @param value a managed string containing the new value of the specified contact detail. * @param flags a bitmask of flags to be associated with the specified contact entry detail. * @return -1 on error, 0 if no update was necessary, 1 if a new contact detail was inserted into the database, or 2 if the * specified contact detail was updated successfully. */ int_t contact_detail_upsert(uint64_t contactnum, stringer_t *key, stringer_t *value, uint64_t flags) { int64_t affected; MYSQL_BIND parameters[4]; mm_wipe(parameters, sizeof(parameters)); // Contact Number parameters[0].buffer_type = MYSQL_TYPE_LONGLONG; parameters[0].buffer_length = sizeof(uint64_t); parameters[0].buffer = &contactnum; parameters[0].is_unsigned = true; // Key parameters[1].buffer_type = MYSQL_TYPE_STRING; parameters[1].buffer_length = st_length_get(key); parameters[1].buffer = st_char_get(key); // Value parameters[2].buffer_type = MYSQL_TYPE_STRING; parameters[2].buffer_length = st_length_get(value); parameters[2].buffer = st_char_get(value); // Flags parameters[3].buffer_type = MYSQL_TYPE_LONGLONG; parameters[3].buffer_length = sizeof(uint64_t); parameters[3].buffer = &flags; parameters[3].is_unsigned = true; if ((affected = stmt_exec_affected(stmts.upsert_contact_detail, parameters)) == -1) { log_pedantic("The contact detail upsert triggered an error. { contact = %lu / key = %.*s }", contactnum, st_length_int(key), st_char_get(key)); return -1; } log_check(affected > 2); return (int_t)affected; }