Changeset 3198
- Timestamp:
- Feb 11, 2005, 1:46:57 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/archive/psdb/psDB.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/psdb/psDB.c
r3197 r3198 8 8 * @author Joshua Hoblitt 9 9 * 10 * @version $Revision: 1.1 5$ $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 $ 12 12 * 13 13 * Copyright 2005 Joshua Hoblitt, University of Hawaii … … 467 467 bool psDBInsertOneRow(psDB *dbh, const char *tableName, psMetadata *row) 468 468 { 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); 490 481 491 482 return false; 492 483 } 493 484 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); 572 486 573 487 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
