/*
SQLiteWrapper.cpp
Copyright (C) 2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "stdafx.h"
#include "SQLiteWrapper.h"
// TODO: raus
#include <windows.h>
SQLiteWrapper::SQLiteWrapper() : db_(0) {
}
bool SQLiteWrapper::Open(std::string const& db_file) {
if (sqlite3_open(db_file.c_str(), &db_) != SQLITE_OK) {
return false;
}
return true;
}
bool SQLiteWrapper::SelectStmt(std::string const& stmt, ResultTable& res) {
char *errmsg;
int ret;
res.reset();
ret = sqlite3_exec(db_, stmt.c_str(), SelectCallback, static_cast<void*> (&res), &errmsg);
if (ret != SQLITE_OK) {
return false;
}
return true;
// if (ret != SQLITE_OK) {
// std::cout << stmt << " [" << errmsg << "]" << std::endl;
// }
}
// TODO parameter p_col_names
int SQLiteWrapper::SelectCallback(void *p_data, int num_fields, char **p_fields, char** p_col_names) {
ResultTable* res = reinterpret_cast<ResultTable*>(p_data);
ResultRecord record;
#ifdef SQLITE_WRAPPER_REPORT_COLUMN_NAMES
// Hubert Castelain: column names in the first row of res if res is empty
if(res->records_.size()==0) {
ResultRecord col_names;
for(int i=0; i < num_fields; i++) {
if(p_fields[i]) col_names.fields_.push_back (p_col_names[i]);
else
col_names.fields_.push_back("(null)"); // or what else ?
}
res->records_.push_back(col_names);
}
#endif
for(int i=0; i < num_fields; i++) {
// Hubert Castelain: special treatment if null
if (p_fields[i]) record.fields_.push_back(p_fields[i]);
else record.fields_.push_back("<null>");
}
res->records_.push_back(record);
return 0;
}
SQLiteStatement* SQLiteWrapper::Statement(std::string const& statement) {
SQLiteStatement* stmt;
try {
stmt = new SQLiteStatement(statement, db_);
return stmt;
}
catch (const char* e) {
return 0;
}
}
SQLiteStatement::SQLiteStatement(std::string const& statement, sqlite3* db) {
if ( sqlite3_prepare(
db,
statement.c_str(), // stmt
-1, // If than zero, then stmt is read up to the first nul terminator
&stmt_,
0 // Pointer to unused portion of stmt
)
!= SQLITE_OK) {
throw sqlite3_errmsg(db);
}
if (!stmt_) {
throw "stmt_ is 0";
}
}
SQLiteStatement::~SQLiteStatement() {
// Hubert Castelain 28/8/2005
// Prevent the database remaining locked after some statement.
// syntax: int sqlite3_finalize(sqlite3_stmt *pStmt);
if(stmt_) sqlite3_finalize(stmt_);
}
SQLiteStatement::SQLiteStatement() :
stmt_ (0)
{
}
bool SQLiteStatement::Bind(int pos_zero_indexed, std::string const& value) {
if (sqlite3_bind_text (
stmt_,
pos_zero_indexed+1, // Index of wildcard
value.c_str(),
value.length(), // length of text
SQLITE_TRANSIENT // SQLITE_TRANSIENT: SQLite makes its own copy
)
!= SQLITE_OK) {
return false;
}
return true;
}
bool SQLiteStatement::Bind(int pos_zero_indexed, double value) {
if (sqlite3_bind_double(
stmt_,
pos_zero_indexed+1, // Index of wildcard
value
)
!= SQLITE_OK) {
return false;
}
return true;
}
bool SQLiteStatement::Bind(int pos_zero_indexed, int value) {
if (sqlite3_bind_int(
stmt_,
pos_zero_indexed+1, // Index of wildcard
value
)
!= SQLITE_OK) {
return false;
}
return true;
}
bool SQLiteStatement::BindNull(int pos_zero_indexed) {
if (sqlite3_bind_null(
stmt_,
pos_zero_indexed+1 // Index of wildcard
)
!= SQLITE_OK) {
return false;
}
return true;
}
bool SQLiteStatement::Execute() {
int rc = sqlite3_step(stmt_);
if (rc == SQLITE_BUSY) {
//::MessageBox(0, "SQLITE_BUSY", 0, 0);
return false;
}
if (rc == SQLITE_ERROR) {
//::MessageBox(0, "SQLITE_ERROR", 0, 0);
return false;
}
if (rc == SQLITE_MISUSE) {
//::MessageBox(0, "SQLITE_ERROR", 0, 0);
return false;
}
if (rc != SQLITE_DONE) {
//sqlite3_reset(stmt_);
return false;
}
sqlite3_reset(stmt_);
return true;
}
SQLiteStatement::dataType SQLiteStatement::DataType(int pos_zero_indexed) {
return dataType(sqlite3_column_type(stmt_, pos_zero_indexed));
}
int SQLiteStatement::ValueInt(int pos_zero_indexed) {
return sqlite3_column_int(stmt_, pos_zero_indexed);
}
std::string SQLiteStatement::ValueString(int pos_zero_indexed) {
return std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt_, pos_zero_indexed)));
}
bool SQLiteStatement::RestartSelect() {
sqlite3_reset(stmt_);
return true;
}
bool SQLiteStatement::Reset() {
int rc = sqlite3_step(stmt_);
sqlite3_reset(stmt_);
if (rc == SQLITE_ROW) return true;
return false;
}
bool SQLiteStatement::NextRow() {
int rc = sqlite3_step(stmt_);
if (rc == SQLITE_ROW ) {
return true;
}
if (rc == SQLITE_DONE ) {
sqlite3_reset(stmt_);
return false;
}
else if (rc == SQLITE_MISUSE) {
//::MessageBox(0, "SQLiteStatement::NextRow SQLITE_MISUSE", 0, 0);
}
else if (rc == SQLITE_BUSY ) {
//::MessageBox(0, "SQLiteStatement::NextRow SQLITE_BUSY", 0, 0);
}
else if (rc == SQLITE_ERROR ) {
//::MessageBox(0, "SQLiteStatement::NextRow SQLITE_ERROR", 0, 0);
}
return false;
}
bool SQLiteWrapper::DirectStatement(std::string const& stmt) {
char *errmsg;
int ret;
ret = sqlite3_exec(db_, stmt.c_str(), 0, 0, &errmsg);
if(ret != SQLITE_OK) {
return false;
}
return true;
//if(ret != SQLITE_OK) {
// std::cout << stmt << " [" << errmsg << "]" << std::endl;
//}
}
std::string SQLiteWrapper::LastError() {
return sqlite3_errmsg(db_);
}
bool SQLiteWrapper::Begin() {
return DirectStatement("begin");
}
bool SQLiteWrapper::Commit() {
return DirectStatement("commit");
}
bool SQLiteWrapper::Rollback() {
return DirectStatement("rollback");
}
分享到:
相关推荐
QueryWrapper 常用用法
去CSDN下载所谓破解出现以下错误:wrapper | Licensed to (null) for (null) wrapper | wrapper | Launching a JVM... jvm 1 | WrapperManager: Initializing... jvm 1 | WrapperJNI Error: Not licensed to use ...
MyBatisPlus条件构造器 -Wrapper详解(为知笔记版,可用网页打开),详解wrapper条件构造器的各种使用方法及其扩展类的使用方法。
RDP Wrapper对应的配置文件,支持10.0.1904.1503
windows程序设计(珍藏版)_wrapper_wrapperwindows程序设计(珍藏版)_wrapper_wrapperwindows程序设计(珍藏版)_wrapper_wrapper
wrapper java window系统服务
RDP Wrapper10.0.19041.84,win10多用户
C:\Users\Administrator\.m2\wrapper 解压到这里 方便idea调用
10G以太网 wrapper 千兆万兆以太网控制器 wrapper 万兆
wrapper.h头文件都在里面了,我的操作系统实验作业源码是需要这里的头文件才可以运行,当然这个头文件只是相当于万能头文件,你也可以按自己的经验添加部分头文件即可运行我的源码。(最后拜托审核员大大不要修改我...
Kompex SQLite Wrapper Source
tcp_wrapper tcp_wrapper
Java Service Wrapper可以将Java程序包装成系统服务,这样就可以随着系统的运行而自动运行,本资源是linux 64位java环境下使用的wrapper资源,其他操作系统资源可以从地址:...下载
Java Maven Wrapper 0.4.2独立Jar包。
Java Service Wrapper使用总结,将java应用发布为可安装的服务
windows wrapper 相关文件,包括wrapper相关文档、配置说明文档。实现通过windows服务的方式启动java项目
【RDP Wrapper 配置文件更新脚本】 简介:由于 RDP Wrapper 多年未更新,自带的配置文件不支持新版本的远程桌面服务。因此我们只需更新配置文件即可。 用途:一键解决 RDP Wrapper 提示 Not listening [not ...
Java Service Wrapper使用说明
卡耐基梅隆 Kinect Wrapper Unity Package v2.9 较新SDK,更多资源讲解请到开发者官网查看 可以去unity资源店资源界面查看开发者的介绍
wrapper工具包制作windows服务