cosmetic: refactor db_bind_imsi() as db_bind_text()

There are more uses for a generalized db_bind_text(), and in an upcoming patch
there will be similar functions like db_bind_int().

Also, add argument param_name, optionally indicating a named SQL parameter to
bind to, which will be used in subsequent patches. So far, all callers pass
NULL to yield previous db_bind_imsi() behavior of binding to the first param.

Change-Id: I87bc46a23a724677e8319d6a4b032976b7ba9394
diff --git a/src/db.c b/src/db.c
index 6566527..4bba2f0 100644
--- a/src/db.c
+++ b/src/db.c
@@ -77,16 +77,25 @@
 	return true;
 }
 
-/* bind IMSI and do proper cleanup in case of failure */
-bool db_bind_imsi(sqlite3_stmt *stmt, const char *imsi)
+/** bind text arg and do proper cleanup in case of failure. If param_name is
+ * NULL, bind to the first parameter (useful for SQL statements that have only
+ * one parameter). */
+bool db_bind_text(sqlite3_stmt *stmt, const char *param_name, const char *text)
 {
-	int rc = sqlite3_bind_text(stmt, 1, imsi, -1, SQLITE_STATIC);
+	int rc;
+	int idx = param_name ? sqlite3_bind_parameter_index(stmt, param_name) : 1;
+	if (idx < 1) {
+		LOGP(DDB, LOGL_ERROR, "Error composing SQL, cannot bind parameter '%s'\n",
+		     param_name);
+		return false;
+	}
+	rc = sqlite3_bind_text(stmt, idx, text, -1, SQLITE_STATIC);
 	if (rc != SQLITE_OK) {
-		LOGP(DDB, LOGL_ERROR, "Error binding IMSI %s: %d\n", imsi, rc);
+		LOGP(DDB, LOGL_ERROR, "Error binding text to SQL parameter %s: %d\n",
+		     param_name ? param_name : "#1", rc);
 		db_remove_reset(stmt);
 		return false;
 	}
-
 	return true;
 }