cでSQLを構築するのは骨の折れる作業です。そのようなものを作るにはかなりの時間がかかります。私はglibを初めて使用します。文字列の操作に役立ちます。しかし、クエリ構築コードを短縮するものは見つかりません。こちらのサンプルをご覧ください。
GString *acc_protocol = g_string_new(acc->prpl->name);
GString *acc_handle = g_string_new(acc->user);
GString *acc_password = g_string_new(acc->pass);
GString *acc_tag = g_string_new(acc->tag);
g_string_printf(q, "INSERT INTO accounts (user, protocol, handle, password, autoconnect, tag) values (%ld, ", user_id);
g_string_append(q,"'");
append_mysql_escaped_param(q, buf, acc_protocol);
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_handle);
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_password);
g_string_append(q,"', '");
g_string_append(q, atoi(acc->auto_connect));
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_tag);
g_string_append(q,"') on duplicate key UPDATE password='");
append_mysql_escaped_param(q, buf, acc_password);
g_string_append(q,"', autoconnect='");
g_string_append(q, atoi(acc->auto_connect));
g_string_append(q,"', tag='");
append_mysql_escaped_param(q, buf, acc_tag);
g_string_append(q,"'");
g_string_free(acc_handle);
g_string_free(acc_password);
g_string_free(acc_protocol);
g_string_free(acc_tag);
mysql_real_query(mysql);
num_rows = mysql_affected_rows(mysql);
....
/// .... mysql processing here ...
あなたの便宜のためにここに機能がありますappend_mysql_escaped_param
static void append_mysql_escaped_param(GString *query, GString *buffer, GString *param){
g_string_set_size(buffer, param->len*2+1);
mysql_real_escape_string(mysql, buffer->str, param->str, param->len);
g_string_append(query, buffer->str);
}
どうすれば小さくできますか?ここには冗長なコードが多すぎて、終わりのない頭痛に十分です。それを改善するためのアイデアはありますか?
プリペアドステートメントを使用できることはわかっています。しかし、プリペアドステートメントの値をバインドするときは、そのようなバルクコードも記述する必要があります。エラーが発生しやすい冗長なコードを削除したいだけです。これは特にCに当てはまります。