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