crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> subscribeToNotification() и переменный NOTIFY
RazrFalcon
  опции профиля:
сообщение 29.1.2013, 1:58
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Имеется база firebird и триггер вида:

CREATE OR ALTER TRIGGER MyTest FOR CONTACTS 
  ACTIVE
  AFTER INSERT OR UPDATE OR DELETE
  AS BEGIN
  POST_EVENT ('CONTACTS_NOTIFY_' || NEW.ID);
END
Проблема в том, что не понятно как объяснить qt, что нотификация переменная строка, а не постоянная? Или qt не может с такими событиями работать?
То есть, если бы я написал просто "CONTACTS_NOTIFY" - то все работает отлично, но мне нужно так же получать и новый id вместе с сигналом.

PS: это все нужно, что бы после изменения базы не перезагружать всю модель снова в клиент, а только изменившиеся строки. Возможно есть другой метод, но я его не нашел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.2.2013, 1:49
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Такой вариант не получится и не только в Qt.

БД шлёт уведомление, ПО по этому уведомлению смотрит, что изменилось.

Можно смотреть самый большой ID-шник, например.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 2.2.2013, 1:57
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Хм. А как тогда можно узнавать какие именно строки изменились? Что бы каждый раз всю таблицу не обновлять?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2013, 15:56
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


это скорее филосовский вопрос.
-- 1 --
Если ты используешь сигнализацию на уровне строк таблицы (т.е. из тригера), то в данной таблице имеет смысл завести вспомогательный столбец содержащий штамп времени последнего изменения, в тригере это значение должно обновляться.

В приложении достаточно провести сравнение штампов времени, чтобы понять какие строки отличаются, а можно просто запросить у БД строки, у которых штамп времени больше чем, время последнего обновления.

-- 2 --
Если используешь сигнализацию на уровне БД/Приложения (т.е. из хранимой процедуры), то может понадобится вспомогательная таблица.

У меня (в процессе разработки систем сбора данных) появилась привычка, делать таблицу, которую я обзываю - "Летопись".
Т.е. ни в каких таблицах я не держу полей типа - штамп времени (со встроенным типом данных - timestamp).
А делаю таблицу:
id | timestamp | where | what
В эту таблицу, все тригерры и ХП обязаны заносить текущие дату-время, т.е. отмечать штамп времени всех событий.
а в другие таблицы помещаются Id-шники из этой таблицы.

поле "where" у меня содержит имя объекта БД (имя таблицы или ХП, но не тригера, т.к. он привязан к таблице)
поле "what" даёт некое описание события (тут нужно придумать правило, что туда писать).

Можно использовать эту вспомогательную таблицу для определения того, что изменилось в БД.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.2.2013, 23:32
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Спасибо. Понятно.
Я подумав тоже решил делать доп таблицу, а оказывается распространенный подход.

Только один момент. Синхронизация времени. То есть или на всех машинах-клиентах + сервер нужно иметь одно и тоже время, или брать время у сервера.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.2.2013, 17:13
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 4.2.2013, 1:32) *
или брать время у сервера
да у него. Причём это довольно просто:
SELECT current_timestamp FROM foo


Где foo произвольная, существующая таблица, например: rdb$database

(Взято из доки)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 6.2.2013, 14:07
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ясно. Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 7:01