Russian Qt Forum
Май 18, 2012, 20:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 10 11 [12]   Вниз
  Печать  
Автор Тема: Транзакции Interbase  (Прочитано 26515 раз)
sarbash
Чайник
*
Offline Offline

Сообщений: 87



WWW
« Ответ #165 : Декабрь 19, 2010, 00:58 »

Попробовал сегодня поработать (Qt 4.7 /MinGW/ + FB2.5) со "стандартным" драйвером QIBASE: нормально возвращает значение returning, только next() выполнить нужно, а с QFIREBIRD - фиквам, с ошибкой.
Цитировать
QSqlQuery::value: not positioned on a valid record

Недопилено еще...Грустный
Фикс есть у меня, если нужен патч, могу поделиться. Работает по тому же принципу, что и QIBASE. Однако, до этого времени никто не проявил интерес к этому функционалу, из чего я решил, что никому, кроме меня он и не нужен. Улыбающийся

P.S. На всякий случай...
« Последнее редактирование: Декабрь 19, 2010, 01:08 от sarbash » Записан

В главном - единство, во второстепенном - свобода, во всём - любовь.
vlad-mal
Самовар
**
Offline Offline

Сообщений: 114


« Ответ #166 : Декабрь 21, 2010, 19:25 »

1. Да вы что, как так "нет интереса"? Все "Qt-интербейзники" везде только на эту ветку и ссылаются. Улыбающийся

2. Распреспасибищще!
Записан
sne
Чайник
*
Offline Offline

Сообщений: 61


« Ответ #167 : Декабрь 22, 2011, 07:15 »

Собственно, до автора смог кто до автора достучаться? Просто если он не поддерживает проект, может добавит мемберов, или остается форкнуть, да потихонечку дописывать??
Записан

Про админов можно много чего сказать, вот только написать нельзя...
Whiplash
Чайник
*
Offline Offline

Сообщений: 69


« Ответ #168 : Апрель 10, 2012, 15:41 »

Озадачился тут намедни работой с guid из Firebird... Долго рассказывать, но для комфортной работы пришлось слегка модифицировать драйвер QFIREBIRD. Давно этим драйвером пользуюсь, выражаю своё почтение автору Улыбающийся
GUID'ы в FB принято хранить в виде CHAR(16) OCTETS. Попытка работы с таким "сырым" гуидом с помощью этого драйвера провалилась - в нём все строки преобразовываются в QString и использованием текстового кодека. А в случае гуидов это не строка, а фиксированный набор байт, который с сервера приходит как строка. Да ещё и 0x00 в середине легко попасться может.
В общем, в модифицированном драйвере:
1. Зарегистрирован и декларирован тип QUuid, чтобы можно было им пользоваться в QVariant.
2. Проводится автоматическое распознавание столбца GUID по следующим условиям:
    - домен называется UUID
    - это CHAR (16) OCTETS
3. Фактически, при открытии соединения с базой делается служебный запрос по метаданным и заполняется хэш, где каждому столбцу каждой таблицы присваивается признак true или false. В дальнейшем для доопределения типа столбца с гуид этот столбец сверяется с хэшем.
4. При помещении в запрос (bindValue) тип QUuid сериализуется в 16-байтный std::string.
5. К сожалению, для комфортного использования нужно в своём приложении не забыть написать Q_DECLARE_METATYPE(QUuid). В каком-нибудь хидере.

Примерно так можно пользоваться:
В запросе
Код
SQL
SELECT id, name FROM dir d
id - это UUID
Выполняем запрос, получаем данные:
Код:
   QSqlQuery q(db);
    q.exec("select id, name from dir d");
    q.next();
    QUuid uid=q.value(0).value<QUuid>();

Передаём данные в запрос:
Код:
   QUuid id;
    QSqlQuery q(db);
    db.transaction();
    q.prepare("select dscr from dir where id=?");
    q.bindValue(0,QVariant::fromValue(id));

Так как QUuid нестандартный для QVariant тип данных, то приходится делать всякие QVariant::fromValue(id) и value<QUuid>().
Для удобства я оперделил макрос
Код:
#define VUUID(variant) variant.value<QUuid>()
Так-что могу делать вот так:
Код:
QUuid uid=VUUID(q.value(0));
вместо
Код:
QUuid uid=q.value(0).value<QUuid>();

Даёшь GUID!

*** Блин, забыл в начале про селективные процедуры Улыбающийся Сейчас поправил - гуиды работают и из селективных процедур.
« Последнее редактирование: Апрель 10, 2012, 16:21 от Whiplash » Записан
Tonal
phpBB Супер
******
Offline Offline

Сообщений: 1039


Карма Кагью


WWW
« Ответ #169 : Апрель 11, 2012, 08:37 »

Для справки про uid-ы: в версии 2.1 появилась функция GEN_UUID() - генерация uuid-ов, а в 2.5 UUID_TO_CHAR и CHAR_TO_UUID - конвертаця uid-ов в строку и обратно. Улыбающийся
Код:
CHAR_TO_UUID
Function:
    Converts the CHAR(32) ASCII representation of an UUID
    (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) to the CHAR(16) OCTETS
    representation (optimized for storage).
Format:
    CHAR_TO_UUID( <string> )
Example:
    select char_to_uuid('93519227-8D50-4E47-81AA-8F6678C096A1') from rdb$database;

Ну и по хорошему, нужно для любого столбца с символьным типом и кодировками OCTETS или NONE возвращать QByteArray вместо QString - иначе, с большой вероятностью, получится каша...
Записан
Whiplash
Чайник
*
Offline Offline

Сообщений: 69


« Ответ #170 : Апрель 11, 2012, 15:55 »

Ну так потому и озаботился, что сейчас в ФБ появилась номальная поддержка UID.
Насчёт того, что для любого столбца с OCTETS или NONE возвращать ByteArray вместо строки - просто отличная идея. Время будет - так и сделаю. Чего уж, расковырял малёха драйвер так не останавливаться же.
Может, автор драйвера сделает какой-нить официальный билд с этими изменениями?
Записан
Tonal
phpBB Супер
******
Offline Offline

Сообщений: 1039


Карма Кагью


WWW
« Ответ #171 : Апрель 12, 2012, 09:04 »

Может на githab склонировать?
Там как-то попроще с управление проектом и форканьем. Улыбающийся
Записан
Страниц: 1 ... 10 11 [12]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.038 секунд. Запросов: 22.