IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3198


Ignore:
Timestamp:
Feb 11, 2005, 1:46:57 PM (21 years ago)
Author:
jhoblitt
Message:

change psDBInsertOneRow() to use psDBInsertRows()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/archive/psdb/psDB.c

    r3197 r3198  
    88 *  @author Joshua Hoblitt
    99 *
    10  *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
    11  *  @date $Date: 2005-02-11 23:35:23 $
     10 *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
     11 *  @date $Date: 2005-02-11 23:46:57 $
    1212 *
    1313 *  Copyright 2005 Joshua Hoblitt, University of Hawaii
     
    467467bool psDBInsertOneRow(psDB *dbh, const char *tableName, psMetadata *row)
    468468{
    469     char            *query;             // SQL query
    470     MYSQL_STMT      *stmt;              // prepared db statement
    471     MYSQL_BIND      *bind;              // field values to insert
    472     psU32           paramCount;         // number of placeholders in query
    473     psHash          *mysqlFieldType;    // type lookup table
    474     mysqlType       *mType;             // type tmp variable
    475     char            *key;               // hash tmp variable
    476     psMetadataItem  *item;              // field in row
    477     psListIterator  *cursor;            // row iterator
    478     psU32           i;                  // field index
    479     bool            isNull = true;      // used in a MYSQL_BIND to indicate NULL
    480 
    481     query = psDBGenerateInsertRowSQL(tableName, row);
    482     if (!query) {
    483         return NULL;
    484     }
    485 
    486     stmt = mysql_stmt_init(dbh->mysql);
    487     if (!stmt) {
    488         // call abort?
    489         fprintf(stderr, " mysql_stmt_init(), out of memory\n");
     469    psArray         *rowSet;            // psArray of row to insert
     470
     471    // this is to prevent row from being free'd when rowSet is free'd. this
     472    // will have to be removed when psArrayAdd is modified to do this for you.
     473    psMemIncrRefCounter(row);
     474
     475    rowSet = psArrayAlloc(1);
     476    rowSet->n = 0;
     477    psArrayAdd(rowSet, 0, row);
     478
     479    if (!psDBInsertRows(dbh, tableName, rowSet)) {
     480        psFree(rowSet);
    490481
    491482        return false;
    492483    }
    493484
    494     if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
    495             fprintf(stderr, "Failed to prepare query.  Error: %s\n", mysql_stmt_error(stmt));
    496 
    497             mysql_stmt_close(stmt);
    498             psFree(query);
    499 
    500             return false;
    501     }
    502 
    503     psFree(query);
    504 
    505     paramCount = (psU32)mysql_stmt_param_count(stmt);
    506 
    507     bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
    508     memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
    509 
    510     mysqlFieldType = psDBGetPSToMySQLTable();
    511 
    512     cursor = psListIteratorAlloc(row->list, 0);
    513 
    514     i = 0;
    515     while ((item = psListGetNext(cursor))) {
    516         key = psDBIntToString((psU64)item->pType);
    517         mType = psHashLookup(mysqlFieldType, key);
    518         psFree(key);
    519 
    520         // input data length is determined by the MYSQL_TYPE_* unless it's a string
    521         bind[i].buffer  = (char *)item->data.V;
    522         bind[i].buffer_type = mType->type;
    523         bind[i].is_unsigned = mType->isUnsigned;
    524 
    525         // convert NaNs to NULL
    526         bind[i].is_null = psDBIsPTypeNaN(item->pType, item->data.V)
    527                         ? (my_bool *)&isNull
    528                         : NULL;
    529 
    530         if (item->pType == PS_TYPE_PTR) {
    531             if (item->type == PS_META_STR) {
    532                 if (*(char *)item->data.V == '\0') {
    533                     bind[i].is_null = (my_bool *)&isNull;
    534                 } else {
    535                     bind[i].buffer_length = (unsigned long)strlen((char *)item->data.V);
    536                     bind[i].is_null = NULL;
    537                 }
    538             } else {
    539                 // error, not a pointer to a string
    540             }
    541         }
    542 
    543         // increment field index
    544         i++;
    545     }
    546 
    547     psFree(mysqlFieldType);
    548 
    549     if (mysql_stmt_bind_param(stmt, bind)) {
    550         fprintf(stderr, "Failed to bind params.  Error: %s\n", mysql_stmt_error(stmt));
    551 
    552         psFree(bind);
    553         mysql_stmt_close(stmt);
    554 
    555         return false;
    556     }
    557 
    558     if (mysql_stmt_execute(stmt)) {
    559         fprintf(stderr, "Failed to execute prepared statement.  Error: %s\n", mysql_stmt_error(stmt));
    560 
    561         psFree(bind);
    562         mysql_stmt_close(stmt);
    563 
    564         return false;
    565     }
    566 
    567     // point of no return
    568     mysql_commit(dbh->mysql);
    569 
    570     psFree(bind);
    571     mysql_stmt_close(stmt);
     485    psFree(rowSet);
    572486
    573487    return true;
Note: See TracChangeset for help on using the changeset viewer.