Database_SQLite3::~Database_SQLite3() { FINALIZE_STATEMENT(m_stmt_begin) FINALIZE_STATEMENT(m_stmt_end) SQLOK_ERRSTREAM(sqlite3_close(m_database), "Failed to close database"); }
void ReadTableStructure( Type& type, sqlite3* db, const wstring& query ) { type.mNotNULL = false; sqlite3_stmt* stmt = SqliteSelect( db, query ); if( stmt ) { int count = sqlite3_column_count( stmt ); for( int i = 0 ; i < count ; ++i ) { const char* name = sqlite3_column_name( stmt, i ); Member fld; FROM_UTF8( name, fld.mName ); ToLower( fld.mName ); fld.mNotNULL = false; fld.mType = GetColumnType( stmt, i ); type.mMembers.push_back( fld ); } FINALIZE_STATEMENT( stmt ); } }
RollbackManager::~RollbackManager() { flush(); FINALIZE_STATEMENT(stmt_insert); FINALIZE_STATEMENT(stmt_replace); FINALIZE_STATEMENT(stmt_select); FINALIZE_STATEMENT(stmt_select_range); FINALIZE_STATEMENT(stmt_select_withActor); FINALIZE_STATEMENT(stmt_knownActor_select); FINALIZE_STATEMENT(stmt_knownActor_insert); FINALIZE_STATEMENT(stmt_knownNode_select); FINALIZE_STATEMENT(stmt_knownNode_insert); SQLOK_ERRSTREAM(sqlite3_close(db), "Could not close db"); }
Database_SQLite3::~Database_SQLite3() { FINALIZE_STATEMENT(m_stmt_read) FINALIZE_STATEMENT(m_stmt_write) FINALIZE_STATEMENT(m_stmt_list) FINALIZE_STATEMENT(m_stmt_begin) FINALIZE_STATEMENT(m_stmt_end) FINALIZE_STATEMENT(m_stmt_delete) SQLOK(sqlite3_close(m_database), "Failed to close database"); }
EValueType GetColumnType( sqlite3* db, const wstring& table, const wstring& field ) { EValueType res = kUnknown; wstring query = L"SELECT [" + field + L"] FROM [" + table + L"] LIMIT 1"; sqlite3_stmt* stmt = SqliteSelect( db, query ); if( stmt ) { res = GetColumnType( stmt, 0 ); FINALIZE_STATEMENT( stmt ); } return res; }
int SqliteExecute( sqlite3* db, const wstring& query ) { vector<char> buf; ConvertToUTF8( query, buf ); const char* pq = &buf[ 0 ]; SkipTabulation( pq ); sqlite3_stmt* stmt = NULL; int qres = sqlite3_prepare_v2( db, pq, -1, &stmt, &pq ); if( qres == SQLITE_OK ) sqlite3_step( stmt ); FINALIZE_STATEMENT( stmt ); return qres; }
sqlite3_stmt* SqliteSelect( sqlite3* db, const wstring& query ) { vector<char> buf; ConvertToUTF8( query, buf ); const char* pq = &buf[ 0 ]; SkipTabulation( pq ); sqlite3_stmt* stmt = NULL; int qres = sqlite3_prepare_v2( db, pq, -1, &stmt, &pq ); if( qres == SQLITE_OK ) { int ccount = sqlite3_column_count( stmt ); if( ccount > 0 ) return stmt; } FINALIZE_STATEMENT( stmt ); return NULL; }
*/ MapDatabaseSQLite3::MapDatabaseSQLite3(const std::string &savedir): Database_SQLite3(savedir, "map"), MapDatabase(), m_stmt_read(NULL), m_stmt_write(NULL), m_stmt_list(NULL), m_stmt_delete(NULL) { } MapDatabaseSQLite3::~MapDatabaseSQLite3() { FINALIZE_STATEMENT(m_stmt_read) FINALIZE_STATEMENT(m_stmt_write) FINALIZE_STATEMENT(m_stmt_list) FINALIZE_STATEMENT(m_stmt_delete) } void MapDatabaseSQLite3::createDatabase() { assert(m_database); // Pre-condition SQLOK(sqlite3_exec(m_database, "CREATE TABLE IF NOT EXISTS `blocks` (\n" " `pos` INT PRIMARY KEY,\n" " `data` BLOB\n" ");\n",
bool Command::DoSelect( void ) { sqlite3_stmt* stmt = SqliteSelect( mpVM->mpDB, L"SELECT" + mParam.ToString() ); if( !stmt ) { mpVM->PrintError(); return false; } int fcount = sqlite3_column_count( stmt ); vector<vector<wstring> > tbl; vector<wstring> row( fcount ); vector<size_t> w( fcount, 2 ); // Header for( int i = 0 ; i < fcount ; ++i ) { const char* str = (const char*) sqlite3_column_name( stmt, i ); FROM_UTF8( str, row[ i ] ); w[ i ] = max( w[ i ], row[ i ].length() ); } tbl.push_back( row ); // Records int res = sqlite3_step( stmt ); while( res == SQLITE_ROW ) { for( int i = 0 ; i < fcount ; ++i ) { const char* str = (const char*) sqlite3_column_text( stmt, i ); if( str ) FROM_UTF8( str, row[ i ] ) else row[ i ].clear(); w[ i ] = max( w[ i ], row[ i ].length() ); } tbl.push_back( row ); res = sqlite3_step( stmt ); } // Horizontal line string fline( "+-" ); for( int j = 0 ; j < fcount ; ++j ) { fline.append( w[ j ], '-' ); if( j < fcount - 1 ) fline += "-+-"; } fline += "-+"; mpVM->Print( &fline[ 0 ] ); // Print records size_t count = tbl.size(); for( size_t i = 0 ; i < count ; ++i ) { wstring line( L"| " ); vector<wstring>& row = tbl[ i ]; for( int j = 0 ; j < fcount ; ++j ) { line += row[ j ]; line.append( w[ j ] - row[ j ].length(), ' ' ); if( j < fcount - 1 ) line += L" | "; } line += L" |"; mpVM->PrintW( line ); if( !i ) mpVM->Print( &fline[ 0 ] ); } if( count > 1 ) mpVM->Print( &fline[ 0 ] ); FINALIZE_STATEMENT( stmt ); return true; }