📄 apr_dbd_sqlite3.c
字号:
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 + -