Название: Sqlite3. Несколько использований одной самописной функции в одном запросе
Отправлено: johnpion от Сентябрь 13, 2012, 11:27
Вот код модуля для sqlite3: п»ї#include "sqlite3ext.h" #include <stdlib.h> #include <stdio.h> SQLITE_EXTENSION_INIT1
static void moneyFunc( sqlite3_context *context, int argc, sqlite3_value **argv ){ char *result;
int sum = sqlite3_value_int(argv[0]); int full = sum / 100; int dec = sum % 100;
if (dec == 0){ snprintf(result, 8, "%d,00", full); } else if (dec > 0 && dec < 10){ snprintf(result, 8, "%d,0%d", full, dec); } else if (dec >= 10 && dec <= 99){ snprintf(result, 8, "%d,%d", full, dec); } else return;
sqlite3_result_text(context, result, 8, 0); }
int sqlite3_extension_init( sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ SQLITE_EXTENSION_INIT2(pApi) sqlite3_create_function(db, "money", 1, SQLITE_ANY, 0, moneyFunc, 0, 0); return 0; } Запрос вида возвращает 1,00. Всё ок, НО! Запрос вида SELECT money(100), money(350) Выдает 3,50 | 3,50 вместо 1,00 и 3,50. Т.е. в вызове используется последнее значение. Где я не прав?
Название: Re: Sqlite3. Несколько использований одной самописной функции в одном запросе
Отправлено: GreatSnake от Сентябрь 13, 2012, 11:46
Насчёт select-а не скажу, а вот то, что пишите в не инициализированный result есть совсем не good :(
Название: Re: Sqlite3. Несколько использований одной самописной функции в одном запросе
Отправлено: johnpion от Сентябрь 13, 2012, 11:52
Исправил: #include "sqlite3ext.h" #include <stdlib.h> #include <stdio.h> SQLITE_EXTENSION_INIT1
static void moneyFunc( sqlite3_context *context, int argc, sqlite3_value **argv ){ char *result = (char *) malloc (sizeof(char)*(8));
int sum = sqlite3_value_int(argv[0]); int full = sum / 100; int dec = sum % 100;
if (dec == 0){ snprintf(result, 8, "%d,00", full); } else if (dec > 0 && dec < 10){ snprintf(result, 8, "%d,0%d", full, dec); } else if (dec >= 10 && dec <= 99){ snprintf(result, 8, "%d,%d", full, dec); } else return;
sqlite3_result_text(context, result, 8, 0); }
int sqlite3_extension_init( sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ SQLITE_EXTENSION_INIT2(pApi) sqlite3_create_function(db, "money", 1, SQLITE_ANY, 0, moneyFunc, 0, 0); return 0; }
Впихиваю в Qt в виде: #include <QString> #include <QObject> #include <sqlite3.h>
static void moneyFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { int sum = sqlite3_value_int(argv[0]); int full = sum / 100; int dec = sum % 100;
QString resultStr; resultStr.clear(); resultStr = QString(QObject::tr("0,00"));
if (dec == 0){ resultStr = QString(QObject::tr("%1,00")).arg(full); } else if (dec > 0 && dec < 10){ resultStr = QString(QObject::tr("%1,0%2")).arg(full).arg(dec); } else if (dec >= 10 && dec <= 99){ resultStr = QString(QObject::tr("%1,%2")).arg(full).arg(dec); }
sqlite3_result_text(context, resultStr.toAscii().data(), resultStr.size(), 0); }
Та же проблема
|