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);
}

Deixe uma resposta