⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apr_dbd_sqlite3.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
            case APR_DBD_TYPE_CLOB:                {                char *data = (char *)values[j];                int size = atoi((char*)values[++j]);                /* skip table and column */                j += 2;                sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);                }                break;            default:                sqlite3_bind_text(stmt, i + 1, values[j],                                  strlen(values[j]), SQLITE_STATIC);                break;            }        }    }    return;}static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql,                              int *nrows, apr_dbd_prepared_t *statement,                              const char **values){    sqlite3_stmt *stmt = statement->stmt;    int ret = -1;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    apr_dbd_mutex_lock();    ret = sqlite3_reset(stmt);    if (ret == SQLITE_OK) {        dbd_sqlite3_bind(statement, values);        ret = dbd_sqlite3_query_internal(sql, stmt, nrows);        sqlite3_reset(stmt);    }    apr_dbd_mutex_unlock();    if (TXN_NOTICE_ERRORS(sql->trans)) {        sql->trans->errnum = ret;    }    return ret;}static int dbd_sqlite3_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->errnum) {        return sql->trans->errnum;    }    values = apr_palloc(pool, sizeof(*values) * statement->nvals);    for (i = 0; i < statement->nvals; i++) {        values[i] = va_arg(args, const char*);    }    return dbd_sqlite3_pquery(pool, sql, nrows, statement, values);}static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql,                               apr_dbd_results_t **results,                               apr_dbd_prepared_t *statement, int seek,                               const char **values){    sqlite3_stmt *stmt = statement->stmt;    int ret;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    apr_dbd_mutex_lock();    ret = sqlite3_reset(stmt);    if (ret == SQLITE_OK) {        dbd_sqlite3_bind(statement, values);        ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);        sqlite3_reset(stmt);    }    apr_dbd_mutex_unlock();    if (TXN_NOTICE_ERRORS(sql->trans)) {        sql->trans->errnum = ret;    }    return ret;}static int dbd_sqlite3_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->errnum) {        return sql->trans->errnum;    }    values = apr_palloc(pool, sizeof(*values) * statement->nvals);    for (i = 0; i < statement->nvals; i++) {        values[i] = va_arg(args, const char*);    }    return dbd_sqlite3_pselect(pool, sql, results, statement, seek, values);}static void dbd_sqlite3_bbind(apr_dbd_prepared_t * statement,                              const void **values){    sqlite3_stmt *stmt = statement->stmt;    int i, j;    apr_dbd_type_e type;    for (i = 0, j = 0; i < statement->nargs; i++, j++) {        type = (values[j] == NULL ? APR_DBD_TYPE_NULL : statement->types[i]);        switch (type) {        case APR_DBD_TYPE_TINY:            sqlite3_bind_int(stmt, i + 1, *(char*)values[j]);            break;        case APR_DBD_TYPE_UTINY:            sqlite3_bind_int(stmt, i + 1, *(unsigned char*)values[j]);            break;        case APR_DBD_TYPE_SHORT:            sqlite3_bind_int(stmt, i + 1, *(short*)values[j]);            break;        case APR_DBD_TYPE_USHORT:            sqlite3_bind_int(stmt, i + 1, *(unsigned short*)values[j]);            break;        case APR_DBD_TYPE_INT:            sqlite3_bind_int(stmt, i + 1, *(int*)values[j]);            break;        case APR_DBD_TYPE_UINT:            sqlite3_bind_int(stmt, i + 1, *(unsigned int*)values[j]);            break;        case APR_DBD_TYPE_LONG:            sqlite3_bind_int64(stmt, i + 1, *(long*)values[j]);            break;        case APR_DBD_TYPE_ULONG:            sqlite3_bind_int64(stmt, i + 1, *(unsigned long*)values[j]);            break;        case APR_DBD_TYPE_LONGLONG:            sqlite3_bind_int64(stmt, i + 1, *(apr_int64_t*)values[j]);            break;        case APR_DBD_TYPE_ULONGLONG:            sqlite3_bind_int64(stmt, i + 1, *(apr_uint64_t*)values[j]);            break;        case APR_DBD_TYPE_FLOAT:            sqlite3_bind_double(stmt, i + 1, *(float*)values[j]);            break;        case APR_DBD_TYPE_DOUBLE:            sqlite3_bind_double(stmt, i + 1, *(double*)values[j]);            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:            sqlite3_bind_text(stmt, i + 1, values[j], strlen(values[j]),                              SQLITE_STATIC);            break;        case APR_DBD_TYPE_BLOB:        case APR_DBD_TYPE_CLOB:            {            char *data = (char*)values[j];            apr_size_t size = *(apr_size_t*)values[++j];            sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);            /* skip table and column */            j += 2;            }            break;        case APR_DBD_TYPE_NULL:        default:            sqlite3_bind_null(stmt, i + 1);            break;        }    }    return;}static int dbd_sqlite3_pbquery(apr_pool_t * pool, apr_dbd_t * sql,                               int *nrows, apr_dbd_prepared_t * statement,                               const void **values){    sqlite3_stmt *stmt = statement->stmt;    int ret = -1;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    apr_dbd_mutex_lock();    ret = sqlite3_reset(stmt);    if (ret == SQLITE_OK) {        dbd_sqlite3_bbind(statement, values);        ret = dbd_sqlite3_query_internal(sql, stmt, nrows);        sqlite3_reset(stmt);    }    apr_dbd_mutex_unlock();    if (TXN_NOTICE_ERRORS(sql->trans)) {        sql->trans->errnum = ret;    }    return ret;}static int dbd_sqlite3_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,                                int *nrows, apr_dbd_prepared_t * statement,                                va_list args){    const void **values;    int i;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    values = apr_palloc(pool, sizeof(*values) * statement->nvals);    for (i = 0; i < statement->nvals; i++) {        values[i] = va_arg(args, const void*);    }    return dbd_sqlite3_pbquery(pool, sql, nrows, statement, values);}static int dbd_sqlite3_pbselect(apr_pool_t * pool, apr_dbd_t * sql,                                apr_dbd_results_t ** results,                                apr_dbd_prepared_t * statement,                                int seek, const void **values){    sqlite3_stmt *stmt = statement->stmt;    int ret;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    apr_dbd_mutex_lock();    ret = sqlite3_reset(stmt);    if (ret == SQLITE_OK) {        dbd_sqlite3_bbind(statement, values);        ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);        sqlite3_reset(stmt);    }    apr_dbd_mutex_unlock();    if (TXN_NOTICE_ERRORS(sql->trans)) {        sql->trans->errnum = ret;    }    return ret;}static int dbd_sqlite3_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,                                 apr_dbd_results_t ** results,                                 apr_dbd_prepared_t * statement, int seek,                                 va_list args){    const void **values;    int i;    if (sql->trans && sql->trans->errnum) {        return sql->trans->errnum;    }    values = apr_palloc(pool, sizeof(*values) * statement->nvals);    for (i = 0; i < statement->nvals; i++) {        values[i] = va_arg(args, const void*);    }    return dbd_sqlite3_pbselect(pool, sql, results, statement, seek, values);}static int dbd_sqlite3_start_transaction(apr_pool_t *pool,                                         apr_dbd_t *handle,                                         apr_dbd_transaction_t **trans){    int ret = 0;    int nrows = 0;    ret = dbd_sqlite3_query(handle, &nrows, "BEGIN IMMEDIATE");    if (!*trans) {        *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));        (*trans)->handle = handle;        handle->trans = *trans;    }    return ret;}static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans){    int ret = -1; /* ending transaction that was never started is an error */    int nrows = 0;    if (trans) {        /* rollback on error or explicit rollback request */        if (trans->errnum || TXN_DO_ROLLBACK(trans)) {            trans->errnum = 0;            ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK");        } else {            ret = dbd_sqlite3_query(trans->handle, &nrows, "COMMIT");        }        trans->handle->trans = NULL;    }    return ret;}static int dbd_sqlite3_transaction_mode_get(apr_dbd_transaction_t *trans){    if (!trans)        return APR_DBD_TRANSACTION_COMMIT;    return trans->mode;}static int dbd_sqlite3_transaction_mode_set(apr_dbd_transaction_t *trans,                                            int mode){    if (!trans)        return APR_DBD_TRANSACTION_COMMIT;    return trans->mode = (mode & TXN_MODE_BITS);}static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params,                                   const char **error){    apr_dbd_t *sql = NULL;    sqlite3 *conn = NULL;    int sqlres;    if (!params)        return NULL;    sqlres = sqlite3_open(params, &conn);    if (sqlres != SQLITE_OK) {        if (error) {            *error = apr_pstrdup(pool, sqlite3_errmsg(conn));        }        sqlite3_close(conn);        return NULL;    }    /* should we register rand or power functions to the sqlite VM? */    sql = apr_pcalloc(pool, sizeof(*sql));    sql->conn = conn;    sql->pool = pool;    sql->trans = NULL;    return sql;}static apr_status_t dbd_sqlite3_close(apr_dbd_t *handle){    apr_dbd_prepared_t *prep = handle->prep;    /* finalize all prepared statements, or we'll get SQLITE_BUSY on close */    while (prep) {        sqlite3_finalize(prep->stmt);        prep = prep->next;    }    sqlite3_close(handle->conn);    return APR_SUCCESS;}static apr_status_t dbd_sqlite3_check_conn(apr_pool_t *pool,                                           apr_dbd_t *handle){    return (handle->conn != NULL) ? APR_SUCCESS : APR_EGENERAL;}static int dbd_sqlite3_select_db(apr_pool_t *pool, apr_dbd_t *handle,                                 const char *name){    return APR_ENOTIMPL;}static void *dbd_sqlite3_native(apr_dbd_t *handle){    return handle->conn;}static int dbd_sqlite3_num_cols(apr_dbd_results_t *res){    return res->sz;}static int dbd_sqlite3_num_tuples(apr_dbd_results_t *res){    return res->tuples;}APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = {    "sqlite3",    NULL,    dbd_sqlite3_native,    dbd_sqlite3_open,    dbd_sqlite3_check_conn,    dbd_sqlite3_close,    dbd_sqlite3_select_db,    dbd_sqlite3_start_transaction,    dbd_sqlite3_end_transaction,    dbd_sqlite3_query,    dbd_sqlite3_select,    dbd_sqlite3_num_cols,    dbd_sqlite3_num_tuples,    dbd_sqlite3_get_row,    dbd_sqlite3_get_entry,    dbd_sqlite3_error,    dbd_sqlite3_escape,    dbd_sqlite3_prepare,    dbd_sqlite3_pvquery,    dbd_sqlite3_pvselect,    dbd_sqlite3_pquery,    dbd_sqlite3_pselect,    dbd_sqlite3_get_name,    dbd_sqlite3_transaction_mode_get,    dbd_sqlite3_transaction_mode_set,    "?",    dbd_sqlite3_pvbquery,    dbd_sqlite3_pvbselect,    dbd_sqlite3_pbquery,    dbd_sqlite3_pbselect,    dbd_sqlite3_datum_get};#endif

⌨️ 快捷键说明

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