/* print error and exit with failure */ void do_error_exit(sqlo_db_handle_t dbh, const char * file, int line, const char * msg) { printf("%s (line: %d):\n%s: %s\n", file, line, msg, sqlo_geterror(dbh)); sqlo_rollback(dbh); sqlo_finish(dbh); exit(EXIT_FAILURE); }
int execute(struct libdb *dbp, const char *qcmd) { if (!is_open(dbp) && !open(dbp)) { return 0; } int result = 0; switch (dbp->db_type) { case DB_ORACLE: { int ret; ret = sqlo_prepare(dbp->db_orap->ora_dbhp, qcmd); if (ret < 0) { set_error_d(dbp, "sqlo_prepare"); result = 0; break; } void *param_addr = NULL; ret = sqlo_bind_by_name(dbp->db_orap->ora_dbhp, ":1", SQLOT_STR, param_addr, 64, NULL, 0); if (SQLO_SUCCESS != ret) { set_error_d(dbp, "sqlo_bind_by_name"); result = 0; break; } ret = sqlo_execute(dbp->db_orap->ora_dbhp, 1); if (SQLO_SUCCESS != ret) { set_error_d(dbp, "sqlo_execute"); result = 0; break; } ret = sqlo_commit(dbp->db_orap->ora_dbhp); if (SQLO_SUCCESS != ret) { sqlo_rollback(dbp->db_orap->ora_dbhp); result = 0; break; } result = 1; } break; case DB_MYSQL: { MYSQL_RES *tmp = NULL; int ret = -1; unsigned long len = strlen(qcmd); ret = mysql_real_query(dbp->db_sqlp->mys_sqlp, qcmd, len); if (0 != ret) { result = 0; set_error_d(dbp, "mysql_query"); break; } //Although needs no results, but still need to call the following two API function tmp = mysql_use_result(dbp->db_sqlp->mys_sqlp); if (NULL == tmp) { result = 0; set_error_d(dbp, "mysql_use_result"); break; } mysql_free_result(tmp); ret = mysql_commit(dbp->db_sqlp->mys_sqlp); if (0 != ret) { result = 0; mysql_rollback(dbp->db_sqlp->mys_sqlp); } tmp = NULL; result = 1; } break; default: { result = 0; set_error_d(dbp,"the database type is not supported"); } break; } return result; }