apr_dbd_oracle.c
来自「linux网络服务器工具」· C语言 代码 · 共 1,920 行 · 第 1/5 页
C
1,920 行
case TRANS_ERROR: return -1; case TRANS_NONE: trans = NULL; break; case TRANS_1: oldsnapshot = trans->snapshot1; newsnapshot = trans->snapshot2; trans->status = TRANS_2; break; case TRANS_2: oldsnapshot = trans->snapshot2; newsnapshot = trans->snapshot1; trans->status = TRANS_1; break; } exec_mode = OCI_DEFAULT; } else { exec_mode = OCI_COMMIT_ON_SUCCESS; } dbd_oracle_bind(statement, values); sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 1, 0, oldsnapshot, newsnapshot, exec_mode); switch (sql->status) { case OCI_SUCCESS: break; case OCI_ERROR:#ifdef DEBUG OCIErrorGet(sql->err, 1, NULL, &errorcode, sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR); printf("Execute error %d: %s\n", sql->status, sql->buf);#endif /* fallthrough */ default: if (TXN_NOTICE_ERRORS(trans)) { trans->status = TRANS_ERROR; } return 1; } sql->status = OCIAttrGet(statement->stmt, OCI_HTYPE_STMT, nrows, 0, OCI_ATTR_ROW_COUNT, sql->err); return 0;}static int dbd_oracle_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows, apr_dbd_prepared_t *statement, va_list args){ const char **values; int i; if (sql->trans && sql->trans->status == TRANS_ERROR) { return -1; } values = apr_palloc(pool, sizeof(*values) * statement->nvals); for (i = 0; i < statement->nvals; i++) { values[i] = va_arg(args, const char*); } return dbd_oracle_pquery(pool, sql, nrows, statement, values);}static int dbd_oracle_pselect(apr_pool_t *pool, apr_dbd_t *sql, apr_dbd_results_t **results, apr_dbd_prepared_t *statement, int seek, const char **values){ int exec_mode = seek ? OCI_STMT_SCROLLABLE_READONLY : OCI_DEFAULT; OCISnapshot *oldsnapshot = NULL; OCISnapshot *newsnapshot = NULL; apr_dbd_transaction_t* trans = sql->trans; int_errorcode; if (trans) { switch (trans->status) { case TRANS_ERROR: return 1; case TRANS_NONE: trans = NULL; break; case TRANS_1: oldsnapshot = trans->snapshot1; newsnapshot = trans->snapshot2; trans->status = TRANS_2; break; case TRANS_2: oldsnapshot = trans->snapshot2; newsnapshot = trans->snapshot1; trans->status = TRANS_1; break; } } dbd_oracle_bind(statement, values); sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 0, 0, oldsnapshot, newsnapshot, exec_mode); switch (sql->status) { case OCI_SUCCESS: break; case OCI_ERROR:#ifdef DEBUG OCIErrorGet(sql->err, 1, NULL, &errorcode, sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR); printf("Executing prepared statement: %s\n", sql->buf);#endif /* fallthrough */ default: if (TXN_NOTICE_ERRORS(trans)) { trans->status = TRANS_ERROR; } return 1; } if (!*results) { *results = apr_palloc(pool, sizeof(apr_dbd_results_t)); } (*results)->handle = sql; (*results)->statement = statement; (*results)->seek = seek; (*results)->rownum = seek ? 0 : -1; (*results)->pool = pool; return 0;}static int dbd_oracle_pvselect(apr_pool_t *pool, apr_dbd_t *sql, apr_dbd_results_t **results, apr_dbd_prepared_t *statement, int seek, va_list args){ const char **values; int i; if (sql->trans && sql->trans->status == TRANS_ERROR) { return -1; } values = apr_palloc(pool, sizeof(*values) * statement->nvals); for (i = 0; i < statement->nvals; i++) { values[i] = va_arg(args, const char*); } return dbd_oracle_pselect(pool, sql, results, statement, seek, values);}static void dbd_oracle_bbind(apr_dbd_prepared_t * statement, const void **values){ OCIStmt *stmt = statement->stmt; apr_dbd_t *sql = statement->handle; int i, j; sb2 null_ind = -1; apr_dbd_type_e type; for (i = 0, j = 0; i < statement->nargs; i++, j++) { type = (values[j] == NULL ? APR_DBD_TYPE_NULL : statement->args[i].type); switch (type) { case APR_DBD_TYPE_TINY: statement->args[i].value.ival = *(char*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.ival, sizeof(statement->args[i].value.ival), SQLT_INT, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_UTINY: statement->args[i].value.uval = *(unsigned char*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.uval, sizeof(statement->args[i].value.uval), SQLT_UIN, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_SHORT: statement->args[i].value.ival = *(short*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.ival, sizeof(statement->args[i].value.ival), SQLT_INT, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_USHORT: statement->args[i].value.uval = *(unsigned short*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.uval, sizeof(statement->args[i].value.uval), SQLT_UIN, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_INT: statement->args[i].value.ival = *(int*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.ival, sizeof(statement->args[i].value.ival), SQLT_INT, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_UINT: statement->args[i].value.uval = *(unsigned int*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.uval, sizeof(statement->args[i].value.uval), SQLT_UIN, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_LONG: statement->args[i].value.sval = apr_psprintf(statement->pool, "%ld", *(long*)values[j]); sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, statement->args[i].value.sval, strlen(statement->args[i].value.sval)+1, SQLT_STR, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_ULONG: statement->args[i].value.sval = apr_psprintf(statement->pool, "%lu", *(unsigned long*)values[j]); sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, statement->args[i].value.sval, strlen(statement->args[i].value.sval)+1, SQLT_STR, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_LONGLONG: statement->args[i].value.sval = apr_psprintf(statement->pool, "%" APR_INT64_T_FMT, *(apr_int64_t*)values[j]); sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, statement->args[i].value.sval, strlen(statement->args[i].value.sval)+1, SQLT_STR, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_ULONGLONG: statement->args[i].value.sval = apr_psprintf(statement->pool, "%" APR_UINT64_T_FMT, *(apr_uint64_t*)values[j]); sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, statement->args[i].value.sval, strlen(statement->args[i].value.sval)+1, SQLT_UIN, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_FLOAT: statement->args[i].value.fval = *(float*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.fval, sizeof(statement->args[i].value.fval), SQLT_FLT, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_DOUBLE: statement->args[i].value.fval = *(double*)values[j]; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, &statement->args[i].value.fval, sizeof(statement->args[i].value.fval), SQLT_FLT, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_STRING: case APR_DBD_TYPE_TEXT: case APR_DBD_TYPE_TIME: case APR_DBD_TYPE_DATE: case APR_DBD_TYPE_DATETIME: case APR_DBD_TYPE_TIMESTAMP: case APR_DBD_TYPE_ZTIMESTAMP: sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, (dvoid*) values[j], strlen(values[j]) + 1, SQLT_STR, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; case APR_DBD_TYPE_BLOB: { char *data = (char *)values[j]; apr_size_t size = *(apr_size_t*)values[++j]; /* skip table and column for now */ j += 2; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, data, size, SQLT_LBI, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); } break; case APR_DBD_TYPE_CLOB: { char *data = (char *)values[j]; apr_size_t size = *(apr_size_t*)values[++j]; /* skip table and column for now */ j += 2; sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, data, size, SQLT_LNG, &statement->args[i].ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); } break; case APR_DBD_TYPE_NULL: default: sql->status = OCIBindByPos(stmt, &statement->args[i].bind, sql->err, i + 1, NULL, 0, SQLT_STR, &null_ind, NULL, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); break; } if (sql->status != OCI_SUCCESS) { return; } } return;}static int dbd_oracle_pbquery(apr_pool_t * pool, apr_dbd_t * sql, int *nrows, apr_dbd_prepared_t * statement, const void **values){ OCISnapshot *oldsnapshot = NULL; OCISnapshot *newsnapshot = NULL; apr_dbd_transaction_t* trans = sql->trans; int exec_mode; int_errorcode;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?