Reviewed by Levi
authorbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Jun 2006 19:07:34 +0000 (19:07 +0000)
committerbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Jun 2006 19:07:34 +0000 (19:07 +0000)
        Some SQLDatabase cleanup (style stuff) and enhancements

        * icon/SQLDatabase.cpp:
        (SQLDatabase::open):
        (SQLDatabase::executeCommand):
        (SQLDatabase::returnsAtLeastOneResult):  Accessor to see if this query returns results
        (SQLDatabase::lastInsertRowID):  Accessor for the rowid of the last insert
        * icon/SQLDatabase.h:
        (WebCore::SQLStatement::prepareAndStep):
        * icon/SQLStatement.cpp:
        (WebCore::SQLStatement::bindInt64):
        -All of the following used to require the user to manually prepare and step a statement
        before asking for the result.  Now it will prepare and step itself so you can use a temporary
        object to get a quick result
        (WebCore::SQLStatement::getColumnName):
        (WebCore::SQLStatement::getColumnName16):
        (WebCore::SQLStatement::getColumnText):
        (WebCore::SQLStatement::getColumnText16):
        (WebCore::SQLStatement::getColumnDouble):
        (WebCore::SQLStatement::getColumnInt):
        (WebCore::SQLStatement::getColumnInt64):
        (WebCore::SQLStatement::getColumnBlobAsVector):
        (WebCore::SQLStatement::getColumnBlob):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15056 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/icon/SQLDatabase.cpp
WebCore/icon/SQLDatabase.h
WebCore/icon/SQLStatement.cpp

index d7034cbb4a0f6b3786a8993d874494aceb10ff12..20aa216f9a1b4743321579429d27e55c76e32f82 100644 (file)
@@ -1,3 +1,31 @@
+2006-06-27  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Levi
+
+        Some SQLDatabase cleanup (style stuff) and enhancements
+
+        * icon/SQLDatabase.cpp:
+        (SQLDatabase::open):
+        (SQLDatabase::executeCommand):
+        (SQLDatabase::returnsAtLeastOneResult):  Accessor to see if this query returns results
+        (SQLDatabase::lastInsertRowID):  Accessor for the rowid of the last insert
+        * icon/SQLDatabase.h:
+        (WebCore::SQLStatement::prepareAndStep):
+        * icon/SQLStatement.cpp:
+        (WebCore::SQLStatement::bindInt64):
+        -All of the following used to require the user to manually prepare and step a statement
+        before asking for the result.  Now it will prepare and step itself so you can use a temporary
+        object to get a quick result
+        (WebCore::SQLStatement::getColumnName):
+        (WebCore::SQLStatement::getColumnName16):
+        (WebCore::SQLStatement::getColumnText):
+        (WebCore::SQLStatement::getColumnText16):
+        (WebCore::SQLStatement::getColumnDouble):
+        (WebCore::SQLStatement::getColumnInt):
+        (WebCore::SQLStatement::getColumnInt64):
+        (WebCore::SQLStatement::getColumnBlobAsVector):
+        (WebCore::SQLStatement::getColumnBlob):
+
 2006-06-27  Ada Chan <adachan@apple.com>
 
         Reviewed by sfalken.
index 27aa6e07b9b21f36c5e46e35f7934e97cc6692c4..c1aa40feee1f3b846c1b27b957137799ea902750 100644 (file)
@@ -49,6 +49,9 @@ bool SQLDatabase::open(const String& filename)
         sqlite3_close(m_db);
         m_db = 0;
     }
+    if (!SQLStatement(*this, "PRAGMA temp_store = MEMORY;").executeCommand())
+        LOG_ERROR("SQLite database could not set temp_store to memory");
+
     return isOpen();
 }
 
@@ -87,7 +90,12 @@ void SQLDatabase::setBusyHandler(int(*handler)(void*, int))
 
 bool SQLDatabase::executeCommand(const String& sql)
 {
-    return SQLStatement(*this,sql).executeCommand();
+    return SQLStatement(*this, sql).executeCommand();
+}
+
+bool SQLDatabase::returnsAtLeastOneResult(const String& sql)
+{
+    return SQLStatement(*this, sql).returnsAtLeastOneResult();
 }
 
 bool SQLDatabase::tableExists(const String& tablename)
@@ -102,6 +110,12 @@ bool SQLDatabase::tableExists(const String& tablename)
     return sql.step() == SQLITE_ROW;
 }
 
+int64_t SQLDatabase::lastInsertRowID()
+{
+    if (!m_db)
+        return 0;
+    return sqlite3_last_insert_rowid(m_db);
+}
 
 
 
index f25f339324678d8e96b81ff5bfd067051d25ed86..3c38866250aed934dd6b41e38bf6f9d2c7cccd8f 100644 (file)
@@ -49,12 +49,16 @@ public:
     void close();
 
     bool executeCommand(const String&);
+    bool returnsAtLeastOneResult(const String&);
+    
     bool tableExists(const String&);
+    
+    int64_t lastInsertRowID();
 
     void setBusyTimeout(int ms);
     void setBusyHandler(int(*)(void*, int));
     
-    //TODO - add pragma and sqlite_master accessors here
+    // TODO - add pragma and sqlite_master accessors here
     void setFullsync(bool);
     
     int lastError() { return m_db ? sqlite3_errcode(m_db) : SQLITE_ERROR; }
@@ -65,7 +69,7 @@ private:
     sqlite3* m_db;
     int m_lastError;
     
-}; //class SQLDatabase
+}; // class SQLDatabase
 
 class SQLTransaction : public Noncopyable
 {
@@ -93,33 +97,37 @@ public:
     bool isPrepared() { return m_statement; }
     int bindBlob(int index, const void* blob, int size, bool copy = true);
     int bindText(int index, const char* text, bool copy = true);
+    int bindInt64(int index, int64_t integer);
 
     int step();
     int finalize();
     int reset();
     
-    //prepares, steps, and finalizes the query.
-    //returns true if all 3 steps succeed with step() returning SQLITE_DONE
-    //returns false otherwise  
+    int prepareAndStep() { prepare();  return step(); }
+    
+    // prepares, steps, and finalizes the query.
+    // returns true if all 3 steps succeed with step() returning SQLITE_DONE
+    // returns false otherwise  
     bool executeCommand();
     
-    //prepares, steps, and finalizes.  
-    //returns true is step() returns SQLITE_ROW
-    //returns false otherwise
+    // prepares, steps, and finalizes.  
+    // returns true is step() returns SQLITE_ROW
+    // returns false otherwise
     bool returnsAtLeastOneResult();
     
-    //Returns -1 on last-step failing.  Otherwise, returns number of rows
-    //returned in the last step()
+    // Returns -1 on last-step failing.  Otherwise, returns number of rows
+    // returned in the last step()
     int columnCount();
     
     String getColumnName(int col);
     String getColumnName16(int col);
     String getColumnText(int col);
     String getColumnText16(int col);
-    double  getColumnDouble(int col);
-    int     getColumnInt(int col);
+    double getColumnDouble(int col);
+    int getColumnInt(int col);
     int64_t getColumnInt64(int col);
     const void* getColumnBlob(int col, int& size);
+    Vector<char> getColumnBlobAsVector(int col);
 
     bool returnTextResults(int col, Vector<String>& v);
     bool returnTextResults16(int col, Vector<String>& v);
@@ -137,7 +145,7 @@ private:
     sqlite3_stmt* m_statement;
 };
 
-} //namespace WebCore
+} // namespace WebCore
 
 
 
index e6d825471b45e1aee00193117033339abf76a6ea..8c06d2b8d7b2a70f9e6c87498589e5b33768c502 100644 (file)
@@ -132,6 +132,11 @@ int SQLStatement::bindText(int index, const char* text, bool copy)
     return lastError();
 }
 
+int SQLStatement::bindInt64(int index, int64_t integer)
+{
+    return sqlite3_bind_int64(m_statement, index, integer);
+}
+
 int SQLStatement::columnCount()
 {
     if (m_statement)
@@ -141,65 +146,113 @@ int SQLStatement::columnCount()
 
 String SQLStatement::getColumnName(int col)
 {
-    if (m_statement)
-        return String(sqlite3_column_name(m_statement, col));
-    return "";
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return "";
+    if (columnCount() <= col)
+        return "";
+        
+    return String(sqlite3_column_name(m_statement, col));
 }
 
 String SQLStatement::getColumnName16(int col)
 {
-    if (m_statement)
-        return String((const UChar*)sqlite3_column_name16(m_statement, col));
-    return "";
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return "";
+    if (columnCount() <= col)
+        return "";
+    return String((const UChar*)sqlite3_column_name16(m_statement, col));
 }
     
 String SQLStatement::getColumnText(int col)
 {
-    if (m_statement)
-        return String((const char*)sqlite3_column_text(m_statement, col));
-    return "";
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return "";
+    if (columnCount() <= col)
+        return "";
+    return String((const char*)sqlite3_column_text(m_statement, col));
 }
 
 String SQLStatement::getColumnText16(int col)
 {
-    if (m_statement)
-        return String((const UChar*)sqlite3_column_text16(m_statement, col));
-    return "";
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return "";
+    if (columnCount() <= col)
+        return "";
+    return String((const UChar*)sqlite3_column_text16(m_statement, col));
 }
     
 double SQLStatement::getColumnDouble(int col)
 {
-    if (m_statement)
-        return sqlite3_column_double(m_statement, col);
-    return 0.0;
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return 0.0;
+    if (columnCount() <= col)
+        return 0.0;
+    return sqlite3_column_double(m_statement, col);
 }
 
 int SQLStatement::getColumnInt(int col)
 {
-    if (m_statement)
-        return sqlite3_column_int(m_statement, col);
-    return 0;
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return 0;
+    if (columnCount() <= col)
+        return 0;
+    return sqlite3_column_int(m_statement, col);
 }
 
 int64_t SQLStatement::getColumnInt64(int col)
 {
-    if (m_statement)
-        return sqlite3_column_int64(m_statement, col);
-    return 0;
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return 0;
+    if (columnCount() <= col)
+        return 0;
+    return sqlite3_column_int64(m_statement, col);
 }
     
+Vector<char> SQLStatement::getColumnBlobAsVector(int col)
+{
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW)
+            return Vector<char>();
+    if (columnCount() <= col)
+        return Vector<char>();
+    const void* blob = sqlite3_column_blob(m_statement, col);
+    if (blob) {
+        int size = sqlite3_column_bytes(m_statement, col);
+        Vector<char> result((size_t)size);
+        for (int i = 0; i < size; ++i)
+            result[i] = ((const char*)blob)[i];
+        return result;
+    } 
+    return Vector<char>();
+}
+
 const void* SQLStatement::getColumnBlob(int col, int& size)
 {
-    if (!m_statement) {
+    if (!m_statement)
+        if (prepareAndStep() != SQLITE_ROW) {
+            size = 0;
+            return 0;
+        }
+    if (columnCount() <= col) {
         size = 0;
         return 0;
     }
+        
     const void* blob = sqlite3_column_blob(m_statement, col);
     if (blob) {
         size = sqlite3_column_bytes(m_statement, col);
-    } else
-        size = 0;
-    return blob;
+        return blob;
+    } 
+    size = 0;
+    return 0;
 }
 
 bool SQLStatement::returnTextResults(int col, Vector<String>& v)
@@ -297,5 +350,5 @@ bool SQLStatement::returnDoubleResults(int col, Vector<double>& v)
     return result;
 }
 
-}; //namespace WebCore
+}; // namespace WebCore