Russian Qt Forum

Qt => Базы данных => Тема начата: vasasol от Февраль 11, 2010, 22:21



Название: события от БД
Отправлено: vasasol от Февраль 11, 2010, 22:21
Здравствуйте!
вот захотелось от MySql 5.1 получать события об изменениях в БД
пробую так:

Код:
int main(int argc, char *argv[])
{
      Q_INIT_RESOURCE(application);
      QApplication app(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL", "mconn" );
    db.setDatabaseName( "xxxxx" );
    db.setUserName( "xxxxx" );
    db.setPassword( "xxxxx" );
    db.setHostName( "xxxxxxx" );
    if ( !db.open() ) {
        QMessageBox::critical(NULL,"Error connect",db.lastError().text());
        return FALSE;
    };

QSqlDriver *driver = db.database().driver();
if (driver->hasFeature(QSqlDriver::EventNotifications))
{
       app.connect(db.driver(), SIGNAL(notification(const QString&)), &app, SLOT(slotRefresh()));
} else QMessageBox::critical(0,"notify","Банан!!!!!!!");

Получаю "Банан!!!!!!"
Что я не дописал?


Название: Re: события от БД
Отправлено: KADABRA от Февраль 11, 2010, 22:24
вот захотелось от MySql 5.1 получать события об изменениях в БД
С какой версией клиентской библиотеки mysql собрана Qt?


Название: Re: события от БД
Отправлено: vasasol от Февраль 11, 2010, 22:36
вот захотелось от MySql 5.1 получать события об изменениях в БД
С какой версией клиентской библиотеки mysql собрана Qt?

4.5.3


Название: Re: события от БД
Отправлено: KADABRA от Февраль 11, 2010, 23:30
вот захотелось от MySql 5.1 получать события об изменениях в БД
С какой версией клиентской библиотеки mysql собрана Qt?
4.5.3
Я не версию Qt спрашиваю, а версию клиентской библиотеки mysql, с которой Qt скомпилирован.
Qt самосборная? Если нет, то скорее всего она собрана с библиотекой версии 5.0.x, тогда надо пересобрать плагин sqldrivers/qsqlmysql4 со свежей версией библиотеки, которая идёт в комплекте с MySQL.


Название: Re: события от БД
Отправлено: lit-uriy от Февраль 12, 2010, 00:15
vasasol, по моему ни один из SQL-драйверов Qt не имеет поддержки уведомлений (событий)


Название: Re: события от БД
Отправлено: vasasol от Февраль 12, 2010, 00:23
вот захотелось от MySql 5.1 получать события об изменениях в БД
С какой версией клиентской библиотеки mysql собрана Qt?
4.5.3
Я не версию Qt спрашиваю, а версию клиентской библиотеки mysql, с которой Qt скомпилирован.
Qt самосборная? Если нет, то скорее всего она собрана с библиотекой версии 5.0.x, тогда надо пересобрать плагин sqldrivers/qsqlmysql4 со свежей версией библиотеки, которая идёт в комплекте с MySQL.
все библиотеки имеют 5.1, Qt не самосборная. И как тогда правильно пересобрать qsqlmysql4?


Название: Re: события от БД
Отправлено: lit-uriy от Февраль 12, 2010, 00:24
, вот от драйвера мускуля, Qt 4.6.0
Код
C++ (Qt)
bool QMYSQLDriver::hasFeature(DriverFeature f) const
{
   switch (f) {
   case Transactions:
// CLIENT_TRANSACTION should be defined in all recent mysql client libs > 3.23.34
#ifdef CLIENT_TRANSACTIONS
       if (d->mysql) {
           if ((d->mysql->server_capabilities & CLIENT_TRANSACTIONS) == CLIENT_TRANSACTIONS)
               return true;
       }
#endif
       return false;
   case NamedPlaceholders:
   case BatchOperations:
   case SimpleLocking:
   case EventNotifications: // <-----------
   case FinishQuery:
       return false;
   case QuerySize:
   case BLOB:
   case LastInsertId:
   case Unicode:
   case LowPrecisionNumbers:
       return true;
   case PreparedQueries:
   case PositionalPlaceholders:
#if MYSQL_VERSION_ID >= 40108
       return d->preparedQuerysEnabled;
#else
       return false;
#endif
   case MultipleResultSets:
#if MYSQL_VERSION_ID >= 40100
       return true;
#else
       return false;
#endif
   }
   return false;
}


Название: Re: события от БД
Отправлено: vasasol от Февраль 12, 2010, 01:12
vasasol, по моему ни один из SQL-драйверов Qt не имеет поддержки уведомлений (событий)
А как решить тогда задачу?


Название: Re: события от БД
Отправлено: lit-uriy от Февраль 12, 2010, 01:36
1) использовать клиентскую библиотеку СУБД
2) по таймеру проверять какую-либо таблицу в БД


Название: Re: события от БД
Отправлено: vasasol от Февраль 12, 2010, 02:06
таймер не привлекает - это понятно как и неинтересно ..... а первый вариант как реализуется?


Название: Re: события от БД
Отправлено: break от Февраль 12, 2010, 05:16
Что-то подобное обсуждалось здесь http://www.prog.org.ru/topic_11523_0.html и здесь http://www.prog.org.ru/topic_4577_0.html
Кстати там есть ссылка http://labs.trolltech.com/blogs/2007/11/02/asynchronous-database-event-notifications/ в которой говорится что события от БД работают в драйвере Postgress и Firebird


Название: Re: события от БД
Отправлено: Пантер от Февраль 12, 2010, 07:32
В Postgress работает, проверено.


Название: Re: события от БД
Отправлено: lit-uriy от Февраль 12, 2010, 15:01
>>а первый вариант как реализуется?
Ну используя API СУБД. Например для Firebirda обычно пользуют библиотеку ibpp, не знаю почему, может родное API не очень удобное.
Я с мускулем не знаком, поэтому конкретно сказать не могу.

>>...в которой говорится что события от БД работают в драйвере Postgress и Firebird
Да, в исходниках драйвера Firebird'а я видел, что возвращается true, но работу не проверял.


Название: Re: события от БД
Отправлено: KADABRA от Февраль 12, 2010, 18:11
1) использовать клиентскую библиотеку СУБД
2) по таймеру проверять какую-либо таблицу в БД
Ещё можно дописать драйвер :)


Название: Re: события от БД
Отправлено: lit-uriy от Февраль 12, 2010, 21:04
>>Ещё можно дописать драйвер
угу


Название: Re: события от БД
Отправлено: ax от Февраль 13, 2010, 01:44
попробуй вставить после
Код:
app.connect(...);
Код:
       db.driver()->subscribeToNotification("tvoy_notification");






Название: Re: события от БД
Отправлено: lit-uriy от Февраль 13, 2010, 08:34
axax, а чем это поможет на мускуле, если драйвер Qt не поддерживает уведомления.


Название: Re: события от БД
Отправлено: SABROG от Февраль 13, 2010, 09:47
Тоже как-то хотел избавиться от постоянной проверки таблицы и найти способ общаться с БД callback'ами от неё. Только у меня база MSSQL, почитав темы на sql.ru пришел к выводу, что это такие дебри, что лучше даже не заморачиваться, т.к. либо получиться оверхед, либо костыль и ни одного из решений не удовлетворит полностью все твои потребности.


Название: Re: события от БД
Отправлено: ритт от Февраль 15, 2010, 09:41
а разве мускуль уже научился подписывать на/уведомлять о событиях?
http://search.mysql.com/search?site=refman-55&q=notification&lr=lang_en