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

MiniGui + PostgreSQL

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

Ответов - 126, стр: 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] Странная ошибка очень... И только у одного клиента. И почему вешается программа после отправки (или во время следующей отправки) ?



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