* Implement and use new sql_get_int_field() function to simplify getting integers from the database.
This commit is contained in:
60
sql.c
60
sql.c
@ -16,6 +16,7 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include "sql.h"
|
||||
#include "log.h"
|
||||
|
||||
@ -53,3 +54,62 @@ sql_get_table(sqlite3 *db, const char *sql, char ***pazResult, int *pnRow, int *
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
sql_get_int_field(sqlite3 *db, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int counter, result;
|
||||
char *sql;
|
||||
int ret;
|
||||
sqlite3_stmt *stmt;
|
||||
|
||||
va_start(ap, fmt);
|
||||
|
||||
sql = sqlite3_vmprintf(fmt, ap);
|
||||
|
||||
//DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql);
|
||||
|
||||
switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))
|
||||
{
|
||||
case SQLITE_OK:
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n", sqlite3_errmsg(db));
|
||||
sqlite3_free(sql);
|
||||
return -1;
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
|
||||
for (counter = 0;
|
||||
((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;
|
||||
counter++) {
|
||||
/* While SQLITE_BUSY has a built in timeout,
|
||||
SQLITE_LOCKED does not, so sleep */
|
||||
if (result == SQLITE_LOCKED)
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case SQLITE_DONE:
|
||||
/* no rows returned */
|
||||
ret = 0;
|
||||
break;
|
||||
case SQLITE_ROW:
|
||||
if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)
|
||||
{
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
ret = sqlite3_column_int(stmt, 0);
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n", __func__, sqlite3_errmsg(db));
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user