Форум » Для флейма » MiniGui + PostgreSQL » Ответить

MiniGui + PostgreSQL

Andrey: Кому будет интересно. https://habrahabr.ru/post/282764/

Ответов - 133, стр: 1 2 3 4 5 6 7 All

Andrey: Петр пишет: все функции проверять на код возврата, по возможности применять async api Подскажи пожалуйста как это сделать правильно ? А то сомневаюсь я что сделаю правильно.

Петр: Andrey пишет: Подскажи пожалуйста как это сделать правильно ? А то сомневаюсь я что сделаю правильно. Во-первых извините за задержку с ответом, не всегда есть время отвечать. Во-вторых, чего непонятного я написал? Каждая функция возвращает результат и желательно (а иногда и просто необходимо) его проверить на допустимость перед тем как передавать на обработку в другую функцию. В случае связки клиент-сервер такую проверку нужно проводить всегда, если не хотите терять данные.

Петр: Andrey пишет: [pre2] 1)res := PQping( M->cPubPgConnInfo ) // проверка доступности сервера 2)IF res == PQPING_OK 3) PQexec( oServer:pDB, "BEGIN" ) // oServer:StartTransaction() 4) res := PQexec( oServer:pDB, cQuery ) 5) nResultStatus := PQresultStatus( res ) // строка 657 и т.д.[/pre2] Вы же проверки делаете через раз и проверки делаете формально. В строке 1) проверка вроде есть, допустим сервер пингуется. Но в строке 3) перед вызовом PQexec состояние соединения (PQstatus) не определяется, после вызова состояние результата (PQresultStatus) игнорируется, состояние транзакции (PQTransactionStatus) игнорируется. В строке 5) проводится проверка, но она приводит к плачевным результатам (плачевным для существуюшей реализации, но относительно корректным вообще), потому, что игнорируется возможный результат возврата функции PQexec() и поведение функции PQresultStatus(). Корректная проверка должна выглядеть как-то так [pre2] res := PQexec( oServer:pDB, cQuery ) if Empty( res ) nResultStatus := PGRES_FATAL_ERROR else nResultStatus := PQresultStatus( res ) endif [/pre2] или в более компактной версии nResultStatus := if( Empty( res ), PGRES_FATAL_ERROR, PQresultStatus( res ) )


Петр: Чтобы меньше букафф писать и исходя из описания The PQresultStatus function should be called to check the return value for any errors (including the value of a null pointer, in which case it will return PGRES_FATAL_ERROR). функция [pre2] HB_FUNC( PQRESULTSTATUS ) { PGresult * res = hb_PGresult_par( 1 ); if( res ) hb_retni( PQresultStatus( res ) ); else hb_errRT_BASE( EG_ARG, 2020, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } [/pre2] может быть реализована так [pre2] HB_FUNC( PQRESULTSTATUS ) { PGresult * res = hb_PGresult_par( 1 ); hb_retni( PQresultStatus( res ) ); } [/pre2] напишите разработчикам (Виктору)

Andrey: Петр СПАСИБО БОЛЬШОЕ !

Andrey: Переделал проверку. Всё прекрасно работает у всех. Только у одного (у этого же клиента, про которого писал ранее) периодически вешается программа 3-4 раза в день. Ошибка отправки - вот лог: [pre2]Результат: PGRES_FATAL_ERROR - сбой запроса Ошибка добавления строки: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. Запрос, вызвавший ошибку: INSERT INTO ......[/pre2] Странная ошибка очень... И только у одного клиента. И почему вешается программа после отправки (или во время следующей отправки) ?

rvu: До сегодняшнего дня не имел дела с PostgreSQL, только название слышал. Нашел \MiniGUI\SAMPLES\BASIC\PostgreSQL\ Написано, что нужны dll PostgreSQL версии 8.4 На большинстве сайтов такой версии уже нет, но где-то нашел. Запускаю demo, говорит, нужен libpq.dll Скопировал его в папку с программой. Потом demo потребовало comerr32.dll krb5_32.dll libiconv-2.dll libintl-8.dll В PostgreSQL таких не оказалось (посмотрел новую версию 11.0 их там тоже нет). Где-то скачал. Теперь говорит: Порядковый номер 248 не найден в библиотеке DLL krb5_32.dll Подозреваю, что я какие-нибудь не те версии dll нашел. Кто этот квест уже проходил, напишите, где их брать. Если у вас есть, может вышлете?

Dima: rvu пишет: Кто этот квест уже проходил, напишите, где их брать Это к Андрею , главное что бы он не забыл что делал ....

rvu: Dima пишет: Это к Андрею , главное что бы он не забыл что делал .... Если делает, dll у него, наверное, есть. Только зашел бы он в эту тему...

Andrey: Dima пишет: Это к Андрею , главное что бы он не забыл что делал .... Специально сделал готовые примеры, которых нет у Григория. https://abonent4.ru/minigui/ Смотреть - Пример работы с объектом Tsbrowse и конвертирование dbf в PostgresSQL и обратно в dbf У меня в задаче включена работа с PostgresSQL (база в инете на сайте) и LetoDB (сервер тоже в инете). Отличные продукты.

rvu: Andrey пишет: Специально сделал готовые примеры, которых нет у Григория. Твой пример удалось запустить, потребовалось только отыскать файл ssleay32.dll. А вот вышеуказанный пример из Минигуи так и не пошел. Видимо, не подходят ему эти dll. Где их брать? Но пока есть с чем разбираться. Спасибо!

Haz: rvu пишет: А вот вышеуказанный пример из Минигуи так и не пошел. Видимо, не подходят ему эти dll. Где их брать? http://clipper.borda.ru/?1-4-1544012562201-00000950-000-10001-0#002.001 и прочитать несколько постов ниже

Dima: Haz пишет: и прочитать несколько постов ниже или тут https://indy.fulgan.com/SSL/ или самостоятельно погуглить



полная версия страницы