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 + -
显示快捷键?