REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 #include "common.ch" #include "hbsqlit3.ch" #define _DB_FLAGS_ (SQLITE_OPEN_CREATE + SQLITE_OPEN_READWRITE + SQLITE_OPEN_EXCLUSIVE) INIT PROCEDURE _cp_init hb_cdpSelect( "RU1251" ) hb_setTermCP( "RU866", "RU1251", .F. ) RETURN /** */ FUNCTION main() LOCAL cSQLTEXT LOCAL pDb, cb LOCAL pStmt // IF ! sqlite3_compileoption_used( "SQLITE_ENABLE_ICU" ) QOut( "Oops.. ICU is not enabled, isn't it?" ) RETURN 1 ENDIF // pDb := sqlite3_open_v2( "test.db", _DB_FLAGS_ ) IF Empty( pDb ) QOut( "Can't open database : 'test.db'" ) RETURN 1 ENDIF //sqlite3_trace( pDb, .T., "acc.log" ) QOut( (cSQLTEXT := "SELECT icu_load_collation('ru_RU', 'russian')") ) sqlite3_exec(pDb, cSQLTEXT) // drop and re- create table main.test & main.test_r sqlite3_exec( pDb, "DROP TABLE IF EXISTS test" ) sqlite3_exec( pDb, "DROP TABLE IF EXISTS test_r" ) // -------------------------------- cSQLTEXT := "CREATE TABLE IF NOT EXISTS test ( name TEXT )" ? cSQLTEXT sqlite3_exec(pDb, cSQLTEXT) PopulateDB ( pDb, "test" ) cSQLTEXT := "SELECT name, lower(name), upper(name) FROM test ORDER by name" ? cSQLTEXT, hb_osNewLine() cb := "CallBack" sqlite3_exec(pDb, cSQLTEXT, cb) cSQLTEXT := "SELECT name, lower(name), upper(name) FROM test ORDER by name COLLATE russian" ? cSQLTEXT, hb_osNewLine() cb := @CallBack() sqlite3_exec(pDb, cSQLTEXT, cb) // -------------------------------- cSQLTEXT := "CREATE TABLE IF NOT EXISTS test_r ( name TEXT COLLATE russian )" ? cSQLTEXT sqlite3_exec(pDb, cSQLTEXT) PopulateDB ( pDb, "test_r" ) cSQLTEXT := "SELECT name, lower(name), upper(name) FROM test_r ORDER by name" ? cSQLTEXT, hb_osNewLine() cb := @CallBack() sqlite3_exec(pDb, cSQLTEXT, cb) // -------------------------------- cSQLTEXT := "SELECT * FROM test_r WHERE name LIKE :name ORDER by name" ? cSQLTEXT pStmt := sqlite3_prepare( pDb, cSQLTEXT ) sqlite3_bind_text( pStmt, 1, '%мо%', .t. ) DO WHILE sqlite3_step( pStmt ) == SQLITE_ROW ? sqlite3_column_text( pStmt, 1, .t., "RU1251" ) ENDDO sqlite3_clear_bindings( pStmt ) sqlite3_finalize( pStmt ) sqlite3_sleep( 3000 ) // pDb := Nil // close database // RETURN 0 /** */ FUNCTION PopulateDB ( pDb, table ) LOCAL cSQLTEXT LOCAL pStmt LOCAL aStrings := { 'Ё-моё', 'привет!', 'ё-прст', 'ага!', 'ё-моё', 'ё-Моё', "Ъ-ГЫ" } LOCAL cString cSQLTEXT := "INSERT INTO " + table + " VALUES ('Привет!')" sqlite3_exec(pDb, cSQLTEXT, NIL, .t.) cSQLTEXT := "INSERT INTO " + table + " VALUES (:value)" pStmt := sqlite3_prepare( pDb, cSQLTEXT ) FOR EACH cString IN aStrings sqlite3_reset( pStmt ) sqlite3_bind_text( pStmt, 1, cString, .t., "RU1251" ) sqlite3_step( pStmt ) NEXT sqlite3_clear_bindings( pStmt ) sqlite3_finalize( pStmt ) // RETURN Nil /** */ #translate UTF8_CP1251( <utf8> ) => ( padr( hb_UTF8ToStr( <utf8> ), 12 ) ) FUNCTION CallBack( nColCount, aValue, aColName ) LOCAL cStr := hb_StrFormat( "%1$s => %2$s => %3$s",; UTF8_CP1251(aValue[1]), UTF8_CP1251(aValue[2]), UTF8_CP1251(aValue[3]) ) HB_SYMBOL_UNUSED( nColCount ) HB_SYMBOL_UNUSED( aColName ) OutStd( cStr, hb_OsNewLine() ) // RETURN 0
|