#include "StdAfx.h"
#include "DataImpl.h"

#define DBCREATE _T("CREATE TABLE \"mod\" (\
\"mod_name\"  TEXT NOT NULL,\
\"mod_addr\"  TEXT NOT NULL,\
\"mod_ver\"  TEXT NOT NULL,\
PRIMARY KEY (\"mod_name\")\
);")

CDataImpl::CDataImpl(void):m_psqlite3(NULL),m_pszErrmsg(NULL)
{
}

CDataImpl::~CDataImpl(void)
{
}

BOOL CDataImpl::Open()
{
	Close();
	CHAR szpath[MAX_PATH] = {0};
	_stprintf_s(szpath, _T("%ssvn.db"), Global::g_szModulePath );
	bool bCreate = false;
	if ( !PathFileExists(szpath) )
		bCreate = true;

	string strPath;
	if ( !CharEncoding::ASCII2UTF8(szpath,strPath))
	{
		return FALSE;
	}

	INT nResult = sqlite3_open(strPath.c_str(), &m_psqlite3);
	if ( nResult != SQLITE_OK )
		return FALSE;

	if ( bCreate )
		ExecteSQL(DBCREATE);

	return TRUE;
}

void CDataImpl::Close()
{
	if ( m_psqlite3 )
		sqlite3_close(m_psqlite3);

	m_psqlite3 = NULL;
}

BOOL CDataImpl::ExecteSQL(IN LPCSTR lpSQL)
{
	if ( lpSQL == NULL || lpSQL[0] == '\0' )
	{
		Global::WriteTextLog(_T("ExecteSQL��ִ�����գ�"));
		return FALSE;
	}

	if(m_psqlite3 == NULL)
		return FALSE;

	char* psqlite_error = NULL;
	int sqlite_error = sqlite3_exec(m_psqlite3, lpSQL, NULL, 0, &psqlite_error);
	if(SQLITE_OK != sqlite_error)
	{
		Global::WriteTextLog(_T("ExecteSQL:%s"), psqlite_error);
		return FALSE;
	}

	return TRUE;
}

INT CDataImpl::QueryModInfo(IN OUT std::vector<STModInfo*> &vtModInfo)
{
	if ( m_psqlite3 == NULL )
		return -1;

	INT nRow = 0;
	INT nCol = 0;

	char** pazResult = NULL;
	int sqlite_error = sqlite3_get_table(m_psqlite3, "select mod_name, mod_addr, mod_ver from mod", &pazResult, &nRow, &nCol, &m_pszErrmsg);
	if ( sqlite_error != SQLITE_OK)
	{
		Global::WriteTextLog(_T("QueryModInfo:%s"), m_pszErrmsg);
		return -1;
	}

	for(int i = 1; i <= nRow; i++)
	{
		STModInfo* pTagObj = new STModInfo();
#ifndef USE_UTF8
		pTagObj->strName = pazResult[i*nCol + 0];
		pTagObj->strAddress = pazResult[i*nCol + 1];
		pTagObj->strVersion = pazResult[i*nCol + 2];
#else
		// ��Native for SQLite3��������ݣ�����utf8��ʽ;
		CharEncoding::UTF82ASCII(pazResult[i*nCol + 0], pTagObj->strName);
		CharEncoding::UTF82ASCII(pazResult[i*nCol + 1], pTagObj->strAddress);
		CharEncoding::UTF82ASCII(pazResult[i*nCol + 2], pTagObj->strVersion);
#endif
		pTagObj->_check = false;

		vtModInfo.push_back(pTagObj);
	}

	sqlite3_free_table(pazResult);

	return nRow;
}


BOOL CDataImpl::InsertModInfo(IN STModInfo &stModInfo)
{
	return InsertModInfo(stModInfo.strName.c_str(), stModInfo.strAddress.c_str(), stModInfo.strVersion.c_str());
}

BOOL CDataImpl::InsertModInfo(IN LPCSTR lpModName, IN LPCSTR lpModAddress, IN LPCSTR lpModVerion)
{
	if ( lpModName == NULL || lpModName[0] == '\0' ||
		lpModAddress == NULL || lpModAddress[0] == '\0' ||
		lpModVerion == NULL || lpModVerion[0] == '\0'	)
	{
		Global::WriteTextLog(_T("InsertModInfo�������գ�"));
		return FALSE;
	}

	if(m_psqlite3 == NULL)
		return FALSE;

	string strInsert = "INSERT INTO mod(mod_name,mod_addr,mod_ver) VALUES ('";
#ifndef USE_UTF8
	strInsert.append(lpModName);
	strInsert.append("','");
	strInsert.append(lpModAddress);
	strInsert.append("','");
	strInsert.append(lpModVerion);
	strInsert.append("');");
#else
	string str;
	CharEncoding::ASCII2UTF8(lpModName,str);
	strInsert.append(str);

	strInsert.append("','");
	CharEncoding::ASCII2UTF8(lpModAddress,str);
	strInsert.append(str);

	strInsert.append("','");
	CharEncoding::ASCII2UTF8(lpModVerion,str);
	strInsert.append(str);

	strInsert.append("');");
#endif

	char* psqlite_error = NULL;
	int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
	if(SQLITE_OK != sqlite_error)
	{
		Global::WriteTextLog(_T("InsertModInfo:%s"), psqlite_error);
		return FALSE;
	}

	return TRUE;
}

BOOL CDataImpl::UpdateModInfo(IN STModInfo &stModInfo)
{
	return UpdateModInfo(stModInfo.strName.c_str(), stModInfo.strAddress.c_str(), stModInfo.strVersion.c_str());
}

BOOL CDataImpl::UpdateModInfo(IN LPCSTR lpModName, IN LPCSTR lpModAddress, IN LPCSTR lpModVerion)
{
	if (lpModName == NULL || lpModName[0] == '\0' || 
		lpModAddress == NULL || lpModAddress[0] == '\0' ||
		lpModVerion == NULL || lpModVerion[0] == '\0' )
	{
		Global::WriteTextLog(_T("UpdateContactsInfo�������գ�"));
		return FALSE;
	}

	if(m_psqlite3 == NULL)
		return FALSE;

	string strUpdate = "UPDATE mod SET mod_addr = '";
#ifndef USE_UTF8
	strUpdate.append(lpModVerion);
	strUpdate.append("', mod_ver = '");
	strUpdate.append(lpModAddress);
	strUpdate.append("' WHERE mod_name = '");
	strUpdate.append(lpModName);
	strUpdate.append("';");
#else
	string str;
	CharEncoding::ASCII2UTF8(lpModVerion,str);
	strUpdate.append(str);

	strUpdate.append("', mod_ver = '");
	CharEncoding::ASCII2UTF8(lpModAddress,str);
	strUpdate.append(str);

	strUpdate.append("' WHERE mod_name = '");
	strUpdate.append(lpModName);
	strUpdate.append("';");
#endif

	char* psqlite_error = NULL;
	int sqlite_error = sqlite3_exec(m_psqlite3, strUpdate.c_str(), NULL, 0, &psqlite_error);
	if(SQLITE_OK != sqlite_error)
	{
		Global::WriteTextLog(_T("UpdateModInfo:%s"), psqlite_error);
		return FALSE;
	}

	return TRUE;
}

BOOL CDataImpl::DeleteModInfo(IN STModInfo &stModInfo)
{
	return DeleteModInfo(stModInfo.strName.c_str());
}

BOOL CDataImpl::DeleteModInfo(IN LPCSTR lpModName)
{
	if (lpModName == NULL || lpModName[0] == '\0' )
	{
		Global::WriteTextLog(_T("DeleteModInfo�������գ�"));
		return FALSE;
	}

	if (m_psqlite3 == NULL)
		return FALSE;

	string strDelete = "DELETE FROM mod WHERE mod_name ='";
	strDelete.append(lpModName);
	strDelete.append("';");

	char* psqlite_error = NULL;
	int sqlite_error = sqlite3_exec(m_psqlite3, strDelete.c_str(), NULL, 0, &psqlite_error);
	if (SQLITE_OK != sqlite_error)
	{
		Global::WriteTextLog(_T("DeleteModInfo:%s"), psqlite_error);
		return FALSE;
	}

	return TRUE;
}