apr_dbd_oracle.c

来自「linux网络服务器工具」· C语言 代码 · 共 1,920 行 · 第 1/5 页

C
1,920
字号
    } fields[] = {        {"user", BLANK},        {"pass", BLANK},        {"dbname", BLANK},        {"server", BLANK},        {NULL, NULL}    };    int i;    const char *ptr;    const char *key;    size_t klen;    const char *value;    size_t vlen;    static const char *const delims = " \r\n\t;|,";    ret->pool = pool;    ret->long_size = DEFAULT_LONG_SIZE;    /* snitch parsing from the MySQL driver */    for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {        /* don't dereference memory that may not belong to us */        if (ptr == params) {            ++ptr;            continue;        }        for (key = ptr-1; isspace(*key); --key);        klen = 0;        while (isalpha(*key)) {            if (key == params) {                /* Don't parse off the front of the params */                --key;                ++klen;                break;            }            --key;            ++klen;        }        ++key;        for (value = ptr+1; isspace(*value); ++value);        vlen = strcspn(value, delims);        for (i=0; fields[i].field != NULL; ++i) {            if (!strncasecmp(fields[i].field, key, klen)) {                fields[i].value = apr_pstrndup(pool, value, vlen);                break;            }        }        ptr = value+vlen;    }    ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->err,                                 OCI_HTYPE_ERROR, 0, NULL);    switch (ret->status) {    default:#ifdef DEBUG        printf("ret->status is %d\n", ret->status);        break;#else        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->svr,                                 OCI_HTYPE_SERVER, 0, NULL);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (alloc svr): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->svc,                                 OCI_HTYPE_SVCCTX, 0, NULL);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (alloc svc): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }/* All the examples use the #else */#if CAN_DO_LOGIN    ret->status = OCILogon(dbd_oracle_env, ret->err, &ret->svc, fields[0].value,                     strlen(fields[0].value), fields[1].value,                     strlen(fields[1].value), fields[2].value,                     strlen(fields[2].value));    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR: %s\n", ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }#else    ret->status = OCIServerAttach(ret->svr, ret->err, (text*) fields[3].value,                                  strlen(fields[3].value), OCI_DEFAULT);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (server attach): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIAttrSet(ret->svc, OCI_HTYPE_SVCCTX, ret->svr, 0,                        OCI_ATTR_SERVER, ret->err);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (attr set): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->auth,                            OCI_HTYPE_SESSION, 0, NULL);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (alloc auth): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIAttrSet(ret->auth, OCI_HTYPE_SESSION, fields[0].value,                        strlen(fields[0].value), OCI_ATTR_USERNAME, ret->err);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (attr username): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIAttrSet(ret->auth, OCI_HTYPE_SESSION, fields[1].value,                        strlen(fields[1].value), OCI_ATTR_PASSWORD, ret->err);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (attr password): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCISessionBegin(ret->svc, ret->err, ret->auth,                             OCI_CRED_RDBMS, OCI_DEFAULT);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (session begin): %s\n", ret->status, ret->buf);        break;#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif    case OCI_SUCCESS:        break;    }    ret->status = OCIAttrSet(ret->svc, OCI_HTYPE_SVCCTX, ret->auth, 0,                        OCI_ATTR_SESSION, ret->err);    switch (ret->status) {    default:#ifdef DEBUG        OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,                    sizeof(ret->buf), OCI_HTYPE_ERROR);        printf("OPEN ERROR %d (attr session): %s\n", ret->status, ret->buf);#else        if (error) {            *error = apr_pcalloc(pool, ERR_BUF_SIZE);            OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),                        ERR_BUF_SIZE, OCI_HTYPE_ERROR);        }        return NULL;#endif        break;    case OCI_SUCCESS:        break;    }#endif    if(dbd_oracle_prepare(pool, ret, CHECK_CONN_QUERY, NULL, 0, 0, NULL,                          &ret->check_conn_stmt) != 0) {        return NULL;    }    return ret;}#ifdef EXPORT_NATIVE_FUNCSstatic apr_size_t dbd_oracle_long_size_set(apr_dbd_t *sql,                                           apr_size_t long_size){    apr_size_t old_size = sql->long_size;    sql->long_size = long_size;    return old_size;}#endifstatic const char *dbd_oracle_get_name(const apr_dbd_results_t *res, int n){    define_arg *val = &res->statement->out[n];    if ((n < 0) || (n >= res->statement->nout)) {        return NULL;    }    return val->name;}static int dbd_oracle_get_row(apr_pool_t *pool, apr_dbd_results_t *res,                              apr_dbd_row_t **rowp, int rownum){    apr_dbd_row_t *row = *rowp;    apr_dbd_t *sql = res->handle;    int_errorcode;    if (row == NULL) {        row = apr_palloc(pool, sizeof(apr_dbd_row_t));        *rowp = row;        row->res = res;        /* Oracle starts counting at 1 according to the docs */        row->n = res->seek ? rownum : 1;        row->pool = pool;    }    else {        if (res->seek) {            row->n = rownum;        }        else {            ++row->n;        }    }    if (res->seek) {        sql->status = OCIStmtFetch2(res->statement->stmt, res->handle->err, 1,                                    OCI_FETCH_ABSOLUTE, row->n, OCI_DEFAULT);    }    else {        sql->status = OCIStmtFetch2(res->statement->stmt, res->handle->err, 1,                                    OCI_FETCH_NEXT, 0, OCI_DEFAULT);    }    switch (sql->status) {    case OCI_SUCCESS:        (*rowp)->res = res;        return 0;    case OCI_NO_DATA:        return -1;    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:        return 1;    }    return 0;}static const char *dbd_oracle_error(apr_dbd_t *sql, int n){    /* This is ugly.  Needs us to pass in a buffer of unknown size.     * Either we put it on the handle, or we have to keep allocing/copying     */    sb4 errorcode;    switch (sql->status) {    case OCI_SUCCESS:        return "OCI_SUCCESS";    case OCI_SUCCESS_WITH_INFO:        return "OCI_SUCCESS_WITH_INFO";    case OCI_NEED_DATA:        return "OCI_NEED_DATA";    case OCI_NO_DATA:        return "OCI_NO_DATA";    case OCI_INVALID_HANDLE:        return "OCI_INVALID_HANDLE";    case OCI_STILL_EXECUTING:        return "OCI_STILL_EXECUTING";    case OCI_CONTINUE:        return "OCI_CONTINUE";    }    switch (OCIErrorGet(sql->err, 1, NULL, &errorcode,                        (text*) sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR)) {    case OCI_SUCCESS:        return sql->buf;     default:        return "internal error: OCIErrorGet failed";    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?