/* MiniDLNA media server * Copyright (C) 2008-2009 Justin Maggard * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "sql.h" #include "log.h" int sql_exec(sqlite3 *db, const char *fmt, ...) { int ret; char *errMsg = NULL; char *sql; va_list ap; //DPRINTF(E_DEBUG, L_DB_SQL, "SQL: %s\n", sql); va_start(ap, fmt); sql = sqlite3_vmprintf(fmt, ap); ret = sqlite3_exec(db, sql, 0, 0, &errMsg); if( ret != SQLITE_OK ) { DPRINTF(E_ERROR, L_DB_SQL, "SQL ERROR %d [%s]\n%s\n", ret, errMsg, sql); if (errMsg) sqlite3_free(errMsg); } sqlite3_free(sql); return ret; } int sql_get_table(sqlite3 *db, const char *sql, char ***pazResult, int *pnRow, int *pnColumn) { int ret; char *errMsg = NULL; //DPRINTF(E_DEBUG, L_DB_SQL, "SQL: %s\n", sql); ret = sqlite3_get_table(db, sql, pazResult, pnRow, pnColumn, &errMsg); if( ret != SQLITE_OK ) { DPRINTF(E_ERROR, L_DB_SQL, "SQL ERROR %d [%s]\n%s\n", ret, errMsg, sql); if (errMsg) sqlite3_free(errMsg); } 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; }