/*!
	プロフ名、ルートパスを変更
	@param[in]	ptProfName	プロフ名
	@param[in]	ptRootPath	AAのルートダディレクトリ名
	@return	HRESULT	終了状態コード
*/
HRESULT SqlTreeProfUpdate( LPCTSTR ptProfName, LPCTSTR ptRootPath )
{
	//	1ファイルに付き1レコードしか存在しないので、IDは1固定
	CONST  TCHAR	catUpdateName[] = { TEXT("UPDATE Profiles SET profname = '%s' WHERE id == 1") };
	CONST  TCHAR	catUpdateRoot[] = { TEXT("UPDATE Profiles SET rootpath = '%s' WHERE id == 1") };

	TCHAR	atText[MAX_PATH];
	INT		rslt;
	sqlite3_stmt	*statement;

	//	トランザクションのON/OFFは必要に応じて外でヤル

	if( ptProfName )
	{
		StringCchPrintf( atText, MAX_PATH, catUpdateName, ptProfName );

		rslt = sqlite3_prepare16( gpDataBase, atText, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_OUTOFMEMORY;	}
		rslt = sqlite3_step( statement );	if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	}
		sqlite3_finalize( statement );
	}

	if( ptRootPath )
	{
		StringCchPrintf( atText, MAX_PATH, catUpdateRoot, ptRootPath );

		rslt = sqlite3_prepare16( gpDataBase, atText, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_OUTOFMEMORY;	}
		rslt = sqlite3_step( statement );	if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	}
		sqlite3_finalize( statement );
	}

	return S_OK;
}
Beispiel #2
0
void sqliteManager::insertInactivityRows() {
    std::wstring query = L"insert into App(id, name) values (0, 'INACTIVITY');";
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );

    query = L"insert into Document(id, title) values (0, 'INACTIVITY');";
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );
}
Beispiel #3
0
sqlite3_command::sqlite3_command(sqlite3_connection &con, const wchar_t *sql) : con(con),refs(0) {
	const wchar_t *tail=NULL;
	if(sqlite3_prepare16(con.db, sql, -1, &this->stmt, (const void**)&tail)!=SQLITE_OK)
		throw database_error(con);

	this->argc=sqlite3_column_count(this->stmt);
}
Beispiel #4
0
bool SQLiteResult::prepare(const QString &query)
{
    if (!driver() || !driver()->isOpen() || driver()->isOpenError())
        return false;

    d->cleanup();

    setSelect(false);

    const void *pzTail = NULL;

#if (SQLITE_VERSION_NUMBER >= 3003011)
    int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
                                   &d->stmt, &pzTail);
#else
    int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
                                &d->stmt, &pzTail);
#endif

    if (res != SQLITE_OK) {
#if defined(SQLITEDRIVER_DEBUG)
        trace(NULL, query.toUtf8().constData());
#endif
        setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult",
                     "Unable to execute statement"), QSqlError::StatementError, res));
        d->finalize();
        return false;
    } else if (pzTail && !stringFromUnicode(reinterpret_cast<const QChar *>(pzTail)).trimmed().isEmpty()) {
        setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult",
            "Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE));
        d->finalize();
        return false;
    }
    return true;
}
Beispiel #5
0
    bool prepare()
    {
      if (NULL != stmt)
      {
        return true; // already prepared
      }

      int nResult;
      TCHAR const* pszTail;
#if defined(_UNICODE) || defined(UNICODE)
      nResult = sqlite3_prepare16(db, sql, -1, &stmt, (void const**)&pszTail);
#else
      nResult = sqlite3_prepare(db, sql, -1, &stmt, &pszTail);
#endif

      if (SQLITE_OK != nResult)
      {
#if defined(SQLGG_DEBUG)
        printf("sqlite3_prepare error (%u):%s\n%s\n",nResult,sqlite3_errmsg(db),sql);
#endif
        assert(false);
        return false;
      }

      return true;
    }
	sqlite3_command::sqlite3_command(sqlite3_connection &con, const std::wstring &sql) : con(con),stmt(0),refs(0),argc(0) {
		const void *tail=NULL;
		if(sqlite3_prepare16(con.db(), sql.data(), (int)sql.length()*2, &this->stmt, &tail)!=SQLITE_OK)
			throw database_error(con);

		this->argc=sqlite3_column_count(this->stmt);
	}
Beispiel #7
0
char * sqlite_colunm_name(sqlite3 * pSqlite3, sqlite3_stmt ** pSqlite3_Stmt, const char * pszSQL, const unsigned int &nColunmID = 0)
#endif
{
	static char szColunm[128];
	char * pszColunm_Name;
	/* 检查参数 */
	if (pSqlite3 == NULL) {
	pSqlite3_Stmt = NULL;
	return (char *)NULL;
	}
	memset(szColunm, 0, 128);
	if (sqlite3_prepare(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
	if (sqlite3_prepare16(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
	pSqlite3_Stmt = NULL;
	return (char *)NULL;
	}
	}
	if (sqlite3_step(*pSqlite3_Stmt) != SQLITE_ROW) {
	if (pSqlite3_Stmt != NULL) {
	sqlite3_finalize(*pSqlite3_Stmt);
	pSqlite3_Stmt = NULL;
	}
	return (char *)NULL;
	}
	pszColunm_Name = (char *)sqlite3_column_name(*pSqlite3_Stmt, nColunmID);
	sprintf(szColunm, "%s", pszColunm_Name == NULL ? "" : pszColunm_Name);
	if (*pSqlite3_Stmt != NULL) {
	sqlite3_finalize(*pSqlite3_Stmt);
	pSqlite3_Stmt = NULL;
	}
	return szColunm;
}
void DoEncodingTest(sqlite3* aDb)
	{
	sqlite3_stmt* stmt = NULL;
  	const void* tail = 0;

	TInt err = sqlite3_prepare16(aDb, _S16("PRAGMA encoding"), -1, &stmt, &tail);
	TEST2(err, SQLITE_OK);
	TEST((unsigned int)stmt);
	TEST(!tail || User::StringLength((const TUint16*)tail) == 0);

	err = sqlite3_step(stmt);
	TEST2(err, SQLITE_ROW);
	
	const unsigned char* enc = sqlite3_column_text(stmt, 0);
	TEST(enc != NULL);

	//The encoding should be UTF16
	_LIT8(KEnc, "16");
	TPtrC8 ptr(enc);
	err = ptr.Find(KEnc);
	TEST(err >= 0);

	err = sqlite3_step(stmt);
	TEST2(err, SQLITE_DONE);
		
	sqlite3_finalize(stmt);
	}
/*!
	指定の名前のディレクトリはルートにあるので?
	@param[out]	ptDirName	ノードの名称
	@return	UINT			0無かった 1〜ヒットしたID
*/
UINT SqlTreeNodeRootSearch( LPTSTR ptDirName )
{
	TCHAR	atQuery[BIG_STRING];
	INT		rslt;
	UINT	id = 0;
	sqlite3_stmt*	statement;


	if( !(gpDataBase) ){	return 0;	}

	StringCchPrintf( atQuery, BIG_STRING, TEXT("SELECT id FROM TreeNode WHERE parentid == 0 AND nodename == '%s'"), ptDirName );

	rslt = sqlite3_prepare16( gpDataBase, atQuery, -1, &statement, NULL );
	if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return 0;	}

	rslt = sqlite3_step( statement );
	if( SQLITE_ROW == rslt )
	{
		id = sqlite3_column_int( statement, 0 );	//	id
	}

	sqlite3_finalize( statement );

	return id;
}
Beispiel #10
0
bool QSpatiaLiteResult::prepare(const QString &query)
{
    if (!driver() || !driver()->isOpen() || driver()->isOpenError())
        return false;

    d->cleanup();

    setSelect(false);

    const void *pzTail = NULL;

#if (SQLITE_VERSION_NUMBER >= 3003011)
    int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
                                   &d->stmt, &pzTail);
#else
    int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
                                &d->stmt, &pzTail);
#endif

    if (res != SQLITE_OK) {
        setLastError(qMakeError(d->access, QCoreApplication::translate("QSpatiaLiteResult",
                     "Unable to execute statement"), QSqlError::StatementError, res));
        d->finalize();
        return false;
    } else if (pzTail && !QString::fromUtf16( (const ushort *) pzTail ).trimmed().isEmpty()) {
        setLastError(qMakeError(d->access, QCoreApplication::translate("QSpatiaLiteResult",
            "Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE));
        d->finalize();
        return false;
    }
    return true;
}
Beispiel #11
0
/* 函数功能:获取执行 SQL 语句后所查询的数据字段数量
* 参数说明:pSqlite3sqlite3 指针
* pSqlite3_Stmtsqlite3_stmt 指针
* pszSQL需要执行的 SQL 字符串语句
* 返回说明:返回 -1表示失败。此时可使用format_sqlite_err函数得到错误文本信息
* 否则返回字段数量
* 注意事项:
* 使用举例:1.得到t_bd表中字段总合数量
* int sqlite_colunm_count = 0;
* sqlite_colunm_count = get_colunm_count(pSqlite3, &pSqlite3_Stmt, "select * from t_bd");
* if (sqlite_colunm_count < 0) {
* 
* printf("get_colunm_count err(%s)\r\n", format_sqlite_err(pSqlite3));
* }
* else printf("sqlite colunm count = %d\r\n", sqlite_colunm_count);
* */
int get_colunm_count(sqlite3 * pSqlite3, sqlite3_stmt ** pSqlite3_Stmt, const char * pszSQL)
{
static int nsqlite_colunm;
nsqlite_colunm = 0;
/* 检查参数 */
if (pSqlite3 == NULL) {
pSqlite3_Stmt = NULL;
return -1;
}
if (sqlite3_prepare(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
if (sqlite3_prepare16(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
pSqlite3_Stmt = NULL;
return -1;
}
}
if (sqlite3_step(*pSqlite3_Stmt) != SQLITE_ROW) {
if (pSqlite3_Stmt != NULL) {
sqlite3_finalize(*pSqlite3_Stmt);
pSqlite3_Stmt = NULL;
}
return -1;
}
nsqlite_colunm = sqlite3_column_count(*pSqlite3_Stmt);
if (*pSqlite3_Stmt != NULL) {
sqlite3_finalize(*pSqlite3_Stmt);
pSqlite3_Stmt = NULL;
}
return nsqlite_colunm;
}
/*!
	登録されている個数とID最大値確保・ディレクトリ毎か全体OK
	@param[in]	ptFdrName	対象ディレクトリ名・NULLなら全部
	@param[in]	pdMax		非NULLなら、最大値いれちゃう
	@return		登録されている個数
*/
UINT SqlFavCount( LPCTSTR ptFdrName, PUINT pdMax )
{
	TCHAR	atQuery[MAX_STRING];
	UINT	rslt, iCount, iMax;
	sqlite3_stmt*	statement;

	if( ptFdrName )
	{
		StringCchPrintf( atQuery, MAX_STRING, TEXT("SELECT COUNT(id) FROM ArtList WHERE folder == '%s'"), ptFdrName );
	}
	else
	{
		StringCchCopy( atQuery, MAX_STRING, TEXT("SELECT COUNT(id) FROM ArtList") );
	}


	rslt = sqlite3_prepare16( gpDataBase, atQuery, -1, &statement, NULL );
	if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return 0;	}

	sqlite3_step( statement );
	iCount = sqlite3_column_int( statement, 0 );
	sqlite3_finalize(statement);

	if( !pdMax )	return iCount;


	if( !ptFdrName )
	{
		StringCchPrintf( atQuery, MAX_STRING, TEXT("SELECT MAX(id) FROM ArtList WHERE folder == '%s'"), ptFdrName );
	}
	else
	{
		StringCchCopy( atQuery, MAX_STRING, TEXT("SELECT MAX(id) FROM ArtList") );
	}

	rslt = sqlite3_prepare16( gpDataBase, atQuery, -1, &statement, NULL );
	if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return 0;	}

	sqlite3_step( statement );
	iMax = sqlite3_column_int( statement, 0 );
	sqlite3_finalize(statement);

	*pdMax = iMax;

	return iCount;
}
Beispiel #13
0
__declspec(dllexport) int WINAPI sqlite3_prepare16_interop(sqlite3 *db, const void *sql, int nchars, sqlite3_stmt **ppstmt, const void **pztail, int *plen)
{
  int n;

  n = sqlite3_prepare16(db, sql, nchars * sizeof(wchar_t), ppstmt, pztail);
  *plen = (*pztail != 0) ? wcslen((wchar_t *)*pztail) * sizeof(wchar_t) : 0;

  return n;
}
Beispiel #14
0
	Statement::Statement(Database &con, CString const & sql)
		: m_db(&con), m_st(0), m_refs(0), m_colcount(0)
	{
		void const * tail = 0;
		if(SQLITE_OK == sqlite3_prepare16(m_db->GetHandle(), sql, -1, &m_st, &tail))
		{
			m_colcount = sqlite3_column_count(m_st);
		}
	}
Beispiel #15
0
static JSVAL sqlite_prepare16(JSARGS args) {
    HandleScope scope;
    Local<External>wrap = Local<External>::Cast(args[0]);
    sqlite3 *db = (sqlite3 *)wrap->Value();
    String::Utf8Value zSql(args[1]->ToString());
    int nByte = args[2]->IntegerValue()	;
    sqlite3_stmt *stmt;
    if (!sqlite3_prepare16(db, *zSql, nByte, &stmt, NULL)) {
        return scope.Close(String::New(sqlite3_errmsg(db)));
    }
    return scope.Close(External::New(stmt));
}
Beispiel #16
0
void sqliteManager::endLastSession() {
    std::wstringstream ss;
    std::wstring firstpart = L"UPDATE session SET end_time = (datetime('now','localtime')) WHERE id=";
    std::wstring secondpart = L"; ";
    ss << firstpart << getLastSessionId() << secondpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );

}
Beispiel #17
0
void sqliteManager::insertAppRow(std::wstring exeName, std::wstring name) {
    std::wstringstream ss;
    std::wstring firstpart = L"insert into App(exeName, name) values ('";
    std::wstring secondpart = L"', '";
    std::wstring thirdpart = L"');";
    ss << firstpart << exeName << secondpart << name << thirdpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );
}
Beispiel #18
0
int sqliteManager::getAppId(std::wstring exeName) {
    std::wstringstream ss;
    std::wstring firstpart = L"Select id FROM App WHERE exeName='";
    std::wstring secondpart = L"';";
    ss << firstpart << exeName << secondpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    if (resp==SQLITE_ROW) return sqlite3_column_int(stmt, 0);
    else return -1;
}
Beispiel #19
0
void sqliteManager::insertDocRow(std::wstring title, std::wstring uri) {
    std::wstringstream ss;
    std::wstring firstpart = L"insert into Document(title, uri) values('";
    std::wstring secondpart = L"', '";
    std::wstring thirdpart = L"');";
    ss << firstpart << title << secondpart << uri << thirdpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );
}
Beispiel #20
0
int sqliteManager::getDocumentId(std::wstring title, std::wstring uri) {
    std::wstringstream ss;
    std::wstring firstpart = L"Select id FROM Document WHERE title='";
    std::wstring secondpart = L"' and uri='";
    std::wstring thirdpart = L"';";
    ss << firstpart << title << secondpart << uri << thirdpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    if (resp==SQLITE_ROW) return sqlite3_column_int(stmt, 0);
    else return -1;
}
Beispiel #21
0
void sqliteManager::insertSessionRow(int app_id, int doc_id) {

    std::wstringstream ss;
    std::wstring firstpart = L"insert into Session(app_id, doc_id, start_time) values(";
    std::wstring secondpart = L", ";
    std::wstring thirdpart = L", (datetime('now','localtime')))";

    ss << firstpart << app_id << secondpart << doc_id << thirdpart;
    std::wstring query = ss.str();
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare16( db, (WCHAR*)query.c_str(), -1, &stmt, 0);
    int resp = sqlite3_step( stmt );
    resp = sqlite3_finalize( stmt );
}
Beispiel #22
0
sqlite3_stmt* CppSQLite3DB::compile(const CString& strSQL)
{
	checkDB();

    const void* szTail=0;
	sqlite3_stmt* pVM;

    int nRet = sqlite3_prepare16(mpDB, strSQL, -1, &pVM, &szTail);

	if (nRet != SQLITE_OK)
	{
        throw CppSQLite3Exception(nRet, (const unsigned short*)szTail);
	}

	return pVM;
}
void DoExec16(sqlite3* aDb, const unsigned short* aSql)
	{
	sqlite3_stmt* stmt = NULL;
  	const void* tail = 0;

	TInt err = sqlite3_prepare16(aDb, aSql, -1, &stmt, &tail);
	TEST2(err, SQLITE_OK);
	TEST((unsigned int)stmt);
	TEST(!tail || User::StringLength((const TUint16*)tail) == 0);

	while((err = sqlite3_step(stmt)) == SQLITE_ROW)
		{
		}
	TEST2(err, SQLITE_DONE);
		
	sqlite3_finalize(stmt);
	}
Beispiel #24
0
sqlite3_stmt* CppSQLite3DB::compile(const TCHAR* szSQL)
{
	checkDB();

	TCHAR* szError=0;
	const TCHAR* szTail=0;
	sqlite3_stmt* pVM;

#ifdef _UNICODE
	int nRet = sqlite3_prepare16(mpDB, szSQL, -1, &pVM, (const void**)szTail);
#else
	int nRet = sqlite3_prepare(mpDB, szSQL, -1, &pVM, &szTail);
#endif

	if (nRet != SQLITE_OK)
	{
		throw CppSQLite3Exception(nRet, (TCHAR*)szError);
	}

	return pVM;
}
void DoReadTest(sqlite3* aDb)
	{
	sqlite3_stmt* stmt = NULL;
  	const void* tail = 0;

	TInt err = sqlite3_prepare16(aDb, _S16("SELECT * FROM A"), -1, &stmt, &tail);
	TEST2(err, SQLITE_OK);
	TEST((unsigned int)stmt);
	TEST(!tail || User::StringLength((const TUint16*)tail) == 0);

	TInt cnt = 0;
	while((err = sqlite3_step(stmt)) == SQLITE_ROW)
		{
		++cnt;
		TInt val = sqlite3_column_int(stmt, 0);
		TEST2(val, cnt);
		}
	TEST2(err, SQLITE_DONE);
	TEST2(cnt, 3);//DoWriteTest does three INSERTs
		
	sqlite3_finalize(stmt);
	}
Beispiel #26
0
char * first_sqlite_column_txt(sqlite3 * pSqlite3, sqlite3_stmt ** pSqlite3_Stmt, const char * pszSQL, const unsigned int &nColunmID = 0)
#endif
{
/* 检查参数 */
if (pSqlite3 == NULL || nColunmID < 0) {
*pSqlite3_Stmt = NULL;
return (char *)NULL;
}
if (sqlite3_prepare(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
if (sqlite3_prepare16(pSqlite3, pszSQL, -1, pSqlite3_Stmt, 0) != SQLITE_OK) {
*pSqlite3_Stmt = NULL;
return (char *)NULL;
}
}
if (sqlite3_step(*pSqlite3_Stmt) != SQLITE_ROW) {
if (*pSqlite3_Stmt != NULL) {
sqlite3_finalize(*pSqlite3_Stmt);
*pSqlite3_Stmt = NULL;
}
return (char *)NULL;
}
return (char *)sqlite3_column_text(*pSqlite3_Stmt, nColunmID);
}
/*!
	記録されてるAAを、ディレクトリ名に従ってリストアップしてコールバックする
	@param[in]	ptFdrName	ディレクトリ名・NULLなら全部
	@param[in]	pfInflate	AAをコールバックする函数ポインター
	@return		HRESULT			終了状態コード
*/
HRESULT SqlFavArtEnum( LPCTSTR ptFdrName, BUFFERBACK pfInflate )
{
	TCHAR	atQuery[MAX_STRING];
	UINT	rslt, iCount, i, szCont;
	sqlite3_stmt*	statement;

	if( ptFdrName )
	{
		StringCchPrintf( atQuery, MAX_STRING, TEXT("SELECT conts FROM ArtList WHERE folder == '%s' ORDER BY lastuse DESC"), ptFdrName );
	}
	else
	{
		StringCchCopy( atQuery, MAX_STRING, TEXT("SELECT conts FROM ArtList ORDER BY lastuse") );
	}

	rslt = sqlite3_prepare16( gpDataBase, atQuery, -1, &statement, NULL );
	if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_FAIL;	}
	rslt = sqlite3_reset( statement );

	iCount = SqlFavCount( ptFdrName, NULL );

	for( i = 0; iCount > i; i++ )
	{
		rslt = sqlite3_step( statement );
		if( SQLITE_ROW == rslt )
		{
			szCont = sqlite3_column_bytes( statement, 0 );
			pfInflate( szCont, 0, 0, sqlite3_column_blob( statement, 0 ) );
		}
		else{	break;	}
	}

	sqlite3_finalize(statement);

	return S_OK;
}
// FIXME: This overload helps us compile with older versions of SQLite 3, but things like quotas will not work.
static inline int sqlite3_prepare16_v2(sqlite3* db, const void* zSql, int nBytes, sqlite3_stmt** ppStmt, const void** pzTail)
{
    return sqlite3_prepare16(db, zSql, nBytes, ppStmt, pzTail);
}
Beispiel #29
0
#include <assert.h>
#include <collection.h>
#include <ppltasks.h>
#include <sstream>
#include <iomanip>
#include "Statement.h"
#include "Database.h"

namespace SQLite3 {
  StatementPtr Statement::Prepare(sqlite3* sqlite, Platform::String^ sql) {
    sqlite3_stmt* statement;
    int ret = sqlite3_prepare16(sqlite, sql->Data(), -1, &statement, 0);

    if (ret != SQLITE_OK) {
      sqlite3_finalize(statement);
      throwSQLiteError(ret);
    }

    return StatementPtr(new Statement(statement));
  }

  Statement::Statement(sqlite3_stmt* statement)
    : statement(statement) {
  }

  Statement::~Statement() {
    sqlite3_finalize(statement);
  }

  void Statement::Bind(const SafeParameterVector& params) {
    for (SafeParameterVector::size_type i = 0; i < params.size(); ++i) {
/*!
	ツリーのテーブルの存在を確認して、なかったら作成
	@param[in]	ptProfName	なにか
	@return		HRESULT		終了状態コード
*/
HRESULT SqlTreeTableCreate( LPTSTR ptProfName )
{
	//	プロフ情報
	CONST CHAR	cacProfilesTable[] = { ("CREATE TABLE Profiles ( id INTEGER PRIMARY KEY, profname TEXT NOT NULL, rootpath TEXT NULL)") };
	//	初期プロフ名作成
	CONST TCHAR	catProfInsFmt[] = { TEXT("INSERT INTO Profiles ( profname ) VALUES( '%s' )") };
	//	ツリー情報
	CONST CHAR	cacTreeNodeTable[] = { ("CREATE TABLE TreeNode ( id INTEGER PRIMARY KEY, type INTEGER NOT NULL, parentid INTEGER NOT NULL, nodename TEXT NOT NULL )") };
	//	副タブ情報
	CONST CHAR	cacMultiTabTable[] = { ("CREATE TABLE MultiTab ( id INTEGER PRIMARY KEY, filepath TEXT NOT NULL, basename TEXT NOT NULL, dispname TEXT )") };	//	20120613	表示名称追加
	//	使用AA情報
	CONST CHAR	cacArtListTable[]  = { ("CREATE TABLE ArtList ( id INTEGER PRIMARY KEY, count INTEGER NOT NULL, folder TEXT NOT NULL, lastuse  REAL NOT NULL, hash INTEGER NOT NULL, conts BLOB NOT NULL )") };

	CHAR	acBuildVer[SUB_STRING], acText[MAX_PATH];
	TCHAR	atStr[MAX_STRING];
	SYSTEMTIME	stSysTime;

	BYTE	yMode = FALSE;	//	Tableあったとかなかったとか
	INT		rslt;

	UINT	dVersion;
	CHAR	acQuery[MAX_PATH];

#ifdef _DEBUG
	INT		i;
#endif
	sqlite3_stmt	*statement;

	ZeroMemory( acText, sizeof(acText) );

	//	テーブルの存在を確認する
	rslt = sqlite3_prepare( gpDataBase, cacDetectTable, -1, &statement, NULL );
	if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}

	rslt = sqlite3_step( statement );
	if( SQLITE_ROW == rslt )
	{
#ifdef _DEBUG
		for( i = 0; 10 > i; i++ )
		{
			TRACE( TEXT("[TREE] %s"), (LPCTSTR)sqlite3_column_text16( statement, 0 ) );
			rslt = sqlite3_step( statement );
			if( SQLITE_DONE == rslt ){	break;	}
		}
#endif
		rslt = sqlite3_finalize( statement );
		yMode = TRUE;
	}
	//	まず、てーぶりょが有るか無いかについて

	if( !(yMode) )
	{

		TRACE( TEXT("ツリー用テーブルが見つからなかった") );

		rslt = sqlite3_finalize( statement );	//	どっちにしても解除


	//VERSION番号テーブル作成<表には出ない
		rslt = sqlite3_prepare( gpDataBase, cacVersionTable, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );	//	実行
		if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_finalize(statement);

		//VERSION内容を作成	20120613変更
		GetLocalTime( &stSysTime );
		StringCchPrintfA( acBuildVer, SUB_STRING, ("%d.%02d%02d.%02d%02d.%d"), stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay, stSysTime.wHour, stSysTime.wMinute, SUBTAB_NAME_VER );
		StringCchPrintfA( acText, MAX_PATH, cacVerStrInsFmt, SUBTAB_NAME_VER, acBuildVer );
		//	初期データぶち込む
		rslt = sqlite3_prepare( gpDataBase, acText, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		sqlite3_reset( statement );
		rslt = sqlite3_step( statement );
		sqlite3_finalize(statement);


	//プロフテーブルを作成
		rslt = sqlite3_prepare( gpDataBase, cacProfilesTable, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );	//	実行
		if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_finalize(statement);

		//初期値を作成
		ZeroMemory( atStr, sizeof(atStr) );
		StringCchPrintf( atStr, MAX_STRING, catProfInsFmt, ptProfName );
		rslt = sqlite3_prepare16( gpDataBase, atStr, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		sqlite3_reset( statement );
		rslt = sqlite3_step( statement );
		sqlite3_finalize(statement);

	//ツリーテーブルを生成
		rslt = sqlite3_prepare( gpDataBase, cacTreeNodeTable, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );	//	実行
		if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_finalize(statement);

	//副タブテーブルを作成
		rslt = sqlite3_prepare( gpDataBase, cacMultiTabTable, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );	//	実行
		if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_finalize(statement);

	//使用AAテーブルを作成	
		rslt = sqlite3_prepare( gpDataBase, cacArtListTable, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );	//	実行
		if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_finalize(statement);

	}
	else	//	存在してるなら、ヴァージョンを確かめてーテーボーを変更
	{
		dVersion = 0;
		rslt = sqlite3_prepare( gpDataBase, cacVersionNumGet, -1, &statement, NULL );
		if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
		rslt = sqlite3_step( statement );
		if( SQLITE_ROW == rslt ){	dVersion = sqlite3_column_int( statement, 0 );	}
		sqlite3_finalize( statement );
		TRACE( TEXT("PROFILE VERSION[%d]"), dVersion );



		//	副タブの表示名称を追加
		if( TREE_TBL_VER == dVersion )
		{
			//	テーブルに追加
			rslt = sqlite3_prepare( gpDataBase, ("ALTER TABLE MultiTab ADD COLUMN dispname TEXT DEFAULT \"\" "), -1, &statement, NULL );
			if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
			rslt = sqlite3_step( statement );	//	実行
			if( SQLITE_DONE != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}
			rslt = sqlite3_finalize( statement );

			//バージョン情報を書き換え
			GetLocalTime( &stSysTime  );	//	更新日時とバージョン
			StringCchPrintfA( acBuildVer, SUB_STRING, ("%d.%02d%02d.%02d%02d.%d"),
				stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay,
				stSysTime.wHour, stSysTime.wMinute, SUBTAB_NAME_VER );

			//	Query文字列作って
			StringCchPrintfA( acQuery, MAX_PATH, cacVersionUpdate, SUBTAB_NAME_VER, acBuildVer );

			//	情報書き換える
			rslt = sqlite3_prepare( gpDataBase, acQuery, -1, &statement, NULL);
			if( SQLITE_OK != rslt ){	SQL_DEBUG( gpDataBase );	return E_ACCESSDENIED;	}

			sqlite3_reset( statement );
			rslt = sqlite3_step( statement );
			sqlite3_finalize( statement );

			dVersion = SUBTAB_NAME_VER;
		}
	}


	return S_OK;
}