28set/100
Criando User Defined Functions do SQLite3 no QT
Yo, tempinho sumido já mas voltando a brincar com C++ agora.
Primeiro, "O que é uma User Defined Function(UDF)?".
Como o nome diz, é uma função criada pelo usuário(sua app), por exemplo:
UPDATE products SET price = toMoney(price_cents);
A função "toMoney", como o próprio nome diz, serve pra transformar uma string/inteiro em uma string em formato de dinheiro, porém essa função não existe. É ai que entram as UDFs. Se não existe, então criamos!
Vou partir do princípio que você vai fazer isso em um programa em QT4.
#include <QSqlDatabase> #include <QSqlDriver> #include <QString> #include <QVariant> #include "sqlite3.h" static void toMoneyFunc(sqlite3_context* context, int /* argc */, sqlite3_value** argv) { unsigned char *out; QString str((const char*)sqlite3_value_text(argv[0])); //a função toMoney é quem faz o trabalho sujo :) QString str2 = toCurrency(str); out = new unsigned char[str2.count()]; //esse foi o único meio que eu achei de passar uma QString para um char sem perdas. for(int i = 0; i <= str2.count(); i++) out[i] = str2[i].toAscii(); //os argumentos são, o context, uma const char* com o resultado, o número de bytes a ser usado(strlen(out)+1) ou -1 //e por último um void sqlite3_result_text(context, (const char*)out, -1, 0); } static bool createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(":memory:"); if(!db.open()) return false; QVariant v = db.driver()->handle(); if(!v.isValid() || qstrcmp(v.typeName(), "sqlite3*") != 0 ) return false; sqlite3 *handler = *static_cast<sqlite3 **>(v.data()); //os argumentos são, o handler, nome da função, número de argumentos ou -1 pra quantos tiver, codificação aceita, void, ponteiro para a função, void, void //para mais informações veja aqui http://www.sqlite.org/c3ref/create_function.html sqlite3_create_function(handler, "toMoney", 1, SQLITE_ANY, 0, &toMoneyFunc, 0, 0); }
Popularity: 12% [?]