eda: Added BindQueryData typed_object interface to Row
authorJerome St-Louis <jerome@ecere.com>
Sat, 28 Jul 2012 02:07:16 +0000 (22:07 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sat, 28 Jul 2012 02:07:16 +0000 (22:07 -0400)
eda/drivers/sqlite/EDASQLite.ec
eda/libeda/src/EDA.ec

index 61e11e4..301bd40 100644 (file)
@@ -995,8 +995,9 @@ class SQLiteRow : DriverRow
       return status;
    }
 
-   void BindData(sqlite3_stmt * statement, int pos, SQLiteField fld, typed_object data, SerialBuffer * bufferOut)
+   bool BindData(sqlite3_stmt * statement, int pos, SQLiteField fld, typed_object data, SerialBuffer * bufferOut)
    {
+      int result = 1;
       Class dataType = fld.type;
       SerialBuffer buffer = null;
       switch(fld.sqliteType)
@@ -1006,10 +1007,10 @@ class SQLiteRow : DriverRow
             switch(dataType.typeSize)
             {
                case 8:
-                  sqlite3_bind_int64(statement, pos, (sqlite3_int64)*(int64 *)data);
+                  result = sqlite3_bind_int64(statement, pos, (sqlite3_int64)*(int64 *)data);
                   break;
                case 4:
-                  sqlite3_bind_int(statement, pos, *(int *)data);
+                  result = sqlite3_bind_int(statement, pos, *(int *)data);
                   break;
                case 2:
                {
@@ -1018,7 +1019,7 @@ class SQLiteRow : DriverRow
                      value = (int)*(short *)data;
                   else
                      value = (int)*(uint16 *)data;
-                  sqlite3_bind_int(statement, pos, value);
+                  result = sqlite3_bind_int(statement, pos, value);
                   break;
                }
                case 1:
@@ -1028,7 +1029,7 @@ class SQLiteRow : DriverRow
                      value = (int)*(char *)data;
                   else
                      value = (int)*(byte *)data;
-                  sqlite3_bind_int(statement, pos, value);
+                  result = sqlite3_bind_int(statement, pos, value);
                   break;
                }
             }
@@ -1037,17 +1038,17 @@ class SQLiteRow : DriverRow
          case SQLITE_FLOAT:
          {
             if(dataType.typeSize == 8)
-               sqlite3_bind_double(statement, pos, *(double *)data);
+               result = sqlite3_bind_double(statement, pos, *(double *)data);
             else
-               sqlite3_bind_double(statement, pos, (double)*(float *)data);
+               result = sqlite3_bind_double(statement, pos, (double)*(float *)data);
             break;
          }
          case SQLITE_TEXT:
          {
             if((char *)data)
-               sqlite3_bind_text(statement, pos, (char *)data, strlen((char *)data), SQLITE_TRANSIENT);
+               result = sqlite3_bind_text(statement, pos, (char *)data, strlen((char *)data), SQLITE_TRANSIENT);
             else
-               sqlite3_bind_text(statement, pos, null, 0, SQLITE_TRANSIENT);
+               result = sqlite3_bind_text(statement, pos, null, 0, SQLITE_TRANSIENT);
             break;
          }
          case SQLITE_BLOB:
@@ -1055,7 +1056,7 @@ class SQLiteRow : DriverRow
          {
             buffer = SerialBuffer { };
             dataType._vTbl[__ecereVMethodID_class_OnSerialize](dataType, data, buffer);
-            sqlite3_bind_text(statement, pos, buffer._buffer, buffer.count, SQLITE_TRANSIENT);
+            result = sqlite3_bind_text(statement, pos, buffer._buffer, buffer.count, SQLITE_TRANSIENT);
             break;
          }
       }
@@ -1063,6 +1064,7 @@ class SQLiteRow : DriverRow
          *bufferOut = buffer;
       else
          delete buffer;
+      return !result;
    }
 
    void AddCursorWhereClauses(char * command, MoveOptions move, bool useIndex)
@@ -1611,6 +1613,17 @@ class SQLiteRow : DriverRow
       return !result;
    }
 
+   bool BindQueryData(int pos, SQLiteField fld, typed_object data)
+   {
+      if(curStatement != queryStatement)
+      {
+         if(curStatement) sqlite3_reset(curStatement);
+         curStatement = queryStatement;
+      }
+      sqlite3_reset(queryStatement);
+      return BindData(queryStatement, pos, fld, data, null);
+   }
+
    /*char * GetExtraColumn(int paramID)
    {
       SQLiteField lastFld = tbl.fields.last;
index 382b55d..476b7bf 100644 (file)
@@ -480,11 +480,12 @@ public:
    bool GetData(Field field, typed_object & data) { return (row && field) ? row.GetData(field, data) : false; }
    bool SetData(Field field, typed_object data) { return (row && field) ? row.SetData(field, data) : false; }
    bool Delete() { return row ? row.Delete() : false; }
-   // TODO: Implement as a typed_object?
    bool SetQueryParam(int paramID, int value) { return row ? row.SetQueryParam(paramID, value) : false; }
    bool SetQueryParam64(int paramID, int64 value) { return row ? row.SetQueryParam64(paramID, value) : false; }   
    bool SetQueryParamText(int paramID, char * value) { return row ? row.SetQueryParamText(paramID, value) : false; }
    bool SetQueryParamObject(int paramID, void * value, Class type) { return row ? row.SetQueryParamObject(paramID, value, type) : false; }
+   // TOCHECK: Field is passed here to have sqlite type handy. The API might be nicer without
+   bool BindQueryData(int paramID, Field fld, typed_object value) { return row ? row.BindQueryData(paramID, fld, value) : false; }
    char * GetColumn(int paramID) { return row ? row.GetColumn(paramID) : null; }
 
    bool GUIDataRowSetData(DataRow dr, DataField df, Field fld)
@@ -542,6 +543,7 @@ public:
    virtual bool SetQueryParamText(int paramID, char * value);
    virtual bool SetQueryParamObject(int paramID, void * data, Class type);
    virtual char * GetColumn(int paramID);
+   virtual bool BindQueryData(int paramID, Field fld, typed_object value);
 };
 
 public class SQLCustomFunction