#include "StdAfx.h"
#include "ISQLite3.h"
#include "StringProcess.h"

ISQLite3::ISQLite3(void)
{
	m_pSQLite3 = NULL;
}

ISQLite3::~ISQLite3(void)
{
	Close();
}

/************************************************************************/
/*	
	函数: OpenSQLite3DB
	描述: 打开数据库
	参数: 
		pDBPath				数据库路径
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Open(const char* pszpath)
{
	if(pszpath == NULL)
		return -1;

	char szpath[MAX_PATH] = {0};
	if ( StringProcess::ascii_to_utf8(pszpath, szpath) == 0)
	{
		return -1;
	}

	int sqlite_error = -1;
	sqlite_error = sqlite3_open(pszpath, &m_pSQLite3);
	if( sqlite_error == 14 )
		return -1;

	return 0;
}

/************************************************************************/
/*	
	函数: CreateTabel
	描述: 创建表create table remoteinfo([inuse] int not null,[branch] text not null,[ip] text not null,[domain] text not null,primary key([domain]));"
	参数: 
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::CreateTabel(const char* pSql, CString& strError)
{
	if(m_pSQLite3 == NULL || pSql == NULL)
		return -1;

	char* psqlite_error = NULL;
	int nRet = sqlite3_exec(m_pSQLite3, pSql, NULL, 0, &psqlite_error);
	if(nRet != SQLITE_OK && nRet != 1)
	{
		/*
		WCHAR wszError[512] = {0};
		ascii2unicode(psqlite_error, wszError);
		strError = wszError;
		*/
		strError = psqlite_error;
		return -1;
	}
	return 0;
}

/************************************************************************/
/*	
	函数: Get_ErrMsg
	描述: 获取错误消息
	参数: 
	返回: 
	注意: 返回错误消息
*/
/************************************************************************/
const char* ISQLite3::Get_ErrMsg()
{
	return sqlite3_errmsg(m_pSQLite3);
}

/************************************************************************/
/*	
	函数: Exec
	描述: 执行SQL
	参数: 
		pSql		sql语句	
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Exec(const char* pSql, CString& strError)
{
	if(m_pSQLite3 == NULL)
		return -1;

	char* psqlite_error = NULL;
	int sqlite_error = sqlite3_exec(m_pSQLite3, pSql, NULL, 0, &psqlite_error);
	if(SQLITE_OK != sqlite_error)
	{
#ifdef _UNICODE
		WCHAR wszError[512] = {0};
		StringProcess::ascii_to_unicode(wszError, psqlite_error);
		strError = wszError;
#else
		strError = psqlite_error;
#endif
		return -1;
	}
	return 0;
}

/************************************************************************/
/*	
	函数: Select
	描述: 表查询
	参数: 
		const char* pTableName		表名
		const char* pFields,		一个字段或多个字段如:字段1,字段2,字段3...
		const char* pLimit,			where 条件如：字段1='xx',字段2='xxx'
		char* pazResult,			返回结果集
		int* pnRow,					返回执行行数
		int* pnCol,					返回执行列数
		CString& strError			如果失败返回错误消息
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Select(const char* pTableName, const char* pFields, const char* pLimit, std::vector<TString>& vValues, CString& strError)
{
	if(m_pSQLite3 == NULL || pTableName == NULL || pFields == NULL)
		return -1;

	char* psqlite_error = NULL;
	char szSql[MAX_PATH] = {0};
	if(pLimit == NULL || strcmp(pLimit, "") == 0)
		sprintf(szSql, "select %s from %s;", pFields, pTableName);
	else
		sprintf(szSql, "select %s from %s where %s;", pFields, pTableName, pLimit);

	int nRow(0), nCol(0);
	char** pazResult = NULL;
	int sqlite_error = sqlite3_get_table(m_pSQLite3, szSql, &pazResult, &nRow, &nCol, &psqlite_error);
	if ( sqlite_error != SQLITE_OK)
	{
#ifdef _UNICODE
		WCHAR wszError[512] = {0};
		StringProcess::ascii_to_unicode(wszError, psqlite_error);
		strError = wszError;
#else
		strError = psqlite_error;
#endif
		return -1;
	}

	for(int i=1; i<=nRow; i++)
	{
		for(int j = 0; j<nCol; j++)
		{
#ifdef _UNICODE
			WCHAR wszValue[256] = {0};
			StringProcess::ascii_to_unicode(pazResult[i*nCol + j], wszValue);
			vValues.push_back(wszValue);
#else
			vValues.push_back(pazResult[i*nCol + j]);
#endif
			
		}
	}

	sqlite3_free_table(pazResult);
	

	return 0;
}

/************************************************************************/
/*	
	函数: Insert
	描述: 添加数据到表
	参数: 
		const char* pTableName,				表名
		const char* pFields,				字段集
		const char* pValues,				要插的数据集
		CString& strError					返回错误消息
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Insert(const char* pTableName, const char* pFields, const char* pValues, CString& strError)
{
	if(m_pSQLite3 == NULL || pTableName == NULL || pFields == NULL || pValues == NULL)
		return -1;

	char szSql[MAX_PATH] = {0};
	sprintf(szSql, "insert into %s(%s) values (%s);", pTableName, pFields, pValues);
	return Exec(szSql, strError);
}

/************************************************************************/
/*	
	函数: Delete
	描述: 删除 delete from table_name where field=''
	参数: 
		const char* pTableName,				表名
		const char* pFields,				字段集
		const char* pValues,				要插的数据集
		CString& strError					返回错误消息
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Delete(const char* pTableName, const char* pLimit, CString& strError)
{
	if(m_pSQLite3 == NULL || pTableName == NULL || pLimit == NULL)
		return -1;

	char szSql[MAX_PATH] = {0};
	sprintf(szSql, "delete from %s where %s;", pTableName, pLimit);
	return Exec(szSql, strError);
}

/************************************************************************/
/*	
	函数: Colse
	描述: 关闭
	参数: 
	返回: 
	注意: 0成功, -1失败;
*/
/************************************************************************/
int ISQLite3::Close()
{
	if(m_pSQLite3)
		sqlite3_close(m_pSQLite3);
	m_pSQLite3 = NULL;
	return 0;
}