2009/03/23

SQLite 64비트에서 테스트...

직접 만든 SQLite 64비트용 정적라이브러리가 정상 동작을 하는지 테스트 해 보았다.

컴파일과 링크에서 경고 메세지가 나오기는 하지만 동작은 하였다.

아래 코드는 테스트에 사용한 코드이다.
이전에 C++Builder 에서 테스트한 코드와 크게 다르지 않다.


void CSQLiteTestView::OnSqliteTest()
{
sqlite3* pSQLite3 = NULL;
sqlite3_stmt* pStmt = NULL;
char* szErrMsg = NULL;
const char* szErr;

CString strMsg;

// Open Database
int rst = sqlite3_open( "test.db", &pSQLite3 );

TRACE( L"Test Start...\n" );

if ( rst )
{
strMsg.Format( L" Can't open database: %s\n",
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}
else
{
TRACE( L" Database (test.db) Opened...\n" );

std::string strQuery;

// 테이블 생성
strQuery = "CREATE TABLE IF NOT EXISTS TestTable ("
" name VARCHAR(20)"
" ,age int"
" ,country VARCHAR(20)"
")";
rst = sqlite3_exec(pSQLite3, strQuery.c_str(), NULL, 0, &szErrMsg);

if ( rst == SQLITE_OK )
{
TRACE( L" Test Table Created... OK\n" );
}
else
{
TRACE( L" Test Table Created... FAILE\n" );

strMsg.Format( L" Error %d : %s",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

// Inserting...
TRACE( L" Inserting... \n" );
strQuery = "INSERT INTO TestTable ( name, age, country) VALUES ( ?, ?, ? );";
if ( sqlite3_prepare_v2( pSQLite3, strQuery.c_str(),
(int)strQuery.size(), &pStmt, &szErr ) == SQLITE_OK )
{
for ( int i = 0; i < 10; ++i )
{
CStringA str;

std::string strName;
str.Format( "name%d", i );

strName = str;

sqlite3_bind_text( pStmt, 1, strName.c_str(),
(int)strName.size(), NULL );
sqlite3_bind_int( pStmt, 2, i );

std::string strCountry;
sqlite3_bind_text( pStmt, 3, strCountry.c_str(),
(int)strCountry.size(), NULL );

sqlite3_step( pStmt );

INT64 nLast = sqlite3_last_insert_rowid( pSQLite3 );

strMsg.Format( L" Inserted... OK (%d)\n", nLast );
TRACE( strMsg );

sqlite3_reset( pStmt );
}

sqlite3_finalize( pStmt );
}
else
{
TRACE( L" Inserting... FAILE\n" );

strMsg.Format( L" Error %d : %s",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

TRACE( L" Selecting... \n" );
strQuery = "SELECT COUNT(*) FROM TestTable;";
if ( sqlite3_prepare_v2( pSQLite3, strQuery.c_str(),
(int)strQuery.size(), &pStmt, &szErr ) == SQLITE_OK )
{
int nRow = sqlite3_data_count( pStmt );
int nCol = sqlite3_column_count( pStmt );

const char* col1name = sqlite3_column_name( pStmt, 0 );

int nRowCnt = 0;
while ( sqlite3_step( pStmt ) == SQLITE_ROW )
{
++nRowCnt;

int Count = sqlite3_column_int( pStmt, 0 );

strMsg.Format( L" Row Count ... %d\n", Count );
TRACE( strMsg );
}
}
else
{
TRACE( L" Selecting... FAILE\n" );

strMsg.Format( L" Error %d : %s",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

// Updating...
TRACE( L" Updating... \n" );
strQuery = "UPDATE TestTable SET country = :country WHERE age < :age;";
if ( sqlite3_prepare_v2( pSQLite3, strQuery.c_str(),
(int)strQuery.size(), &pStmt, &szErr ) == SQLITE_OK )
{
sqlite3_bind_text( pStmt, 1, "KOREA", 5, NULL );
sqlite3_bind_int( pStmt, 2, 5 );

sqlite3_step( pStmt );
int nUpdated = sqlite3_changes( pSQLite3 );

strMsg.Format( L" Updated... %d Rows\n", nUpdated );
TRACE( strMsg );
}
else
{
TRACE( L" Updating... FAILE\n" );

strMsg.Format( L" Error %d : %s",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

// Deleting...
TRACE( L" Deleting... \n" );
strQuery = "DELETE FROM TestTable WHERE age < :age;";
if ( sqlite3_prepare_v2( pSQLite3, strQuery.c_str(),
(int)strQuery.size(), &pStmt, &szErr ) == SQLITE_OK )
{
sqlite3_bind_int( pStmt, 1, 2 );

sqlite3_step( pStmt );
int nUpdated = sqlite3_changes( pSQLite3 );

strMsg.Format( L" Deleted... %d Rows\n", nUpdated );
TRACE( strMsg );
}
else
{
TRACE( L" Updating... FAILE\n" );

strMsg.Format( L" Error %d : %s",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

// 테이블 삭제
strQuery = "DROP TABLE IF EXISTS TestTable;";
rst = sqlite3_exec(pSQLite3, strQuery.c_str(), NULL, 0, &szErrMsg);

if ( rst == SQLITE_OK )
{
TRACE( L" Test Table Deleted... OK\n" );
}
else
{
TRACE( L" Test Table Deleted... FAILE\n" );

strMsg.Format( L" Error %d : %s\n",
sqlite3_errcode( pSQLite3 ),
sqlite3_errmsg16( pSQLite3 ) );
TRACE( strMsg );
}

sqlite3_close( pSQLite3 );
TRACE( L" Database (test.db) Closed...\n" );

pSQLite3 = NULL;
}

TRACE( L"Test End...\n" );
}

// 결과
Test Start...
Database (test.db) Opened...
Test Table Created... OK
Inserting...
Inserted... OK (1)
Inserted... OK (2)
Inserted... OK (3)
Inserted... OK (4)
Inserted... OK (5)
Inserted... OK (6)
Inserted... OK (7)
Inserted... OK (8)
Inserted... OK (9)
Inserted... OK (10)
Selecting...
Row Count ... 10
Updating...
Updated... 5 Rows
Deleting...
Deleted... 2 Rows
Test Table Deleted... OK
Database (test.db) Closed...
Test End...



테스트에 사용 된 라이브러는 SQLite 3.6.11 버전 소스를 갖고 만든 32비트 용과 64비트용 정적라이브러리를 사용하였다. 두 버전 모두 정상 동작을 하였다

Original Post : http://neodreamer-dev.tistory.com/273

No comments :

Post a Comment