前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sqlite 接口封装(c++)

Sqlite 接口封装(c++)

作者头像
Freedom123
发布2024-03-29 08:27:23
680
发布2024-03-29 08:27:23
举报
文章被收录于专栏:DevOpsDevOps
代码语言:javascript
复制
#include "SqliteUtil.h"
#include <sstream>
#include <QDateTime>
#include <QFileInfo.h>
#include <iostream>

SqliteUtil::SqliteUtil(const QString& dbFileName)
{
	if (dbFileName.isEmpty()) {
		std::cout << "db filename is empty" << std::endl;
		return;
	}

	(void)open_db(dbFileName);
}
bool SqliteUtil::fun_insert_file(QByteArray buffer, QString sqlstr)
{
	sqlite3_stmt *stmt = NULL;
	//插入的sql语句,这里用?占位,代表BLOB数据
	auto rc = sqlite3_prepare_v2(m_db, sqlstr.toStdString().c_str(), -1, &stmt, NULL);
	if (rc != SQLITE_OK) { return false; }
	else {
		rc = sqlite3_bind_blob(stmt, 1, buffer.data(), buffer.size(), SQLITE_STATIC);
		if (rc != SQLITE_OK) {
			return false;
		}
		else {
			rc = sqlite3_step(stmt);
			if (rc != SQLITE_DONE)
				return false;
		}
	}
	sqlite3_finalize(stmt);
	buffer.clear();
	buffer.squeeze();
	return true;
}
bool SqliteUtil::fun_insert_files(QVector<QByteArray> vecbuffer, QString sqlstr)
{
	sqlite3_stmt *stmt = NULL;
	//插入的sql语句,这里用?占位,代表BLOB数据
	auto rc = sqlite3_prepare_v2(m_db, sqlstr.toStdString().c_str(), -1, &stmt, NULL);
	if (rc != SQLITE_OK) { return false; }
	else {
		for (int i = 0; i < vecbuffer.size(); i++)
		{
			rc = sqlite3_bind_blob(stmt, i+1, vecbuffer.at(i).data(), vecbuffer.at(i).size(), SQLITE_STATIC);
			if (rc != SQLITE_OK) {
				return false;
			}
		}
		rc = sqlite3_step(stmt);
		if (rc != SQLITE_DONE)
		return false;
	}
	sqlite3_finalize(stmt);
	vecbuffer.clear();
	return true;
}
SqliteUtil::~TDGISToolsSqliteDataCentre()
{
	close_db();
}

bool SqliteUtil::is_open()const
{
	return nullptr != m_db;
}

void SqliteUtil::close_db()
{
	if (!is_open()) {
		return;
	}
	sqlite3_close(m_db);
	m_db = nullptr;
}

bool SqliteUtil::open_db(const QString& dbfile)
{
	if (is_open()) {
		std::cout << m_dbFileName.toStdString() << " is already connect" << std::endl;
		return false;
	}

	QFileInfo fileInfo(dbfile);
	if (!fileInfo.isFile()) {
		std::cout << dbfile.toStdString() << " is not exist" << std::endl;
		return false;
	}

	std::string filepath = dbfile.toStdString().c_str();
	if (SQLITE_OK  != sqlite3_open(filepath.c_str(), &m_db)){
		std::string log = std::string("Can't open database : ") + sqlite3_errmsg(m_db);
		std::cout << log << std::endl;
		close_db();
		return false;
	}
	//记录打开的数据库名称
	m_dbFileName = dbfile;
	return true;
	
}

bool SqliteUtil::fun_sqlite3_exec(const std::string& sql)
{
	if (!is_open()) return false;

	auto rc = sqlite3_exec(m_db, sql.c_str(), NULL, 0, NULL);
	if (rc == SQLITE_OK) {
		return true;
	}
	return false;
}
bool SqliteUtil::fun_sqlite3_get_table(std::function<void(char **, int, int) > f, const std::string& sql)
{
	if (!is_open()) return false;
	char **pazResult;
	int pnRow;
	int pnColumn;
	auto rc = sqlite3_get_table(m_db, sql.c_str(), &pazResult, &pnRow, &pnColumn, NULL);
	if (rc == SQLITE_OK) {
		f(pazResult, pnRow, pnColumn);
		sqlite3_free_table(pazResult);
		return true;
	}
	return false;
}

bool SqliteUtil::get_count(const std::string& sql, int& iCount)
{
	auto fun = [&iCount](char **pazResult, int pnRow, int pnColumn) {
		if (nullptr == pazResult) {
			return;
		}
		char* pCount = pazResult[pnColumn];
		if ((nullptr == pCount)) {
			return;
		}

		iCount = atoi(pCount);
	};

	return fun_sqlite3_get_table(fun,sql);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档