Bug 384526 - Use sqlite3_prepare_v2 instead of sqlite3_prepare. r=sspitzer

git-svn-id: svn://10.0.0.236/trunk@229755 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
sdwilsh%shawnwilsher.com 2007-07-11 22:20:40 +00:00
parent 71b9537a1f
commit 3c892b96f1
4 changed files with 41 additions and 69 deletions

View File

@ -77,6 +77,8 @@ ConvertResultCode(int srv)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
case SQLITE_MISUSE: case SQLITE_MISUSE:
return NS_ERROR_UNEXPECTED; return NS_ERROR_UNEXPECTED;
case SQLITE_ABORT:
return NS_ERROR_ABORT;
} }
// generic error // generic error

View File

@ -140,7 +140,7 @@ mozStorageConnection::Initialize(nsIFile *aDatabaseFile)
*/ */
sqlite3_stmt *stmt = nsnull; sqlite3_stmt *stmt = nsnull;
nsCString query("SELECT * FROM sqlite_master"); nsCString query("SELECT * FROM sqlite_master");
srv = sqlite3_prepare (mDBConn, query.get(), query.Length(), &stmt, nsnull); srv = sqlite3_prepare_v2(mDBConn, query.get(), query.Length(), &stmt, NULL);
if (srv == SQLITE_OK) { if (srv == SQLITE_OK) {
srv = sqlite3_step(stmt); srv = sqlite3_step(stmt);
@ -304,7 +304,8 @@ mozStorageConnection::TableExists(const nsACString& aSQLStatement, PRBool *_retv
query.AppendLiteral("'"); query.AppendLiteral("'");
sqlite3_stmt *stmt = nsnull; sqlite3_stmt *stmt = nsnull;
int srv = sqlite3_prepare (mDBConn, query.get(), query.Length(), &stmt, nsnull); int srv = sqlite3_prepare_v2(mDBConn, query.get(), query.Length(), &stmt,
NULL);
if (srv != SQLITE_OK) { if (srv != SQLITE_OK) {
HandleSqliteError(query.get()); HandleSqliteError(query.get());
return ConvertResultCode(srv); return ConvertResultCode(srv);
@ -320,9 +321,9 @@ mozStorageConnection::TableExists(const nsACString& aSQLStatement, PRBool *_retv
exists = PR_TRUE; exists = PR_TRUE;
} else if (srv == SQLITE_DONE) { } else if (srv == SQLITE_DONE) {
exists = PR_FALSE; exists = PR_FALSE;
} else if (srv == SQLITE_ERROR) { } else {
HandleSqliteError("TableExists finalize"); HandleSqliteError("TableExists finalize");
return NS_ERROR_FAILURE; return ConvertResultCode(srv);
} }
*_retval = exists; *_retval = exists;
@ -339,7 +340,8 @@ mozStorageConnection::IndexExists(const nsACString& aIndexName, PRBool* _retval)
query.AppendLiteral("'"); query.AppendLiteral("'");
sqlite3_stmt *stmt = nsnull; sqlite3_stmt *stmt = nsnull;
int srv = sqlite3_prepare(mDBConn, query.get(), query.Length(), &stmt, nsnull); int srv = sqlite3_prepare_v2(mDBConn, query.get(), query.Length(), &stmt,
NULL);
if (srv != SQLITE_OK) { if (srv != SQLITE_OK) {
HandleSqliteError(query.get()); HandleSqliteError(query.get());
return ConvertResultCode(srv); return ConvertResultCode(srv);
@ -348,14 +350,10 @@ mozStorageConnection::IndexExists(const nsACString& aIndexName, PRBool* _retval)
*_retval = PR_FALSE; *_retval = PR_FALSE;
srv = sqlite3_step(stmt); srv = sqlite3_step(stmt);
// we just care about the return value from step (void)sqlite3_finalize(stmt);
sqlite3_finalize(stmt);
if (srv == SQLITE_ROW) { if (srv == SQLITE_ROW) {
*_retval = PR_TRUE; *_retval = PR_TRUE;
} else if (srv == SQLITE_ERROR) {
HandleSqliteError("IndexExists finalize");
return NS_ERROR_FAILURE;
} }
return ConvertResultCode(srv); return ConvertResultCode(srv);

View File

@ -117,7 +117,8 @@ mozStorageStatement::Initialize(mozIStorageConnection *aDBConnection, const nsAC
int nRetries = 0; int nRetries = 0;
while (nRetries < 2) { while (nRetries < 2) {
srv = sqlite3_prepare (db, nsPromiseFlatCString(aSQLStatement).get(), aSQLStatement.Length(), &mDBStatement, NULL); srv = sqlite3_prepare_v2(db, nsPromiseFlatCString(aSQLStatement).get(),
aSQLStatement.Length(), &mDBStatement, NULL);
if ((srv == SQLITE_SCHEMA && nRetries != 0) || if ((srv == SQLITE_SCHEMA && nRetries != 0) ||
(srv != SQLITE_SCHEMA && srv != SQLITE_OK)) (srv != SQLITE_SCHEMA && srv != SQLITE_OK))
{ {
@ -412,9 +413,6 @@ mozStorageStatement::ExecuteStep(PRBool *_retval)
} }
} }
int nRetries = 0;
while (nRetries < 2) {
int srv = sqlite3_step (mDBStatement); int srv = sqlite3_step (mDBStatement);
#ifdef PR_LOGGING #ifdef PR_LOGGING
@ -437,43 +435,17 @@ mozStorageStatement::ExecuteStep(PRBool *_retval)
mExecuting = PR_FALSE; mExecuting = PR_FALSE;
*_retval = PR_FALSE; *_retval = PR_FALSE;
return NS_OK; return NS_OK;
} else if (srv == SQLITE_BUSY || } else if (srv == SQLITE_BUSY || srv == SQLITE_MISUSE) {
srv == SQLITE_MISUSE)
{
mExecuting = PR_FALSE; mExecuting = PR_FALSE;
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} else if (srv == SQLITE_SCHEMA) { } else if (mExecuting == PR_TRUE) {
// step should never return SQLITE_SCHEMA #ifdef PR_LOGGING
NS_NOTREACHED("sqlite3_step returned SQLITE_SCHEMA!"); PR_LOG(gStorageLog, PR_LOG_ERROR, ("SQLite error after mExecuting was true!"));
return NS_ERROR_FAILURE; #endif
} else if (srv == SQLITE_ERROR) {
// so we may end up with a SQLITE_ERROR/SQLITE_SCHEMA only after
// we reset, because SQLite's error reporting story
// sucks.
if (mExecuting == PR_TRUE) {
PR_LOG(gStorageLog, PR_LOG_ERROR, ("SQLITE_ERROR after mExecuting was true!"));
mExecuting = PR_FALSE; mExecuting = PR_FALSE;
return NS_ERROR_FAILURE;
} }
srv = sqlite3_reset(mDBStatement); return ConvertResultCode(srv);
if (srv == SQLITE_SCHEMA) {
rv = Recreate();
NS_ENSURE_SUCCESS(rv, rv);
nRetries++;
} else {
return NS_ERROR_FAILURE;
}
} else {
// something that shouldn't happen happened
NS_ERROR ("sqlite3_step returned an error code we don't know about!");
}
}
// shouldn't get here
return NS_ERROR_FAILURE;
} }
/* [noscript,notxpcom] sqlite3stmtptr getNativeStatementPointer(); */ /* [noscript,notxpcom] sqlite3stmtptr getNativeStatementPointer(); */

View File

@ -106,9 +106,9 @@ function test_handler_abort()
while(stmt.executeStep()); while(stmt.executeStep());
do_throw("We shouldn't get here!"); do_throw("We shouldn't get here!");
} catch (e) { } catch (e) {
do_check_eq(Cr.NS_ERROR_FAILURE, e.result); do_check_eq(Cr.NS_ERROR_ABORT, e.result);
// Magic value: callback abort // Magic value: callback abort
do_check_eq(msc.lastError, 4); //do_check_eq(msc.lastError, 4); XXX see Bug 387609
} }
} }