// DBOp.cpp : 定义 DLL 应用程序的导出函数。//#include "../stdafx.h"#include "SqliteOp.h"#include <sstream>#include "../BasicTool/CFileMgr.h"#include "../BasicTool/cchinesecode.h"// 这是已导出类的构造函数。// 有关类定义的信息,请参阅 DBOp.hCSqliteOp::CSqliteOp(std::string path){m_path=path;m_db=NULL;}bool CSqliteOp::IsIniDB(){if(m_path.length()<2)return false;return true;}sqlite3 *CSqliteOp::OpenSqlite(){sqlite3 *db=NULL;sqlite3_open16(m_path.c_str(),&db);return db;}void CSqliteOp::CloseSqlite(sqlite3 *db){sqlite3_close(db);}CSqliteOp::~CSqliteOp(void){}//初始化DBint CSqliteOp::InitDB(std::string &path){int len=256;wchar_t *pathstr=new wchar_t[len];memset(pathstr,0,len);CChineseCode::charTowchar(path.c_str(),pathstr,len);// return 1;CFileMgr mgr;if(!mgr.IsExist((LPCTSTR)pathstr)){std::wstring patj(pathstr);int ll=patj.find_last_of(_T("\\"));if(ll>0)patj=patj.substr(0,ll);mgr.CreateDirectory((LPCTSTR)patj.c_str());}m_path=path;sqlite3_open16(pathstr,&m_db);delete pathstr;// 打开或创建数据库if(m_db==NULL){return 0;}{if(!IsTableExt(std::string("FileDownUpManage"))){std::stringstream bbcc;bbcc<<"CREATE table FileDownUpManage(Id TEXT NOT NULL, Path TEXT,";bbcc<<"FileSize NUMERIC,";bbcc<<"DownUpSize NUMERIC,";bbcc<<"DownUpType NUMERIC NOT NULL,";bbcc<<"Finish NUMERIC,";bbcc<<"StartTime NUMERIC,";bbcc<<"EndTime NUMERIC,";bbcc<<"Remark TEXT,primary key(Id,DownUpType))";std::string sql=bbcc.str();CreateTable(m_db,sql);}if(!IsTableExt(std::string("VidoFileMap"))){std::stringstream bbcc;bbcc<<"CREATE table VidoFileMap(Path TEXT NOT NULL, AliasName TEXT,";bbcc<<"id TEXT,";bbcc<<"classId TEXT,";bbcc<<"courseId TEXT,";bbcc<<"courseUid TEXT,";bbcc<<"courseName TEXT,";bbcc<<"lecturer TEXT,";bbcc<<"lecturerUid TEXT,";bbcc<<"phase TEXT,";bbcc<<"description TEXT,";bbcc<<"grade NUMERIC,";bbcc<<"subjectCode NUMERIC,";bbcc<<"subjectName TEXT,";bbcc<<"startTime TEXT,";bbcc<<"endTime TEXT,";bbcc<<"uid TEXT,";bbcc<<"ctime TEXT,";bbcc<<"type NUMERIC default 1,";bbcc<<"strPhase TEXT,";bbcc<<"strGrade TEXT,";bbcc<<"strSubJect TEXT,";bbcc<<"strbookVersion TEXT,";bbcc<<"strUnit TEXT,";bbcc<<"strLesson TEXT,";bbcc<<"strPhaseName TEXT,";bbcc<<"strGradeName TEXT,";bbcc<<"strSubJectName TEXT,";bbcc<<"strbookVersionName TEXT,";bbcc<<"strUnitName TEXT,";bbcc<<"strLessonName TEXT,";bbcc<<"strBookId TEXT,";bbcc<<"MD5 TEXT,";//打算将来把主键改成MD5//bbcc<<"primary key(MD5))";bbcc<<"primary key(Path))";std::string sql=bbcc.str();CreateTable(m_db,sql);}}return 1;}int CSqliteOp::IsTableExt(std::string &name){IsIniDB();sqlite3 *db=NULL;sqlite3_open16(m_path.c_str(),&db);// 打开或创建数据库if(db==NULL){return -1;}std::string sqltxt=std::string("SELECT count(*) as num FROM sqlite_master WHERE type='table' AND name='")+name+std::string("' ");char** pResult=NULL;int nRow=-1;int nColumn=-1;sqlite3_get_table(db, /* An open database */sqltxt.c_str() , /* SQL to be evaluated */&pResult, /* Results of the query */&nRow, /* Number of result rows written here */&nColumn, /* Number of result columns written here */NULL /* Error msg written here */);std::string strOut="";int nIndex = nColumn;if(nRow>-1&&nColumn>-1&&pResult!=NULL){strOut+= pResult[nColumn];}sqlite3_free_table(pResult);pResult=NULL;int Ok=atoi(strOut.c_str());//如果表不存在则创建if(Ok<1){return 0;}return 1;}int CSqliteOp::CreateTable(sqlite3 *db,std::string &sqltxt){const char *sqlstr=sqltxt.c_str();char errstr[256]={};char *perrstr=errstr;int result= sqlite3_exec(db, /* An open database */sqlstr,NULL,NULL,&perrstr);if(SQLITE_OK!=result){//输出sqlite3错误信息//TRACE0(perrstr);}return result;}//执行sql操作int CSqliteOp::SelectSql(sqlite3 *db,std::string &sqltxt,Json::Value &JsonResult){JsonResult.clear();std::string abc=sqltxt;const char *sqlstr=abc.c_str();std::map<int,std::string> strFiedType;char** pResult;int nRow=-1;int nColumn=-1;std::string strOut="";int nIndex = nColumn;//分析sql语句sqlite3_stmt* stmt2 = NULL;if (sqlite3_prepare_v2(db,sqlstr,strlen(sqlstr),&stmt2,NULL) != SQLITE_OK) {if (stmt2)sqlite3_finalize(stmt2);return -1;}//7. 遍历结果集中每个字段meta信息,并获取其声明时的类型。int fieldCount = sqlite3_column_count(stmt2);for (int i = 0; i < fieldCount; ++i) {//由于此时Table中并不存在数据,再有就是SQLite中的数据类型本身是动态的,所以在没有数据时//无法通过sqlite3_column_type函数获取,此时sqlite3_column_type只会返回SQLITE_NULL,//直到有数据时才能返回具体的类型,因此这里使用了sqlite3_column_decltype函数来获取表声//明时给出的声明类型。std::string stype = sqlite3_column_decltype(stmt2,i);stype = strlwr((char*)stype.c_str());//下面的解析规则见该系列的"数据类型-->1. 决定字段亲缘性的规则"部分,其链接如下://http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325258.htmlif (stype.find("numeric") != std::string::npos){strFiedType.insert(std::pair<int,std::string>(i,"int"));} elseif ( stype.find("char") != std::string::npos|| stype.find("text") != std::string::npos){strFiedType.insert(std::pair<int,std::string>(i,"string"));} elseif (stype.find("real") != std::string::npos|| stype.find("floa") != std::string::npos|| stype.find("doub") != std::string::npos ){strFiedType.insert(std::pair<int,std::string>(i,"double"));}else{strFiedType.insert(std::pair<int,std::string>(i,"string"));}}int result= sqlite3_get_table(db, /* An open database */sqlstr, /* SQL to be evaluated */&pResult, /* Results of the query */&nRow, /* Number of result rows written here */&nColumn, /* Number of result columns written here */NULL /* Error msg written here */);//读出sqlite数据nIndex = nColumn;for(int i=0;i<nRow;i++){Json::Value JsonValue;for(int j=0;j<nColumn;j++){std::string stype=strFiedType[j];if(stype.find("int") != std::string::npos){char * ppp=pResult[j];char * ppp2=pResult[nIndex];if(ppp2==NULL)ppp2="-1";JsonValue[ppp]=atoi(ppp2);//JsonValue[pResult[j]]=atoi(pResult[nIndex]);}if(stype.find("string") != std::string::npos){char * ppp=pResult[j];char * ppp2=pResult[nIndex];if(ppp2==NULL)ppp2="";JsonValue[ppp]=ppp2;}if(stype.find("double") != std::string::npos){JsonValue[pResult[j]]=atof(pResult[nIndex]);}++nIndex;}JsonResult.append(JsonValue);}sqlite3_free_table(pResult);if (stmt2)sqlite3_finalize(stmt2);return 0;}int CSqliteOp::NoSelectSql(sqlite3 *db,std::string &sqltxt){char** pResult;int nRow=-1;int nColumn=-1;std::string strOut="";int nIndex = nColumn;const char *sqlstr=sqltxt.c_str();//sqlite3_free_table()int result= sqlite3_get_table(db, /* An open database */sqlstr, /* SQL to be evaluated */&pResult, /* Results of the query */&nRow, /* Number of result rows written here */&nColumn, /* Number of result columns written here */NULL /* Error msg written here */);//result != SQLITE_OKreturn result;}// 开始事务bool CSqliteOp::BeginTransaction(sqlite3 *db){char * errmsg = NULL;if(sqlite3_exec(db,"BEGIN TRANSACTION;",NULL,NULL,&errmsg) != SQLITE_OK){return FALSE;}return TRUE;}// 提交事务bool CSqliteOp::CommitTransaction(sqlite3 *db){char * errmsg = NULL;if(sqlite3_exec(db,"COMMIT TRANSACTION;;",NULL,NULL,&errmsg) != SQLITE_OK){return FALSE;}return TRUE;}// 回滚事务bool CSqliteOp::RollbackTransaction(sqlite3 *db){char * errmsg = NULL;if(sqlite3_exec(db,"ROLLBACK TRANSACTION;",NULL,NULL,&errmsg) != SQLITE_OK){return FALSE;}return TRUE;}bool CSqliteOp::ExcuteNonQuery16(sqlite3 *db,wchar_t *lpSql){if(lpSql == NULL){return FALSE;}sqlite3_stmt* stmt;if(sqlite3_prepare16_v2(db,(void*) lpSql, -1, &stmt, NULL) != SQLITE_OK){return FALSE;}sqlite3_step(stmt);return (sqlite3_finalize(stmt) == SQLITE_OK) ? TRUE : FALSE ;}bool CSqliteOp::ExcuteNonQuery(sqlite3 *db,char* lpSql){if(lpSql == NULL){return FALSE;}sqlite3_stmt* stmt;if(sqlite3_prepare_v2(db, lpSql, -1, &stmt, NULL) != SQLITE_OK){return FALSE;}sqlite3_step(stmt);return (sqlite3_finalize(stmt) == SQLITE_OK) ? TRUE : FALSE ;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。