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

MiniGui + PostgreSQL

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

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

Петр: Andrey пишет: Подскажите (помогите) сделать пожалуйста эту функцию для tpostgre.prg из MiniGUI\SOURCE\HbPgSql скачайте архив #1 В архиве 2 пакетных файла: MakeLib.bat и to_95.bat Поместите их в MiniGUI\SOURCE\HbPgSql, заменив при этом оригинальный MakeLib.bat Запустите на выполнение to_95.bat В каталоге MiniGUI\SOURCE\HbPgSql будут созданы 2 каталога 8.4 и 9.5. Часть файлов будут перемещены в 8.4. Посмотрите как выглядит каталог 8.4. скачайте архив #2 Разместите файлы из архива в MiniGUI\SOURCE\HbPgSql\9.5. Структура каталога 9.5 должна напоминать структуру каталога 8.4 Откомпилируйте библиотеку hbpgsql (через MakeLib.bat) Убедитесь, что все компилируется нормально и библиотеки создаются.

Петр: Если все "хорошо", можете добавить нужную вам функциональность в postgres.c [pre2]HB_FUNC( PQPING ) { #if PG_VERSION_NUM >= 90100 if( HB_ISCHAR( 1 ) ) hb_retni( PQping( hb_parc( 1 ) ) ); else hb_errRT_BASE( EG_ARG, 2020, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); #else hb_retni( 2 ); #endif }[/pre2] ну и пересобрать библиотеку, конечно.

Andrey: Петр пишет: ну и пересобрать библиотеку, конечно. Всё заработало ! Спасибо ОГРОМНОЕ !


Петр: Andrey пишет: Всё заработало ! ну и чудненько. Теперь можете попробовать убедить Григория внести изменения в MakeLib.bat и в структуру каталога HbPgSQL. Для совместимости можно оставить set PQ_VER=8.4 Andrey пишет: hLib := hb_libLoad( "libpq.dll" ) ? GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_CHAR }, c ) Неудобно уж очень. Позвольте не согласиться. Вот так как вы изобразили - может быть, НО ЕСЛИ прописать где-то в tpostgre.prg FUNCTION _PQping( cConnInfo ) RETURN hb_DynCall( { "PQping", "libpq.dll", HB_DYN_CTYPE_INT }, cConnInfo ) или просто добавить в начале приложения (или в каком-то включаемом файле *.ch) строку #translate _PQPing( <cConnInfo> ) => hb_DynCall( { "PQping", "libpq.dll", HB_DYN_CTYPE_INT }, <cConnInfo> ) врядли вы сможете ощутить значительные неудобства при вызове _PQping( cConnInfo ) в сравнении с PQping( cConnInfo ). Уже знакомый вам пример (можно включить в поставку MiniGUI, хуже не будет ) P.S. в вашем случае переход на старшую версию вполне оправдан.

Andrey: Петр пишет: врядли вы сможете ощутить значительные неудобства при вызове _PQping( cConnInfo ) в сравнении с PQping( cConnInfo ). Я понял подход. Про это не подумал сразу. Спасибо ! Петр пишет: P.S. в вашем случае переход на старшую версию вполне оправдан. Спасибо ! Функция PQping() прекрасно ловит потерю связи с сервером, да и GetPingResult() тоже классная функция ! cStaticConnInfo := hb_strFormat( "hostaddr = %1$s port = %2$s connect_timeout = %3$s", cHost, cPort, cTimeout ) res := PQping( cStaticConnInfo ) // проверка доступности сервера IF res == PQPING_OK // можно работать с сервером ELSE cMsg := "Ошибка сервера: " + GetPingResult( res ) MsgStop(cMsg) ? cMsg ENDIF Пришлось внести изменения в postgres.ch: /* From libpq-fe.h * PGPing - The ordering of this enum should not be altered because the * values are exposed externally via pg_isready. For version 9 */ #define PQPING_OK 0 #define PQPING_REJECT 1 #define PQPING_NO_RESPONSE 2 #define PQPING_NO_ATTEMPT 3

Петр: Andrey пишет: Функция PQping() прекрасно ловит потерю связи с сервером это хорошо, НО Andrey пишет: res := PQexec( ::pDB, "COMMIT" ) // Строка 167 lError := PQresultStatus( res ) != PGRES_COMMAND_OK // Строка 168 Как в исходнике убрать ошибку или не надо убирать ? ошибку все равно убрать нужно

Andrey: Петр пишет: ошибку все равно убрать нужно Да не знаю как...

Andrey: Столкнулся с большой проблемой... Использую Tsbrowse по базе PostgreSQL - работает... Но происходит вылет(закрывается по ошибке) если нет открытого dbf-файла. По исходнику h_tbrowse.prg вылет происходит так: Error DBCMD/2001 Файл не открыт: ORDSETFOCUS Called from ORDSETFOCUS(0) Called from (b)TSBROWSE_SETDBF(11389) Called from TSBROWSE:NLOGICPOS(7320) Called from TSBROWSE:LBUTTONDOWN(6926) Called from TCONTROL:HANDLEEVENT(902) Called from TSBROWSE:HANDLEEVENT(7399) Called from EVENTS(79) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1395) Called from DOMETHOD(4651) Called from FORM_PGSQL(167) Called from MYPGSQL(97) Вылет понятен, так как в исходнике ничего не прописано про PostgreSQL If "ADS" $ ::cDriver ... Else ::bTagOrder := {|uTag| ( cAlias )->( OrdSetFocus( uTag ) ) }, ; ::bGoToPos := {|n| Eval( ::bKeyNo, n ) } EndIf Как туда можно прикрутить PostgreSQL ?

SergKis: Andrey пишет: Но происходит вылет(закрывается по ошибке) если нет открытого dbf-файла. По исходнику h_tbrowse.prg вылет происходит так: Error DBCMD/2001 Файл не открыт: ORDSETFOCUS Так dbf или индекс не открыт ? Определись.

Andrey: На экране открываю 2 бровса. Второй с PostgreSQL. FUNCTION Form_PgSql() .... DEFINE TBROWSE oBrw2 ; .... MyCreateTable2(...) END TBROWSE .... STATIC FUNCTION MyCreateTable2(...) ... // создать первую колонку с номером в таблице ADD COLUMN TO oBrw2 HEADER "№№" ; DATA { || oQuery:RECNO() } ; ... // создать другие колонки PGLoadFields( "oBrw2", cForm, .T. ) ... Первое окно с Dbf закрываю. На экране остаётся второй Tsbrowse. Вот он и ломается ! Хотя переменные разные: oBrw1 и oBrw2

SergKis: Andreyпишет DEFINE TBROWSE oBrw2 ; хотелось уточнить что там дальше в ALIAS

Andrey: Ставлю проверку: cAlias := ::cAlias ::cDriver := ( ::cAlias )->( RddName() ) MsgDebug( cAlias, ::cDriver ) Выводит - DBF2TEST, DBFCDX Потом программа вылетает вот так: Error BASE/1003 Переменная не существует: OQUERY Called from (b)MYCREATETABLE2(225) Called from TSBROWSE:DRAWLINE(2942) Called from TSBROWSE:LBUTTONDOWN(6920) Called from TCONTROL:HANDLEEVENT(902) Called from TSBROWSE:HANDLEEVENT(7399) Called from EVENTS(79) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1395) Called from DOMETHOD(4651) Called from MYTABLEDBF(107) Т.е. вот эта строка - ADD COLUMN TO oBrw2 HEADER "№№" ; DATA { || oQuery:RECNO() } ; ...

Dima: Andrey пишет: Error BASE/1003 Переменная не существует: OQUERY а она есть ?

Andrey: Dima пишет: а она есть ? Есть. Объект не удалял.

Haz: Andrey пишет: Есть. Объект не удалял. Весь код давай , а то тут все в угадайку играют

Dima: А если ее сделать не Private а Public и убрать Static у этой функции...

Andrey: Dima пишет: А если ее сделать не Private а Public и убрать Static у этой функции... Какая разница. Это же в тексте этого модуля происходить. Там кажись теряется весь объект oServer := TPQServer():NEW()

SergKis: Dima пишет А если ее сделать не Private а Public и убрать Static у этой функции... Не поможет, т.к. 1. алиас oBrw2 прицепился к алиасу oBrw1 2. блоки кодов управления заполнены на дбф (а здесь переменная объект запроса к постгрес) 3. Возможно надо исп. ole If Upper( uAlias:ClassName() ) == "TOLEAUTO" cAlias := "ADO_" ::oRSet := uAlias EndIf 4. Возможно проще обойтись массивом и как писап Петр ограниченным запросом LIMIT 100

Andrey: Нашёл в \hmg.3.4.3\SAMPLES\HFCL\SQL\POSTGRESQL_1\demo.prg такую строчку: nConnectionHandle := dbPGConnection( cServer + ";" + cDataBase + ";" + cUser + ";" + cPassWord ) CreateTable( cServer , cDataBase , cUser , cPassWord ) USE "SELECT * FROM test ;" ALIAS Test NEW VIA "pgrdd" CONNECTION nConnectionHandle Что за фокус такой, открывать "SELECT * FROM test ;" ?

Петр: Andrey пишет: Что за фокус такой, открывать "SELECT * FROM test ;" ? Андрей, скачайте, наконец, с помощью git сырцы harbour, посмотрите contrib rddsql/sddpg и не морочьте голову людям своими (чужими) строчками. По существу - это какое-то PGRDD (VIA "pgrdd"), скорее всего на базе RDDSQL, украшенное препроцессором



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