2011-07-06 3 views
0

私は奇妙な問題があります。 sqliteに関数を追加する/ C++/Qtに書き込む。 関数はUtf-8 simbolsの上位を実行する必要があります。SQLiteとUTF8

void myFunc(sqlite3_context * ctx, int argc, sqlite3_value ** argv) 
{ 
     if(argc != 1) return; 
     QString str; 
     switch(sqlite3_value_type(argv[0])) 
     { 
       case SQLITE_NULL: 
       { 
         sqlite3_result_text(ctx, "NULL", 4, SQLITE_STATIC); 
         break; 
       } 
       case SQLITE_TEXT: 
       { 
         QString wstr((char*)sqlite3_value_text16(argv[0])); 
         wstr = wstr.toUpper(); 
         sqlite3_result_text16(ctx, wstr.toStdString().c_str(), wstr.size() , SQLITE_TRANSIENT); 
         break; 
       } 
       default: 
         sqlite3_result_text(ctx, "NULL", 4, SQLITE_STATIC); 
       break; 
     } 
} 

答えて

2

は、あなたが問題を指定していないが、私はあなたが関数へのポインタを渡す必要があるとします:

this->db = QSqlDatabase::addDatabase("QSQLITE"); 
    this->db.setDatabaseName(db); 
    this->db.open(); 
    QVariant v = this->db.driver()->handle(); 
    sqlite3 *handler = *static_cast<sqlite3 **>(v.data()); 
    sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, myFunc, NULL, NULL) 

と機能がある

sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, &myFunc, NULL, NULL) 

編集: I関数wstr.toStdString()。c_str()に渡しています。返されるポインタは一時的なものであり、範囲外に出るため、これは許されません。私がすることは次のとおりです:

... 
case SQLITE_TEXT: { 
    QString wstr((char*)sqlite3_value_text(argv[0])); 
    wstr = wstr.toUpper(); 
    QByteArray array = wstr.toLocal8Bit(); 
    const char* cstr = array.data(); 
    sqlite3_result_text(ctx, cstr, wstr.size() , SQLITE_TRANSIENT); 
    break; 
} 
... 

私はこれをチェックしました。

+0

これは解決された問題ではありません。プログラムが突然シャットダウンした後、私は基底関数と初期化関数を開こうとしています。 – pod2metra

+0

私はいくつかの情報を追加して私の答えを編集しています。 –

+0

これは解決された問題ではありません。問題はexectly同じだった。 – pod2metra