gtk/plugins/cap/cap.c

changeset 14573
7e18a0a07718
parent 14412
e2a3932dc608
child 14575
09627613e743
--- a/gtk/plugins/cap/cap.c	Sun Sep 10 22:33:28 2006 +0000
+++ b/gtk/plugins/cap/cap.c	Mon Sep 11 00:28:35 2006 +0000
@@ -21,29 +21,6 @@
 
 #include "cap.h"
 
-static char * quote_string(const char *str) {
-	gchar *quoted_str = NULL;
-	quoted_str = g_strdup(str);
-	dbi_driver_quote_string(_driver, &quoted_str);
-	return quoted_str;
-}
-
-static void generate_minute_stats(CapStatistics *statistics) {
-	gchar *buddy_name = quote_string(statistics->buddy->name);
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(statistics->buddy->account));
-	gchar *account_id = quote_string(gaim_account_get_username(statistics->buddy->account));
-	dbi_result result = dbi_conn_queryf(_conn, "select minute_val, success_count, failed_count from cap_msg_count where buddy=%s account=%s and protocol=%s;", buddy_name, account_id, protocol_id);
-
-	while(dbi_result_next_row(result)) {
-		int minute_val = dbi_result_get_int(result, "minute_val");
-		int success_count = dbi_result_get_int(result, "success_count");
-		int failed_count = dbi_result_get_int(result, "failed_count");
-		double ratio = ((double)success_count/(double)(success_count + failed_count));
-		statistics->minute_stats[minute_val] = ratio;
-	}
-	dbi_result_free(result);
-}
-
 static void generate_prediction(CapStatistics *statistics) {
 	if(statistics->buddy) {
 		if(statistics->prediction == NULL)
@@ -56,86 +33,67 @@
 static double generate_prediction_for(GaimBuddy *buddy) {
 	double prediction = 1.0f;
 	gboolean generated = FALSE;
-	gchar *buddy_name = quote_string(buddy->name);
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(buddy->account));
-	gchar *account_id = quote_string(gaim_account_get_username(buddy->account));
-	gchar *status_id = quote_string(gaim_status_get_id(get_status_for(buddy)));
+	gchar *buddy_name = buddy->name;
+	const gchar *protocol_id = gaim_account_get_protocol_id(buddy->account);
+	const gchar *account_id = gaim_account_get_username(buddy->account);
+	const gchar *status_id = gaim_status_get_id(get_status_for(buddy));
 	time_t t = time(NULL);
 	struct tm *current_time = localtime(&t);
 	int current_minute = current_time->tm_min + current_time->tm_hour * 60;
 	int threshold = gaim_prefs_get_int("/plugins/gtk/cap/threshold");
 	int min_minute = (current_minute - threshold) % 1440;
 	int max_minute = (current_minute + threshold) % 1440;
-	dbi_result result;
-
-	result = dbi_conn_queryf(_conn, "select success_count, failed_count from cap_msg_count where buddy=%s and account=%s and protocol=%s and minute_val>=%d and minute_val<=%d;", buddy_name, account_id, protocol_id, min_minute, max_minute);
-	if(result) {
-		int successes = 0;
-		int failures = 0;
-		while(dbi_result_next_row(result)) {
-			if(!dbi_result_field_is_null(result, "success_count"))
-				successes += dbi_result_get_int(result, "success_count");
-
-			if(!dbi_result_field_is_null(result, "failed_count"))
-				failures += dbi_result_get_int(result, "failed_count");
-		}
-		if(failures + successes > 0) {
-			prediction *= ((double)successes/((double)(successes + failures)));
-			generated = TRUE;
-		}
-		dbi_result_free(result);
-	}
+	char *sql;
+	sqlite3_stmt *stmt = NULL;
+	const char *tail = NULL;
+	int rc;
 
 
-/*
- * Note to self: apparently when using a function like sum results in not being able to get
- * the values for fields using libdbi...why? the way I'm doing it above sucks, find a fix.
-	result = dbi_conn_queryf(_conn, "select sum(success_count) as successes, sum(failed_count) as failures from cap_msg_count where buddy=%s and account=%s and protocol=%s and minute_val>=%d and minute_val<=%d;", buddy_name, account_id, protocol_id, min_minute, max_minute);
-	gaim_debug_info("cap", "select sum(success_count) as successes, sum(failed_count) as failures from cap_msg_count where buddy=%s and account=%s and protocol=%s and minute_val>=%d and minute_val<=%d;\n", buddy_name, account_id, protocol_id, min_minute, max_minute);
-
-	if(result) {
-		int failures;
-		int successes;
-		int rc = dbi_result_get_numrows(result);
-		dbi_result_next_row(result);
-		gaim_debug_info("cap", "Result code: %d\n", rc);
-		failures = dbi_result_get_int_idx(result, 1);//"failures");
-		successes = dbi_result_get_int_idx(result, 2); //"successes");
-		gaim_debug_info("cap", "Successes = %d; Failures = %d\n", successes, failures);
-		dbi_result_get_fields(result, "successes.%i failures.%i", &successes, &failures);
-		gaim_debug_info("cap", "Successes = %d; Failures = %d\n", successes, failures);
-		if(failures + successes > 0.0)
-			prediction *= ((double)successes/((double)(successes + failures)));
-		gaim_debug_info("cap", "After message value prediction is %0.4f.\n", prediction);
-		dbi_result_free(result);
-	}
-*/	
-	
-	result = dbi_conn_queryf(_conn, "select success_count, failed_count from cap_status_count where buddy=%s and account=%s and protocol=%s and status=%s;", buddy_name, account_id, protocol_id, status_id);
-	if(result) {
+	sql = sqlite3_mprintf("select sum(success_count) as successes, sum(failed_count) as failures "
+		"from cap_msg_count where "
+		"buddy=%Q and account=%Q and protocol=%Q and minute_val>=%d and minute_val<=%d;",
+		buddy_name,	account_id,	protocol_id, min_minute, max_minute);
+	rc = sqlite3_prepare(_db, sql, -1, &stmt, &tail);
+	if(rc == SQLITE_OK) {
 		int successes = 0;
 		int failures = 0;
-		
-		dbi_result_next_row(result);
-
-		if(!dbi_result_field_is_null(result, "success_count"))
-			successes = dbi_result_get_int(result, "success_count");
-
-		if(!dbi_result_field_is_null(result, "failed_count"))
-			failures = dbi_result_get_int(result, "failed_count");
+		if(stmt != NULL) {
+			if(sqlite3_step(stmt) == SQLITE_ROW) {
+				successes = sqlite3_column_int(stmt, 0);
+				failures = sqlite3_column_int(stmt, 1);
+				if(failures + successes > 0) {
+					prediction *= ((double)successes/((double)(successes+failures)));
+					generated = TRUE;
+				}
+			}
+			sqlite3_finalize(stmt);
+		}
+	}
+	sqlite3_free(sql);
 
-		if(successes + failures > 0) {
-			prediction *= ((double)successes/(double)(successes + failures));
-			generated = TRUE;
+	sql = sqlite3_mprintf("select sum(success_count) as successes, sum(failed_count) as failures "
+		"from cap_status_count where "
+		"buddy=%Q and account=%Q and protocol=%Q and status=%Q;",
+		buddy_name,	account_id,	protocol_id, status_id);
+	rc = sqlite3_prepare(_db, sql, -1, &stmt, &tail);
+	if(rc == SQLITE_OK) {
+		int successes = 0;
+		int failures = 0;
+		if(stmt != NULL) {
+			if(sqlite3_step(stmt) == SQLITE_ROW) {
+				successes = sqlite3_column_int(stmt, 0);
+				failures = sqlite3_column_int(stmt, 1);
+				if(failures + successes > 0) {
+					prediction *= ((double)successes/((double)(successes+failures)));
+					generated = TRUE;
+				}
+			}
+			sqlite3_finalize(stmt);
 		}
-		dbi_result_free(result);
 	}
+	sqlite3_free(sql);
 
-	free(buddy_name);
-	free(account_id);
-	free(protocol_id);
-	free(status_id);
-
+	
 	if(strcmp(gaim_status_get_id(get_status_for(buddy)), "offline") == 0) {
 		//This is kind of stupid, change it.
 		if(prediction == 1.0f)
@@ -150,12 +108,10 @@
 
 static CapStatistics * get_stats_for(GaimBuddy *buddy) {
 	gchar *buddy_name;
-	gchar *q_buddy_name = quote_string(buddy->name);
 	CapStatistics *stats;
 	buddy_name = g_strdup(buddy->name);
 	stats = g_hash_table_lookup(_buddy_stats, buddy_name);
 	if(!stats) {
-		dbi_result result;
 		stats = g_malloc(sizeof(CapStatistics));
 		stats->last_message = -1;
 		stats->last_message_status_id = NULL;
@@ -163,37 +119,11 @@
 		stats->prediction = NULL;
 		g_hash_table_insert(_buddy_stats, buddy_name, stats);
 		stats->buddy = buddy;
-		/* Setup the last seen online time from database or -1 if no time available. */
-		result = dbi_conn_queryf(_conn,
-			//"select max(event_time) as last_event_time from cap_status where buddy=\'%s\' and status!=\'offline\';",
-			"select event_time from cap_status where buddy=\'%s\' and status!=\'offline\' order by event_time desc;",
-			q_buddy_name);
-		if(result && dbi_result_get_numrows(result) > 0) {
-			dbi_result_next_row(result);
-			stats->last_seen = dbi_result_get_datetime(result, "event_time");
-		} else {
-			stats->last_seen = -1;
-		}
-		dbi_result_free(result);
-		/* Setup the last messaged time to be a 'useable' value for comparisons. */
-		//result = dbi_conn_queryf(conn, "", );
-		/* Setup the last status id to nothing */
-		// --> Better approach would be to get the last status available in db and use it.
-		result = dbi_conn_queryf(_conn,
-			"select status, max(event_time) from cap_status where buddy=\'%s\' group by status;",
-			buddy->name);
-		if(result && dbi_result_get_numrows(result) > 0) {
-			dbi_result_next_row(result);
-			stats->last_status_id = dbi_result_get_string_copy(result, "status");
-		} else {
-			stats->last_status_id = "";
-		}
-		dbi_result_free(result);
-		//TODO: populate stats from database
+		stats->last_seen = -1;
+		stats->last_status_id = "";
 	} else {
 		g_free(buddy_name);
 	}
-	free(q_buddy_name);
 	generate_prediction(stats);
 	return stats;
 }
@@ -206,43 +136,161 @@
 	g_free(stats);
 }
 
-static gboolean remove_stats_for(GaimBuddy *buddy) {
-	gboolean success = TRUE;
-	//GString *buddy_name = g_string_new(buddy->name);
-	gchar *buddy_name = g_strdup(buddy->name);
-	success = g_hash_table_remove(_buddy_stats, buddy_name);
-	g_free(buddy_name);
-	return success;
-}
+static void
+insert_cap_msg_count_success(const char *buddy_name, const char *account, const char *protocol, int minute) {
+	int rc;
+	sqlite3_stmt *stmt;
+	const char *tail;
+	char *sql_select = sqlite3_mprintf("SELECT * FROM cap_msg_count WHERE "
+		"buddy=%Q AND account=%Q AND protocol=%Q AND minute_val=%d;",
+		buddy_name, account, protocol, minute);
+	char *sql_ins_up = NULL;
+
+	gaim_debug_info("cap", "%s\n", sql_select);
+
+	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
+	
+	rc = sqlite3_step(stmt);
 
-static dbi_result insert_cap_msg_count_success(const char *buddy_name, const char *account, const char *protocol, int minute) {
-	gaim_debug_info("cap", "Insert cap_msg_count success: %s %s %s %d\n", buddy_name, account, protocol, minute);
-	return dbi_conn_queryf(_conn, "insert into cap_msg_count (buddy, account, protocol, minute_val, success_count, failed_count) values (%s, %s, %s, %d, %d, %d) on duplicate key update success_count=success_count+1;", buddy_name, account, protocol, minute, 1, 0);
+	if(rc == SQLITE_DONE) {
+		sql_ins_up = sqlite3_mprintf("INSERT INTO cap_msg_count VALUES (%Q, %Q, %Q, %d, %d, %d);",
+			buddy_name, account, protocol, minute, 1, 0);
+	} else if(rc == SQLITE_ROW) {
+		sql_ins_up = sqlite3_mprintf("UPDATE cap_msg_count SET success_count=success_count+1 WHERE "
+			"buddy=%Q AND account=%Q AND protocol=%Q AND minute_val=%d;",
+			buddy_name, account, protocol, minute);
+	} else {
+		gaim_debug_info("cap", "%d\n", rc);
+		sqlite3_finalize(stmt);
+		sqlite3_free(sql_select);
+		return;
+	}
+
+	sqlite3_finalize(stmt);
+	sqlite3_free(sql_select);
+
+	sqlite3_exec(_db, sql_ins_up, NULL, NULL, NULL);
+	sqlite3_free(sql_ins_up);
 }
 
-static dbi_result insert_cap_status_count_success(const char *buddy_name, const char *account, const char *protocol, const char *status_id) {
-	gaim_debug_info("cap", "Insert cap_status_count success: %s %s %s %s\n", buddy_name, account, protocol, status_id);
-	return dbi_conn_queryf(_conn, "insert into cap_status_count (buddy, account, protocol, status, success_count, failed_count) values(%s, %s, %s, %s, %d, %d) on duplicate key update success_count=success_count+1;", buddy_name, account, protocol, status_id, 1, 0);
+static void
+insert_cap_status_count_success(const char *buddy_name, const char *account, const char *protocol, const char *status_id) {
+	int rc;
+	sqlite3_stmt *stmt;
+	const char *tail;
+	char *sql_select = sqlite3_mprintf("SELECT * FROM cap_status_count WHERE "
+		"buddy=%Q AND account=%Q AND protocol=%Q AND status=%Q;",
+		buddy_name, account, protocol, status_id);
+	char *sql_ins_up = NULL;
+
+	gaim_debug_info("cap", "%s\n", sql_select);
+
+	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
+	
+	rc = sqlite3_step(stmt);
+
+	if(rc == SQLITE_DONE) {
+		sql_ins_up = sqlite3_mprintf("INSERT INTO cap_status_count VALUES (%Q, %Q, %Q, %Q, %d, %d);",
+			buddy_name, account, protocol, status_id, 1, 0);
+	} else if(rc == SQLITE_ROW) {
+		sql_ins_up = sqlite3_mprintf("UPDATE cap_status_count SET success_count=success_count+1 WHERE "
+			"buddy=%Q AND account=%Q AND protocol=%Q AND status=%Q;",
+			buddy_name, account, protocol, status_id);
+	} else {
+		gaim_debug_info("cap", "%d\n", rc);
+		sqlite3_finalize(stmt);
+		sqlite3_free(sql_select);
+		return;
+	}
+
+	sqlite3_finalize(stmt);
+	sqlite3_free(sql_select);
+
+	sqlite3_exec(_db, sql_ins_up, NULL, NULL, NULL);
+	sqlite3_free(sql_ins_up);
 }
 
-static dbi_result insert_cap_msg_count_failed(const char *buddy_name, const char *account, const char *protocol, int minute) {
-	gaim_debug_info("cap", "Insert cap_msg_count failed: %s %s %s %d\n", buddy_name, account, protocol, minute);
-	return dbi_conn_queryf(_conn, "insert into cap_msg_count (buddy, account, protocol, minute_val, success_count, failed_count) values (%s, %s, %s, %d, %d, %d) on duplicate key update failed_count=failed_count+1;", buddy_name, account, protocol, minute, 0, 1);
+static void
+insert_cap_msg_count_failed(const char *buddy_name, const char *account, const char *protocol, int minute) {
+	int rc;
+	sqlite3_stmt *stmt;
+	const char *tail;
+	char *sql_select = sqlite3_mprintf("SELECT * FROM cap_msg_count WHERE "
+		"buddy=%Q AND account=%Q AND protocol=%Q AND minute_val=%d;",
+		buddy_name, account, protocol, minute);
+	char *sql_ins_up = NULL;
+
+	gaim_debug_info("cap", "%s\n", sql_select);
+
+	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
+	
+	rc = sqlite3_step(stmt);
+
+	if(rc == SQLITE_DONE) {
+		sql_ins_up = sqlite3_mprintf("INSERT INTO cap_msg_count VALUES (%Q, %Q, %Q, %d, %d, %d);",
+			buddy_name, account, protocol, minute, 0, 1);
+	} else if(rc == SQLITE_ROW) {
+		sql_ins_up = sqlite3_mprintf("UPDATE cap_msg_count SET failed_count=failed_count+1 WHERE "
+			"buddy=%Q AND account=%Q AND protocol=%Q AND minute_val=%d;",
+			buddy_name, account, protocol, minute);
+	} else {
+		gaim_debug_info("cap", "%d\n", rc);
+		sqlite3_finalize(stmt);
+		sqlite3_free(sql_select);
+		return;
+	}
+
+	sqlite3_finalize(stmt);
+	sqlite3_free(sql_select);
+
+	sqlite3_exec(_db, sql_ins_up, NULL, NULL, NULL);
+	sqlite3_free(sql_ins_up);
 }
 
-static dbi_result insert_cap_status_count_failed(const char *buddy_name, const char *account, const char *protocol, const char *status_id) {
-	gaim_debug_info("cap", "Insert cap_status_count failed: %s %s %s %s\n", buddy_name, account, protocol, status_id);
-	return dbi_conn_queryf(_conn, "insert into cap_status_count (buddy, account, protocol, status, success_count, failed_count) values(%s, %s, %s, %s, %d, %d) on duplicate key update failed_count=failed_count+1;", buddy_name, account, protocol, status_id, 0, 1);
+static void
+insert_cap_status_count_failed(const char *buddy_name, const char *account, const char *protocol, const char *status_id) {
+	int rc;
+	sqlite3_stmt *stmt;
+	const char *tail;
+	char *sql_select = sqlite3_mprintf("SELECT * FROM cap_status_count WHERE "
+		"buddy=%Q AND account=%Q AND protocol=%Q AND status=%Q;",
+		buddy_name, account, protocol, status_id);
+	char *sql_ins_up = NULL;
+
+	gaim_debug_info("cap", "%s\n", sql_select);
+
+	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
+	
+	rc = sqlite3_step(stmt);
+
+	if(rc == SQLITE_DONE) {
+		sql_ins_up = sqlite3_mprintf("INSERT INTO cap_status_count VALUES (%Q, %Q, %Q, %Q, %d, %d);",
+			buddy_name, account, protocol, status_id, 0, 1);
+	} else if(rc == SQLITE_ROW) {
+		sql_ins_up = sqlite3_mprintf("UPDATE cap_status_count SET failed_count=failed_count+1 WHERE "
+			"buddy=%Q AND account=%Q AND protocol=%Q AND status=%Q;",
+			buddy_name, account, protocol, status_id);
+	} else {
+		gaim_debug_info("cap", "%d\n", rc);
+		sqlite3_finalize(stmt);
+		sqlite3_free(sql_select);
+		return;
+	}
+
+	sqlite3_finalize(stmt);
+	sqlite3_free(sql_select);
+
+	sqlite3_exec(_db, sql_ins_up, NULL, NULL, NULL);
+	sqlite3_free(sql_ins_up);
 }
 
 static void insert_cap_success(CapStatistics *stats) {
-	dbi_result result;
-	gchar *buddy_name = quote_string(stats->buddy->name);
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(stats->buddy->account));
-	gchar *account_id = quote_string(gaim_account_get_username(stats->buddy->account));
-	gchar *status_id = (stats->last_message_status_id) ?
-		quote_string(stats->last_message_status_id) :
-		quote_string(gaim_status_get_id(get_status_for(stats->buddy)));
+	gchar *buddy_name = stats->buddy->name;
+	const gchar *protocol_id = gaim_account_get_protocol_id(stats->buddy->account);
+	const gchar *account_id = gaim_account_get_username(stats->buddy->account);
+	const gchar *status_id = (stats->last_message_status_id) ?
+		stats->last_message_status_id :
+		gaim_status_get_id(get_status_for(stats->buddy));
 	struct tm *current_time;
 	int minute;
 	
@@ -254,49 +302,30 @@
 	}
 	minute = current_time->tm_min + current_time->tm_hour * 60;
 
-	result = insert_cap_msg_count_success(buddy_name, account_id, protocol_id, minute);
-	if(result)
-		dbi_result_free(result);
+	insert_cap_msg_count_success(buddy_name, account_id, protocol_id, minute);
 	
-	result = insert_cap_status_count_success(buddy_name, account_id, protocol_id, status_id);
-	if(result)
-		dbi_result_free(result);
+	insert_cap_status_count_success(buddy_name, account_id, protocol_id, status_id);
 
 	stats->last_message = -1;
 	stats->last_message_status_id = NULL;
-
-	free(status_id);
-	free(protocol_id);
-	free(account_id);
-	free(buddy_name);
 }
 
 static void insert_cap_failure(CapStatistics *stats) {
-	dbi_result result;
-	gchar *buddy_name = quote_string(stats->buddy->name);
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(stats->buddy->account));
-	gchar *account_id = quote_string(gaim_account_get_username(stats->buddy->account));
-	gchar *status_id = (stats->last_message_status_id) ?
-		quote_string(stats->last_message_status_id) :
-		quote_string(gaim_status_get_id(get_status_for(stats->buddy)));
+	gchar *buddy_name = stats->buddy->name;
+	const gchar *protocol_id = gaim_account_get_protocol_id(stats->buddy->account);
+	const gchar *account_id = gaim_account_get_username(stats->buddy->account);
+	const gchar *status_id = (stats->last_message_status_id) ?
+		stats->last_message_status_id :
+		gaim_status_get_id(get_status_for(stats->buddy));
 	struct tm *current_time = localtime(&stats->last_message);
 	int minute = current_time->tm_min + current_time->tm_hour * 60;
 
-	result = insert_cap_msg_count_failed(buddy_name, account_id, protocol_id, minute);
-	if(result)
-		dbi_result_free(result);
+	insert_cap_msg_count_failed(buddy_name, account_id, protocol_id, minute);
 	
-	result = insert_cap_status_count_failed(buddy_name, account_id, protocol_id, status_id);
-	if(result)
-		dbi_result_free(result);
+	insert_cap_status_count_failed(buddy_name, account_id, protocol_id, status_id);
 	
 	stats->last_message = -1;
 	stats->last_message_status_id = NULL;
-
-	free(status_id);
-	free(protocol_id);
-	free(account_id);
-	free(buddy_name);
 }
 
 static gboolean max_message_difference_cb(gpointer data) {
@@ -326,10 +355,10 @@
 }
 
 //received-im-msg
-static void received_im_msg(GaimAccount *account, char *sender, char *message,
-		GaimConversation *conv, GaimMessageFlags flags) {
+static void
+received_im_msg(GaimAccount *account, char *sender, char *message, GaimConversation *conv, GaimMessageFlags flags) {
 	GaimBuddy *buddy = gaim_find_buddy(account, sender);
-	guint words = word_count(message);
+	//guint words = word_count(message);
 	CapStatistics *stats = get_stats_for(buddy);
 
 	//insert_word_count(sender, buddy_name, words);
@@ -407,7 +436,8 @@
 		CapStatistics *stats = get_stats_for(buddy);
 		// get the probability that this buddy will respond and add to the tooltip
 		if(stats->prediction->probability >= 0.0) {
-			g_string_append_printf(text, "\n<b>%s</b> %0.4f", _("Response Probability:"), stats->prediction->probability);
+			g_string_append_printf(text, "\n<b>%s</b> %3.0f %%", _("Response Probability:"),
+				100 * stats->prediction->probability);
 		} else {
 			g_string_append_printf(text, "\n<b>%s</b> ???", _("Response Probability:"));
 		}
@@ -421,13 +451,13 @@
 	gchar *my_name = g_strdup(my_gaim_name);
 	time_t *last_offline = g_hash_table_lookup(_my_offline_times, my_name);
 
-	gchar *account_id = quote_string(gaim_account_get_username(account));
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(account));
-	dbi_result result;
+	const gchar *account_id = gaim_account_get_username(account);
+	const gchar *protocol_id = gaim_account_get_protocol_id(account);
+	char *sql;
 
-	result = dbi_conn_queryf(_conn, "insert into cap_my_usage values(%s, %s, %d, now());", account_id, protocol_id, 1);
-	if(result)
-		dbi_result_free(result);
+	sql = sqlite3_mprintf("insert into cap_my_usage values(%Q, %Q, %d, now());", account_id, protocol_id, 1);
+	sqlite3_exec(_db, sql, NULL, NULL, NULL);
+	sqlite3_free(sql);
 
 	if(last_offline) {
 		if(difftime(*last_offline, time(NULL)) > gaim_prefs_get_int("/plugins/gtk/cap/max_seen_difference") * 60) {
@@ -448,39 +478,18 @@
 	const char *my_gaim_name = gaim_account_get_username(account);
 	gchar *my_name = g_strdup(my_gaim_name);
 	time_t *offline_time = g_malloc(sizeof(time_t));
-	gchar *account_id = quote_string(gaim_account_get_username(account));
-	gchar *protocol_id = quote_string(gaim_account_get_protocol_id(account));
-	dbi_result result;
+	const gchar *account_id = gaim_account_get_username(account);
+	const gchar *protocol_id = gaim_account_get_protocol_id(account);
+	char *sql;
 
-	result = dbi_conn_queryf(_conn, "insert into cap_my_usage values(%s, %s, %d, now());", account_id, protocol_id, 0);
-	if(result)
-		dbi_result_free(result);
+	sql = sqlite3_mprintf("insert into cap_my_usage values(%Q, %Q, %d, now());", account_id, protocol_id, 0);
+	sqlite3_exec(_db, sql, NULL, NULL, NULL);
+	sqlite3_free(sql);
 
 	time(offline_time);
 	g_hash_table_insert(_my_offline_times, my_name, offline_time);
 }
 
-static const gchar * get_error_msg() {
-	if(error_msg)
-		return error_msg->str;
-	else
-		return NULL;
-}
-
-static void set_error_msg(const gchar *msg) {
-	if(!error_msg)
-		error_msg = g_string_new(msg);
-	else
-		g_string_assign(error_msg, msg);
-}
-
-static void append_error_msg(const gchar *msg) {
-	if(!error_msg)
-		set_error_msg(msg);
-	else
-		g_string_append(error_msg, msg);
-}
-
 static void reset_all_last_message_times(gpointer key, gpointer value, gpointer user_data) {
 	CapStatistics *stats = value;
 	stats->last_message = -1;
@@ -493,52 +502,89 @@
 }
 
 static void create_tables() {
+	int rc;
+	rc = sqlite3_exec(_db,
+		"CREATE TABLE IF NOT EXISTS cap_status ("
+		"	buddy varchar(60) not null,"
+		"	account varchar(60) not null,"
+		"	protocol varchar(60) not null,"
+		"	status varchar(60) not null,"
+		"	event_time datetime not null,"
+		"	primary key (buddy, account, protocol, event_time)"
+		");",
+		NULL, NULL, NULL);
+
+	rc = sqlite3_exec(_db,
+		"create table if not exists cap_message ("
+		"	sender varchar(60) not null,"
+		"	receiver varchar(60) not null,"
+		"	account varchar(60) not null,"
+		"	protocol varchar(60) not null,"
+		"	word_count integer not null,"
+		"	event_time datetime not null,"
+		"	primary key (sender, account, protocol, receiver, event_time)"
+		");",
+		NULL, NULL, NULL);
+
+	rc = sqlite3_exec(_db,
+		"create table if not exists cap_msg_count ("
+		"	buddy varchar(60) not null,"
+		"	account varchar(60) not null,"
+		"	protocol varchar(60) not null,"
+		"	minute_val int not null,"
+		"	success_count int not null,"
+		"	failed_count int not null,"
+		"	primary key (buddy, account, protocol, minute_val)"
+		");",
+	NULL, NULL, NULL);
+
+	rc = sqlite3_exec(_db,
+		"create table if not exists cap_status_count ("
+		"	buddy varchar(60) not null,"
+		"	account varchar(60) not null,"
+		"	protocol varchar(60) not null,"
+		"	status varchar(60) not null,"
+		"	success_count int not null,"
+		"	failed_count int not null,"
+		"	primary key (buddy, account, protocol, status)"
+		");",
+	NULL, NULL, NULL);
+
+	rc = sqlite3_exec(_db,
+		"create table if not exists cap_my_usage ("
+		"	account varchar(60) not null,"
+		"	protocol varchar(60) not null,"
+		"	online tinyint not null,"
+		"	event_time datetime not null,"
+		"	primary key(account, protocol, online, event_time)"
+		");",
+	NULL, NULL, NULL);
 }
 
 static gboolean create_database_connection() {
+	GString *path;
 	int rc;
-	int driver_type;
 
-	if(_conn)
+	if(_db)
 		return TRUE;
 
 	//make database connection here
-	_conn = dbi_conn_new(gaim_prefs_get_string("/plugins/gtk/cap/db_driver"));
-	if(!_conn)
+	path = g_string_new(gaim_user_dir());
+	g_string_append(path, "/cap.db");
+	rc = sqlite3_open(path->str, &_db);
+	if(rc != SQLITE_OK)
 		return FALSE;
 	
-	_driver = dbi_conn_get_driver(_conn);
-	gaim_debug_info("cap", "Using driver: %s\n", gaim_prefs_get_string("/plugins/gtk/cap/db_driver"));
-	if(strcmp(gaim_prefs_get_string("/plugins/gtk/cap/db_driver"), "mysql") == 0) {
-		driver_type = MYSQL;
-		dbi_conn_set_option(_conn, "host", gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_host"));
-		dbi_conn_set_option(_conn, "username", gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_user"));
-		dbi_conn_set_option(_conn, "password", gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_password"));
-		dbi_conn_set_option(_conn, "dbname", gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_name"));
-		dbi_conn_set_option(_conn, "encoding", "auto");
-		dbi_conn_set_option_numeric(_conn, "port", gaim_prefs_get_int("/plugins/gtk/cap/mysql/db_port"));
-	}
-	if(dbi_conn_connect(_conn) < 0) {
-		const char *err_msg = "";
-		//rc = dbi_conn_error(_conn, &err_msg);
-		rc = dbi_conn_error(_conn, NULL);
-		gaim_debug_error("cap", "CAP could not create database connection. %d\n", rc);
-		//set_error_msg(_("Could not create database connection. Reason: "));
-		//append_error_msg(err_msg);
-		_conn = NULL;
-		return FALSE;
-	} else {
-		//Add tables here
-		create_tables();
-	}
+	//Add tables here
+	create_tables();
 	gaim_debug_info("cap", "Database connection successfully made.\n");
 	return TRUE;
 }
 static void destroy_database_connection() {
-	if(_conn)
-		dbi_conn_close(_conn);
+	if(_db)
+		sqlite3_close(_db);
 
-	_conn = NULL;
+	_db = NULL;
 }
 
 static guint word_count(const gchar *string) {
@@ -551,53 +597,17 @@
 	return count;
 }
 
-/* If the difference in time between the present time and the time that
- * you last sent a message to a buddy is less than some value then return
- * true, otherwise return false.
- * The difference can either be + or - the max_difference.
- * max_difference is in seconds
- */
-static gboolean last_message_time_in_range(CapStatistics *statistics, gdouble max_difference) {
-	time_t now = time(NULL);
-	gdouble difference = 0.0;
-	//If there is no last_message time then it is considered in range
-	if(statistics->last_message == -1) {
-		return TRUE;
-	}
-	//Compute the difference between now and the last_message
-	difference = difftime(statistics->last_message, now);
-	//Absolute value
-	difference = (difference < 0.0) ? -difference : difference;
-	//If the difference is less than the maximum then we are good and its in range, otherwise not
-	if(difference <= max_difference)
-		return TRUE;
-	else
-		return FALSE;
-}
-
-static gboolean last_seen_time_in_range(CapStatistics *statistics, gdouble max_difference) {
-	time_t now = time(NULL);
-	gdouble difference = 0.0;
-	if(statistics->last_seen == -1)
-		return FALSE;
-	difference = difftime(statistics->last_seen, now);
-	difference = (difference < 0.0) ? -difference : difference;
-	if(difference < max_difference)
-		return TRUE;
-	else
-		return FALSE;
-}
-
 static void insert_status_change(CapStatistics *statistics) {
 	insert_status_change_from_gaim_status(statistics, get_status_for(statistics->buddy));
 }
 
 static void insert_status_change_from_gaim_status(CapStatistics *statistics, GaimStatus *status) {
-	dbi_result result;
-	gchar *status_id;
-	gchar *buddy_name;
-	gchar *protocol_id;
-	gchar *account_id;
+	char *sql;
+	int rc;
+	const gchar *status_id;
+	const gchar *buddy_name;
+	const gchar *protocol_id;
+	const gchar *account_id;
 
 	/* It would seem that some protocols receive periodic updates of the buddies status.
 	 * Check to make sure the last status is not the same as current status to prevent
@@ -605,27 +615,18 @@
 	if(strcmp(statistics->last_status_id, gaim_status_get_id(status)) == 0)
 		return;
 
-	status_id = quote_string(gaim_status_get_id(status));
-	buddy_name = quote_string(statistics->buddy->name);
-	protocol_id = quote_string(gaim_account_get_protocol_id(statistics->buddy->account));
-	account_id = quote_string(gaim_account_get_username(statistics->buddy->account));
+	status_id = gaim_status_get_id(status);
+	buddy_name = statistics->buddy->name;
+	protocol_id = gaim_account_get_protocol_id(statistics->buddy->account);
+	account_id = gaim_account_get_username(statistics->buddy->account);
 
 	statistics->last_status_id = gaim_status_get_id(status);
+
 	gaim_debug_info("cap", "Executing: insert into cap_status (buddy, account, protocol, status, event_time) values(%s, %s, %s, %s, now());\n", buddy_name, account_id, protocol_id, status_id);
 
-	result = dbi_conn_queryf(_conn, "insert into cap_status (buddy, account, protocol, status, event_time) values(%s, %s, %s, %s, now());", buddy_name, account_id, protocol_id, status_id);
-	if(result)
-		dbi_result_free(result);
-	else {
-		const char *err = "";
-		dbi_conn_error(_conn, &err);
-		gaim_debug_error("cap", "Could not insert status change event into database. %s\n", err);
-	}
-
-	free(status_id);
-	free(buddy_name);
-	free(protocol_id);
-	free(account_id);
+	sql = sqlite3_mprintf("insert into cap_status values (%Q, %Q, %Q, %Q, now());", buddy_name, account_id, protocol_id, status_id);
+	rc = sqlite3_exec(_db, sql, NULL, NULL, NULL);
+	sqlite3_free(sql);
 }
 
 static void insert_word_count(const char *sender, const char *receiver, guint count) {
@@ -658,24 +659,8 @@
 	 */
 	_my_offline_times = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 
-	if(gaim_prefs_exists("/plugins/gtk/cap/libdbi_drivers"))
-		_num_drivers = dbi_initialize(gaim_prefs_get_string("/plugins/gtk/cap/libdbi_drivers"));
-	else
-		_num_drivers = dbi_initialize(NULL);
-
-	if(_num_drivers == -1) {
-		gaim_debug_error("cap", "Error initializing dbi.\n");
-		gaim_prefs_set_bool("/plugins/gtk/cap/configured", FALSE);
-		_dbi_initialized = FALSE;
-	} else {
-		_dbi_initialized = TRUE;
-	}
-
-
-	if(gaim_prefs_get_bool("/plugins/gtk/cap/configured") && gaim_prefs_get_bool("/plugins/gtk/cap/connected")) {
-		if(create_database_connection()) {
-			add_plugin_functionality(plugin);
-		}
+	if(create_database_connection()) {
+		add_plugin_functionality(plugin);
 	}
 	return TRUE;
 }
@@ -788,71 +773,18 @@
 	}
 	 
 	 //close database connection
-	 dbi_conn_close(_conn);
-	 _conn = NULL;
-	 dbi_shutdown();
+	 destroy_database_connection();
 
 	return TRUE;
 }
 
-static GtkWidget * get_config_frame(GaimPlugin *plugin) {
-	CapPrefsUI *ui = create_cap_prefs_ui();
-
-	/* Since we are editing the database setup we will disable the plugin.
-	 * This will prevent database updates from occuring while there is potentially
-	 * no connection to the database.
-	 */
-	remove_plugin_functionality(_plugin_pointer);
-
-	return ui->ret;
-}
-
-static void cap_prefs_ui_destroy_cb(GtkObject *object, gpointer user_data) {
-	CapPrefsUI *ui = user_data;
-	if(_conn) {
-		add_plugin_functionality(_plugin_pointer);
-	}
-	g_free(ui);
-}
-
 static CapPrefsUI * create_cap_prefs_ui() {
 	CapPrefsUI *ui = g_malloc(sizeof(CapPrefsUI));
 
 	ui->ret = gtk_vbox_new(FALSE, 18);
 	gtk_container_set_border_width(GTK_CONTAINER(ui->ret), 10);
-	ui->db_vbox = gaim_gtk_make_frame(ui->ret, _("Database Configuration"));
 	ui->cap_vbox = gaim_gtk_make_frame(ui->ret, _("Statistics Configuration"));
 
-	/* dbd path input folder selector button */
-	ui->dbd_label = gtk_label_new(_("libdbi driver path:"));
-	gtk_misc_set_alignment(GTK_MISC(ui->dbd_label), 0, 0.5);
-	ui->dbd_input = gtk_file_chooser_button_new(_("libdbi Drivers Path"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
-	ui->dbd_button = gtk_button_new_with_label(_("Verify"));
-	ui->dbd_hbox = gtk_hbox_new(FALSE, 18);
-	gtk_box_pack_start(GTK_BOX(ui->dbd_hbox), ui->dbd_label, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->dbd_hbox), ui->dbd_input, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->dbd_hbox), ui->dbd_button, FALSE, FALSE, 0);
-
-	/* Setup the driver selection widget */
-	ui->driver_choice = gtk_combo_box_new_text();
-	
-	ui->driver_vbox = gtk_vbox_new(FALSE, 18);
-	ui->driver_label = gtk_label_new(_("Driver:"));
-	gtk_misc_set_alignment(GTK_MISC(ui->driver_label), 0, 0.5);
-	ui->driver_select_hbox = gtk_hbox_new(FALSE, 18);
-	ui->driver_connect_button = gtk_toggle_button_new_with_label(_("Connected"));
-
-	gtk_box_pack_start(GTK_BOX(ui->driver_select_hbox), ui->driver_label, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->driver_select_hbox), ui->driver_choice, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->driver_select_hbox), ui->driver_connect_button, FALSE, FALSE, 0);
-
-	ui->driver_config = gtk_expander_new_with_mnemonic(_("Configure"));
-	ui->driver_config_hbox = gtk_hbox_new(FALSE, 18);
-	gtk_box_pack_start(GTK_BOX(ui->driver_config_hbox), ui->driver_config, FALSE, FALSE, 0);
-
-	gtk_box_pack_start(GTK_BOX(ui->driver_vbox), ui->driver_select_hbox, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->driver_vbox), ui->driver_config_hbox, FALSE, FALSE, 0);
-
 	/* msg_difference spinner */
 	ui->msg_difference_label = gtk_label_new(_("Maximum response timeout:"));
 	gtk_misc_set_alignment(GTK_MISC(ui->msg_difference_label), 0, 0.5);
@@ -914,16 +846,11 @@
 
 
 	/* Config window - lay it out */
-	gtk_box_pack_start(GTK_BOX(ui->db_vbox), ui->dbd_hbox, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(ui->db_vbox), ui->driver_vbox, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(ui->cap_vbox), ui->table_layout, FALSE, FALSE, 0);
 
 	/* Set the input areas to contain the configuration values from
 	 * gaim prefs.
 	 */
-	if(gaim_prefs_exists("/plugins/gtk/cap/libdbi_drivers")) {
-		gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(ui->dbd_input), gaim_prefs_get_string("/plugins/gtk/cap/libdbi_drivers"));
-	}
 	if(gaim_prefs_exists("/plugins/gtk/cap/max_msg_difference")) {
 		int max_msg_diff = gaim_prefs_get_int("/plugins/gtk/cap/max_msg_difference");
 		gtk_spin_button_set_value(GTK_SPIN_BUTTON(ui->msg_difference_input),  max_msg_diff);
@@ -941,15 +868,6 @@
 	g_signal_connect(G_OBJECT(ui->ret), "destroy",
 		G_CALLBACK(cap_prefs_ui_destroy_cb), ui);
 
-	g_signal_connect(G_OBJECT(ui->driver_choice), "changed",
-		G_CALLBACK(driver_choice_changed_cb), ui);	
-	
-	g_signal_connect(G_OBJECT(ui->driver_config), "notify::expanded",
-		G_CALLBACK(driver_config_expanded_cb), ui);
-
-	g_signal_connect(G_OBJECT(ui->driver_connect_button), "toggled",
-		G_CALLBACK(connect_toggled_cb), ui);
-
 	g_signal_connect(G_OBJECT(ui->msg_difference_input), "value-changed",
 		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/max_msg_difference");
 	
@@ -959,244 +877,21 @@
 	g_signal_connect(G_OBJECT(ui->threshold_input), "value-changed",
 		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/threshold");
 	
-	g_signal_connect(G_OBJECT(ui->dbd_button), "clicked",
-		G_CALLBACK(driver_location_verify_cb), ui);
-	
-	/* libdbi was not successfully initialized so disable the driver selection.
-	 * Also disable the configuration for the database.
-	 */
-	if(!_dbi_initialized || _num_drivers <= 0) {
-		/* Since DBI is not available disable database configuration */
-		gtk_widget_set_sensitive(ui->driver_choice, FALSE);
-		gtk_widget_set_sensitive(ui->driver_config, FALSE);
-		gtk_widget_set_sensitive(ui->driver_connect_button, FALSE);
-	} else {
-		set_driver_choice_options(GTK_COMBO_BOX(ui->driver_choice));
-	}
-	
-	if(_conn) {
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->driver_connect_button), TRUE);
-		gtk_widget_set_sensitive(ui->driver_choice, FALSE);
-		gtk_widget_set_sensitive(ui->driver_config, FALSE);
-	} else {
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->driver_connect_button), FALSE);
-	}
-
 	return ui;
 }
 
-static void driver_choice_changed_cb(GtkComboBox *widget, gpointer user_data) {
+static void cap_prefs_ui_destroy_cb(GtkObject *object, gpointer user_data) {
 	CapPrefsUI *ui = user_data;
-	if(strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(ui->driver_choice)), "mysql") == 0) {
-		gtk_widget_set_sensitive(ui->driver_config, TRUE);
-		gtk_widget_set_sensitive(ui->driver_connect_button, TRUE);
-	} else {
-		gtk_widget_set_sensitive(ui->driver_config, FALSE);
-		gtk_widget_set_sensitive(ui->driver_connect_button, FALSE);
-	}
-}
-
-static void driver_config_expanded_cb(GObject *object, GParamSpec *param_spec, gpointer user_data) {
-	CapPrefsUI *ui = user_data;
-	GtkExpander *expander;
-	gchar *driver = gtk_combo_box_get_active_text(GTK_COMBO_BOX(ui->driver_choice));
-	expander = GTK_EXPANDER(object);
-	if(gtk_expander_get_expanded(expander)) {
-		if(strcmp(driver, "mysql") == 0) {
-			gtk_container_add(GTK_CONTAINER(expander), get_mysql_config());
-		}
-	} else {
-		gtk_container_remove(GTK_CONTAINER(expander), gtk_bin_get_child(GTK_BIN(expander)));
+	if(_db) {
+		add_plugin_functionality(_plugin_pointer);
 	}
-}
-
-static void connect_toggled_cb(GtkToggleButton *togglebutton, gpointer user_data) {
-	CapPrefsUI *ui = user_data;
-	if(gtk_toggle_button_get_active(togglebutton)) {
-		//connect
-		if(create_database_connection()) {
-			gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_choice), FALSE);
-			gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_config), FALSE);
-			gtk_widget_set_sensitive(GTK_WIDGET(ui->dbd_input), FALSE);
-			gtk_widget_set_sensitive(GTK_WIDGET(ui->dbd_button), FALSE);
-			gaim_prefs_set_bool("/plugins/gtk/cap/connected", TRUE);
-		} else {
-			gtk_toggle_button_set_active(togglebutton, FALSE);
-		}
-	} else {
-		//disconnect
-		destroy_database_connection();
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_choice), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_config), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->dbd_input), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->dbd_button), TRUE);
-		gaim_prefs_set_bool("/plugins/gtk/cap/connected", FALSE);
-	}
+	g_free(ui);
 }
 
 static void numeric_spinner_prefs_cb(GtkSpinButton *spinbutton, gpointer user_data) {
 	gaim_prefs_set_int(user_data, gtk_spin_button_get_value_as_int(spinbutton));
 }
 
-static void driver_location_verify_cb(GtkButton *button, gpointer user_data) {
-	CapPrefsUI *ui = user_data;
-	gchar *path = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(ui->dbd_input));
-	
-	if(_dbi_initialized)
-		dbi_shutdown();
-
-	gaim_prefs_set_string("/plugins/gtk/cap/libdbi_drivers", path);
-	_num_drivers = dbi_initialize(path);
-	if(_num_drivers == -1) {
-		_dbi_initialized = FALSE;
-	} else {
-		_dbi_initialized = TRUE;
-	}
-	if(_num_drivers > 0) {
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_choice), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_config), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_connect_button), TRUE);
-		set_driver_choice_options(GTK_COMBO_BOX(ui->driver_choice));
-	} else {
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_choice), FALSE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_config), FALSE);
-		gtk_expander_set_expanded(GTK_EXPANDER(ui->driver_config), FALSE);
-		gtk_widget_set_sensitive(GTK_WIDGET(ui->driver_connect_button), FALSE);
-	}
-}
-
-static gboolean text_entry_prefs_cb(GtkWidget *widget, GdkEventFocus *event, gpointer user_data) {
-	gaim_prefs_set_string(user_data, gtk_entry_get_text(GTK_ENTRY(widget)));
-	return FALSE;
-}
-
-void set_driver_choice_options(GtkComboBox *chooser) {
-	dbi_driver driver = NULL;
-	GtkListStore *list_store;
-	gint index = 0;
-	gint selected = 0;
-
-	list_store = GTK_LIST_STORE(gtk_combo_box_get_model(chooser));
-	gtk_list_store_clear(list_store);
-
-	if(!_dbi_initialized)
-		return;
-	
-	while((driver = dbi_driver_list(driver)) != NULL) {
-		gtk_combo_box_append_text(chooser, dbi_driver_get_name(driver));
-		if(strcmp(dbi_driver_get_name(driver), gaim_prefs_get_string("/plugins/gtk/cap/db_driver")) == 0) {
-			selected = index;
-		}
-		++index;
-	}
-	gtk_combo_box_set_active(chooser, selected);
-}
-
-static GtkWidget * get_mysql_config() {
-	GtkWidget *config_area = gtk_table_new(5, 2, FALSE);
-	GtkWidget *username_label = gtk_label_new(_("Username:"));
-	GtkWidget *username_input = gtk_entry_new();
-	GtkWidget *password_label = gtk_label_new(_("Password:"));
-	GtkWidget *password_input = gtk_entry_new();
-	GtkWidget *host_label = gtk_label_new(_("Host:"));
-	GtkWidget *host_input = gtk_entry_new();
-	GtkWidget *db_label = gtk_label_new(_("Database:"));
-	GtkWidget *db_input = gtk_entry_new();
-	GtkWidget *port_label = gtk_label_new(_("Port:"));
-	GtkWidget *port_input = gtk_spin_button_new_with_range(0, 10000, 1);
-
-	gtk_entry_set_visibility(GTK_ENTRY(password_input), FALSE);
-
-	gtk_misc_set_alignment(GTK_MISC(username_label), 0, 0.5);
-	gtk_misc_set_padding(GTK_MISC(username_label), 10, 0);
-
-	gtk_misc_set_alignment(GTK_MISC(password_label), 0, 0.5);
-	gtk_misc_set_padding(GTK_MISC(password_label), 10, 0);
-
-	gtk_misc_set_alignment(GTK_MISC(host_label), 0, 0.5);
-	gtk_misc_set_padding(GTK_MISC(host_label), 10, 0);
-
-	gtk_misc_set_alignment(GTK_MISC(db_label), 0, 0.5);
-	gtk_misc_set_padding(GTK_MISC(db_label), 10, 0);
-
-	gtk_misc_set_alignment(GTK_MISC(port_label), 0, 0.5);
-	gtk_misc_set_padding(GTK_MISC(port_label), 10, 0);
-
-	gtk_table_attach(GTK_TABLE(config_area), host_label, 0, 1, 0, 1,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), host_input, 1, 2, 0, 1,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), port_label, 0, 1, 1, 2,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), port_input, 1, 2, 1, 2,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), db_label, 0, 1, 2, 3,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), db_input, 1, 2, 2, 3,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), username_label, 0, 1, 3, 4,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), username_input, 1, 2, 3, 4,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), password_label, 0, 1, 4, 5,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-	gtk_table_attach(GTK_TABLE(config_area), password_input, 1, 2, 4, 5,
-		(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-		(GtkAttachOptions) (0), 0, 0);
-
-	//Initialize with data
-	if(gaim_prefs_exists("/plugins/gtk/cap/mysql/db_host")) {
-		gtk_entry_set_text(GTK_ENTRY(host_input), gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_host"));
-	} else {
-		gtk_entry_set_text(GTK_ENTRY(host_input), "localhost");
-	}
-	if(gaim_prefs_exists("/plugins/gtk/cap/mysql/db_port")) {
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(port_input), gaim_prefs_get_int("/plugins/gtk/cap/mysql/db_port"));
-	} else {
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(port_input), 3306);
-	}
-	if(gaim_prefs_exists("/plugins/gtk/cap/mysql/db_user")) {
-		gtk_entry_set_text(GTK_ENTRY(username_input), gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_user"));
-	} else {
-		gtk_entry_set_text(GTK_ENTRY(username_input), "root");
-	}
-	if(gaim_prefs_exists("/plugins/gtk/cap/mysql/db_password")) {
-		gtk_entry_set_text(GTK_ENTRY(password_input), gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_password"));
-	} else {
-		gtk_entry_set_text(GTK_ENTRY(password_input), "");
-	}
-	if(gaim_prefs_exists("/plugins/gtk/cap/mysql/db_name")) {
-		gtk_entry_set_text(GTK_ENTRY(db_input), gaim_prefs_get_string("/plugins/gtk/cap/mysql/db_name"));
-	} else {
-		gtk_entry_set_text(GTK_ENTRY(db_input), "cap");
-	}
-
-	//Add callbacks
-	g_signal_connect(G_OBJECT(host_input), "focus-out-event",
-		G_CALLBACK(text_entry_prefs_cb), "/plugins/gtk/cap/mysql/db_host");
-	g_signal_connect(G_OBJECT(port_input), "value-changed",
-		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/mysql/db_port");
-	g_signal_connect(G_OBJECT(username_input), "focus-out-event",
-		G_CALLBACK(text_entry_prefs_cb), "/plugins/gtk/cap/mysql/db_user");
-	g_signal_connect(G_OBJECT(password_input), "focus-out-event",
-		G_CALLBACK(text_entry_prefs_cb), "/plugins/gtk/cap/mysql/db_password");
-	g_signal_connect(G_OBJECT(db_input), "focus-out-event",
-		G_CALLBACK(text_entry_prefs_cb), "/plugins/gtk/cap/mysql/db_name");
-
-	gtk_widget_show_all(config_area);
-
-	return config_area;
-}
-
 static GaimGtkPluginUiInfo ui_info = {
 	get_config_frame,
 	0 /* page_num (reserved) */
@@ -1228,19 +923,22 @@
 	NULL
 };
 
+static GtkWidget * get_config_frame(GaimPlugin *plugin) {
+	CapPrefsUI *ui = create_cap_prefs_ui();
+
+	/*
+	 * Prevent database stuff from occuring since we are editing values
+	 */
+	remove_plugin_functionality(_plugin_pointer);
+
+	return ui->ret;
+}
+
 static void init_plugin(GaimPlugin *plugin) {
 	gaim_prefs_add_none("/plugins/gtk/cap");
 	gaim_prefs_add_int("/plugins/gtk/cap/max_seen_difference", 1);
 	gaim_prefs_add_int("/plugins/gtk/cap/max_msg_difference", 10);
 	gaim_prefs_add_int("/plugins/gtk/cap/threshold", 5);
-	gaim_prefs_add_bool("/plugins/gtk/cap/configured", FALSE);
-	gaim_prefs_add_string("/plugins/gtk/cap/db_driver", "mysql");
-	gaim_prefs_add_none("/plugins/gtk/cap/mysql");
-	gaim_prefs_add_string("/plugins/gtk/cap/mysql/db_host", "localhost");
-	gaim_prefs_add_int("/plugins/gtk/cap/mysql/db_port", 3306);
-	gaim_prefs_add_string("/plugins/gtk/cap/mysql/db_user", "root");
-	gaim_prefs_add_string("/plugins/gtk/cap/mysql/db_password", "");
-	gaim_prefs_add_string("/plugins/gtk/cap/mysql/db_name", "cap");
 }
 
 GAIM_INIT_PLUGIN(cap, init_plugin, info);

mercurial