crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Подписка из Qt Script на уведомления PostgreSQL, Помогите со статьёй из вашей Вики
sergesb
  опции профиля:
сообщение 7.10.2010, 15:03
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 7.10.2010
Пользователь №: 2093

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




Репутация:   0  


Очень нужна реализация уведомлений из PostgreSQL. Нашел на вашем вики очень интересную статью по этому.
Подписка из Qt Script на уведомления PostgreSQL
Так как никогда не работал с QtScript, порошу помощи, или объясните как прикрутить это к программе, или реализацию на с++ без использования QtScript.
Не понял что делают тут :
Определяем в qt script функцию-подписчика:

noticeReceiver = function(severity, primary, detail, hint) {
    message = primary;
    if (detail != "")
        message += "\n" + detail;
    if (hint != "")
        message += "\n" + detail;
    if (severity == "WARNING") {
        print(message);
    } else if (severity == "NOTICE") {
        print(message);
    } else if (severity == "INFO") {
        print(message);
    } else if (severity == "LOG") {
        print(message);
    }
};

Выполняем подписку в qt script:

if (!PQsetNoticeReceiver(sqlConnectionName, noticeReceiver))
        print("Unable to set postgresql notice receiver");

где определяют, что определяют, что такое noticeReceiver ?
Заранее спасибо.

Сообщение отредактировал Litkevich Yuriy - 9.11.2010, 21:51
Причина редактирования: поправил название
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.10.2010, 17:29
Сообщение #2


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

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

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




Репутация:   94  


Цитата(sergesb @ 7.10.2010, 19:03) *
что такое noticeReceiver ?
это переменная. Т.к. я зык Qt Script - язык с динамической типизацией, то тип данных не указывается (смотри также Python, Basic, ...), в отличие от языков со статической типизацией (например, Паскаль, Си, ...)

тип который будет иметь эта переменная, определяется типом, возвращаемым функцией
function(severity, primary, detail, hint)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sergesb
  опции профиля:
сообщение 7.10.2010, 21:14
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 7.10.2010
Пользователь №: 2093

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




Репутация:   0  


а как мне этот код вставить в С++ код, и увязать с ним ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 27.10.2010, 21:59
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


Цитата(sergesb @ 7.10.2010, 22:14) *
а как мне этот код вставить в С++ код, и увязать с ним ?

Как вариант сигналы и слоты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
asvil
  опции профиля:
сообщение 9.11.2010, 21:29
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.4.2010
Пользователь №: 1647

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




Репутация:   0  


sergesb, поясните что вам необходимо.
Я в свою очередь просто расскажу как вывести postgresql notice в qWarning(), не доверяя это дейсвтие libpq.
Итак сначала сделаем приложение независимым от библиотек при компиляции.
Определите в вашем заголовочном файле следующие типы.
#include <QtSql/QSqlDatabase>
#include <QtSql/qsql_psql.h>
//#include "libpq-fe.h"

// Переменные обозначающие части сообщений сервера
#define PG_DIAG_SEVERITY        'S'
#define PG_DIAG_SQLSTATE        'C'
#define PG_DIAG_MESSAGE_PRIMARY 'M'
#define PG_DIAG_MESSAGE_DETAIL    'D'
#define PG_DIAG_MESSAGE_HINT    'H'
#define PG_DIAG_STATEMENT_POSITION 'P'
#define PG_DIAG_INTERNAL_POSITION 'p'
#define PG_DIAG_INTERNAL_QUERY    'q'
#define PG_DIAG_CONTEXT            'W'
#define PG_DIAG_SOURCE_FILE        'F'
#define PG_DIAG_SOURCE_LINE        'L'
#define PG_DIAG_SOURCE_FUNCTION 'R'


// Функция-подписчик на PostgreSQL нотисы
typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res);

// Функция устанавливающая подписчика на PostgreSQL нотисы
typedef PQnoticeReceiver (*PQsetNoticeReceiver)(PGconn *conn,
                                                PQnoticeReceiver proc,
                                                void *arg);

// Функция возвращающая определенные части сообщения
typedef char * (*PQresultErrorField)(const PGresult *res, int fieldcode);

В вашем файле реализации сделайте следующие действия:
// Переменные хранящие указатели на функции
PQsetNoticeReceiver pqSetNoticeReceiver;
PQresultErrorField pqResultErrorField;
#include <QtCore/QLibrary>
/*!
  Загрузка libpq.
  \return bool
  \retval true успешно
  \retval false не успешно
*/
bool initPostgresqlLibrary()
{
  QLibrary library("libpq");
  if (library.load()) {
    pqSetNoticeReceiver = (PQsetNoticeReceiver)(library.resolve("PQsetNoticeReceiver"));
    pqResultErrorField = (PQresultErrorField)(library.resolve("PQresultErrorField"));
    return pqSetNoticeReceiver && pqResultErrorField;
  }
  return false;
}

// MINI HACK
// Вызывает qWarning() функцию с 4-мя параметрами severity, primary, detail, hint
// severity - уровень сообщения
void PostgreSQLnoticeReceiver(void *arg ,const PGresult *res)
{
  QString severity = QString::fromUtf8(pqResultErrorField(res, PG_DIAG_SEVERITY));
  QString primary = QString::fromUtf8(pqResultErrorField(res, PG_DIAG_MESSAGE_PRIMARY));
  QString detail = QString::fromUtf8(pqResultErrorField(res, PG_DIAG_MESSAGE_DETAIL));
  QString hint = QString::fromUtf8(pqResultErrorField(res, PG_DIAG_MESSAGE_HINT));

// КЛЮЧЕВАЯ СТРОКА
    qWarning() << severity << primary << detail << hint;
}

//Возмите QSqlDatabase и получите указатель на PGconn
// Далее на этот PGconn установите обработчик сообщений
void PQsetNoticeReceiverWrapper(QSqlDatabase& database)
{
      QVariant driverHandle = database.driver()->handle();
      if (!QString::compare(driverHandle.typeName(),"PGconn*")) {
        PGconn *handle = *static_cast<PGconn **>(driverHandle.data());
        if (handle != 0) {
          if (initPostgresqlLibrary()) {
            pqSetNoticeReceiver(handle, PostgreSQLnoticeReceiver, 0);
            return true;
          }
        }
      }
    }
  }
  return false;
}

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

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


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




RSS Текстовая версия Сейчас: 28.4.2024, 2:34