On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 4890
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.05.16 14:39. Заголовок: MiniGui + PostgreSQL


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 133 , стр: 1 2 3 4 5 6 7 All [только новые]


постоянный участник




Пост N: 4962
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.06.16 16:04. Заголовок: Всем привет ! Кто то..


Всем привет !
Кто то работает на МиниГуи с PostgreSQL ?
Поделитесь опытом...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5705
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.06.16 16:02. Заголовок: Andrey пишет: Кто т..


Andrey пишет:

 цитата:
Кто то работает на МиниГуи с PostgreSQL ?


Погугли...
http://www.pctoledo.com.br/forum/viewtopic.php?f=45&t=14457

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 996
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.16 18:20. Заголовок: Andrey пишет:Поделит..


Andrey пишет:
 цитата:
Поделитесь опытом..


Примеры из contrib\hbpgsql\tests\*.* ты уже попробовал и классы (tpostgre.prg) для работы изучил ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4964
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.06.16 13:06. Заголовок: SergKis пишет: Прим..


SergKis пишет:

 цитата:
Примеры из contrib\hbpgsql\tests\*.* ты уже попробовал и классы (tpostgre.prg) для работы изучил ?


Примеры попробовал, работают.
Классы пока изучаю...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4997
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.16 01:18. Заголовок: Сделал пример, работ..


Сделал пример, работает....
Если база в инете и провайдер мудрит с портами, то пример на МиниГуи после сообщения об ошибке - вешается...
И причем к базе очень долгоооо коннектится....
Можно ли как то проверить доступнось IP-адреса по определённому порту ?
LetoDb отвечает корректно и быстрей ! Нет коннекта и всё тут !


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5854
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.07.16 09:52. Заголовок: Andrey Попробуй hb_..


Andrey
Попробуй hb_inetConnect( cAddress, nPort )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4998
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.16 12:33. Заголовок: Dima пишет: Попробу..


Dima пишет:

 цитата:
Попробуй hb_inetConnect( cAddress, nPort )



xVal := hb_inetConnect( "хх.хх.хх.хх", 5432 )
MsgDebug( xVal )

Выдаёт такое сообщение:


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5855
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.07.16 12:37. Заголовок: lResult := hb_inetI..


 
lResult := hb_inetInit() Инициализирует INET подсистему, возвращает .T. в случае успеха. Должна вызываться перед вызовами других INET функций ( в начале программы, например ).
hb_inetCleanup() Освобождает ресурсы, занятые INET подсистемой. Ее надо вызывать в конце программы, использующей INET функции.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4999
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.16 12:43. Заголовок: Не помогло... lResul..


Не помогло...
lResult := hb_inetInit() -> .T.
далее возвращает результат <pointer> ....

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5856
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.07.16 12:50. Заголовок: Примерно так if h..


Примерно так
 
if hb_inetInit()
hSocket := hb_inetCreate(2500)
hb_inetConnectIP( "192.168.0.200",13,hSocket )
if hb_inetErrorCode( hSocket )==0
ret:=.t.
else
ret:=.f.
endif
hb_inetCleanup()
endif


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5000
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.16 20:27. Заголовок: Dima пишет: Примерн..


Dima пишет:

 цитата:
Примерно так


Заработало ! Но опять возврат дурацкий...
MsgDebug( hSocket , hb_inetErrorCode( hSocket ), ret )
<pointer>, -1, .f.

Срабатывает через 2,5 сек.
А если брать стандартный коннект:
oServer := TPQServer():New(cHost, cDatabase, cUser, cPass,,schema)
то ответ приходит через 25 сек.

Спасибо БОЛЬШОЕ ДИМА !


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1228
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 10.07.16 20:35. Заголовок: Andrey пишет: Зараб..


Andrey пишет:

 цитата:
Заработало ! Но опять возврат дурацкий...
MsgDebug( hSocket , hb_inetErrorCode( hSocket ), ret )
<pointer>, -1, .f.


Что дурацкого в нем?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5863
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.07.16 21:24. Заголовок: Andrey пишет: Сраб..


Andrey пишет:

 цитата:

Срабатывает через 2,5 сек.


Dima пишет:

 цитата:
hSocket := hb_inetCreate(2500)


Ни о чем не говорит ?
Поиграй с цифрой и добейся нормального коннекта.
Цифра экспериментальная и я ее подбирал руками для LAN что работает
через инет.


Andrey пишет:

 цитата:
А если брать стандартный коннект:
oServer := TPQServer():New(cHost, cDatabase, cUser, cPass,,schema)


Возможно в нем где то настраивается таймаут , надо смотреть.

Andrey пишет:

 цитата:
А если брать стандартный коннект:


Его и надо юзать а не куй знает что
Это тоже самое что пытаться проверить коннект к LETODB (или ADS) такой же методой с таймаутом в 1 секунду
и потом удивляться полученному результату.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5001
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.16 22:45. Заголовок: PSP пишет: Что дура..


PSP пишет:

 цитата:
Что дурацкого в нем?



MsgDebug( hSocket , hb_inetErrorCode( hSocket ), lResult )

hSocket возвращает <pointer>
Что это такое ?

Dima пишет:

 цитата:
Его и надо юзать


Понял.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5864
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.07.16 22:56. Заголовок: Andrey пишет: Что э..


Andrey пишет:

 цитата:
Что это такое ?


Смотри доку Александра Кресина , там все доступно описано.
Andrey пишет:

 цитата:

hSocket возвращает <pointer>


Так и должно быть А ты ждал чего ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1229
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 11.07.16 12:53. Заголовок: Andrey, pointer - эт..


Andrey, pointer - это указатель.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5002
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.07.16 13:34. Заголовок: PSP пишет: Andrey, ..


PSP пишет:

 цитата:
Andrey, pointer - это указатель.




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1205
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.07.16 22:49. Заголовок: Пользуясь свободной ..


Пользуясь свободной минутой и прости из любопытства скачал Postgre.
Впечатления такие (о hbpgsql)

SergKis пишет:

 цитата:
классы (tpostgre.prg) для работы изучил ?


Для роботы метод New класса TPQserver нуждается в допиливании. Хотя бы до такого вида
New( cHost, cHostAddr, cDatabase, cUser, cPass, nPort, nTimeout, .. )

Andrey пишет:

 цитата:
А если брать стандартный коннект:
oServer := TPQServer():New(cHost, cDatabase, cUser, cPass,,schema)


А почему порт не указываете явно ::New( cHost, cDatabase, cUser, cPass, nPort, Schema )
тогда б, возможно, не пришлось писать:

 цитата:
Если база в инете и провайдер мудрит с портами, то пример на МиниГуи после сообщения об ошибке - вешается...


И, на мой взгляд, стандартный коннект это PQconnectdb(conninfo).
Как формировать строку conninfo можно почитать click here

Хотелось бы обратить внимание Андрея на описании hostaddr
Using hostaddr instead of host allows the application to avoid a host name look-up,
which may be important in applications with time constraints.
и connect_timeout
Maximum wait for connection, in seconds (write as a decimal integer string). Zero or not specified means wait indefinitely.
It is not recommended to use a timeout of less than 2 seconds.
Почему-то в примерах везде используется только host (localhost), а connect_timeout вообще не используется.
Из чего можно делать кое-какие предположения, но мы не будем :)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5005
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.07.16 23:44. Заголовок: Петр пишет: Для роб..


Петр пишет:

 цитата:
Для роботы метод New класса TPQserver нуждается в допиливании. Хотя бы до такого вида
New( cHost, cHostAddr, cDatabase, cUser, cPass, nPort, nTimeout, .. )


Я обратил на это внимание. У себя сделал.
А как это отразить изменение в классе для других ?
Чтобы потом не тащить этот исправленный исходник к себе в проект.

Петр пишет:

 цитата:
А почему порт не указываете явно ::New( cHost, cDatabase, cUser, cPass, nPort, Schema )


Как было в примерах, так стал использовать у себя.

И как добавить новую функцию для всех, чтобы сообщение об ошибках сервера приходило в кодировке RU1251 ?
По умолчанию ошибки идут в кодировке UTF...

Петр пишет:

 цитата:
Как формировать строку conninfo можно почитать click here


Спасибо БОЛЬШОЕ за наводку документации !

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 30
Зарегистрирован: 22.03.06
ссылка на сообщение  Отправлено: 20.07.16 10:07. Заголовок: Andrey пишет: Спаси..


Andrey пишет:

 цитата:
Спасибо БОЛЬШОЕ за наводку документации !



Учитывая любовь Андрея к великому и могучему то тут все тоже самое на родном click here
плюс есть еще сборки для виндовоза click here
но под Linux сервером мороки значительно меньше

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1206
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 20.07.16 10:45. Заголовок: И как добавить новую..



 цитата:
И как добавить новую функцию для всех, чтобы сообщение об ошибках сервера приходило в кодировке RU1251 ?
По умолчанию ошибки идут в кодировке UTF...



Зависит от настроек сервера. У меня на WIN7 в postgresql.sql можно найти
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'Ukrainian_Ukraine.1251' # locale for system error message strings

Создать универсальную функцию, наверное, не удастся.
Можете переопределить метод ErrorMsg() и вообще любой другой метод класса TPQserver используя наследование, или напишите свой класс, что называется "с нуля".


 цитата:
У себя сделал.
А как это отразить изменение в классе для других ?


Опять же, наследование при использовании классов - это, в общем случае, классика (масло масляное - :)).
Кому нужно создаст свой класс. Но поскольку базовый класс сделан довольно таки топорно и если уж так хочется поделиться, то
git push или через harbour devel-list


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5006
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.07.16 23:55. Заголовок: У себя в проекте под..


У себя в проекте подсоединяю либы:
-lminigui
-lhbpgsql
-llibpq

Ехе-ник стартует только при наличии libeay32.dll и libpq.dll

Как узнать версию libpq.dll (postgres version) который запускается вместе с моим ехе-ником ?
Есть ли какая функция для этого ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1033
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.07.16 10:49. Заголовок: Andrey пишет: Как у..


Andrey пишет:

 цитата:
Как узнать версию libpq.dll (postgres version) который запускается вместе с моим ехе-ником ?
Есть ли какая функция для этого ?


Тупо использовать функцию поиска строки , версия DLL хранится внутри текстовой строкой расширенной меж буквами символом CHR(0)
или дергать блок VersionInfo из ресурса DLL

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1207
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.07.16 12:06. Заголовок: Andrey пишет: Как у..


Andrey пишет:

 цитата:
Как узнать версию libpq.dll (postgres version) который запускается вместе с моим ехе-ником ?
Есть ли какая функция для этого ?



libpq version и postgres version - разные вещи
postgres version можете определить вызвав PQServerVersion( pConn )

для определения версии libpq добавьте в postgres.c следующий код

 цитата:

HB_FUNC( PQLIBVERSION )
{
#if PG_VERSION_NUM >= 90100
hb_retni( PQlibVersion() );
#else
hb_retni( 0 );
#endif
}


и пересоберите библиотеку hbpgsql

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5007
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.07.16 12:25. Заголовок: Петр пишет: libpq v..


Петр пишет:

 цитата:
libpq version и postgres version - разные вещи


Да я знаю про это.

Петр пишет:

 цитата:
для определения версии libpq добавьте в postgres.c следующий код


Спасибо БОЛЬШОЕ !

Придётся пользоваться тогда только своей (исправленной) библиотекой.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5009
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.07.16 13:32. Заголовок: Что то не идёт сборк..


Что то не идёт сборка либы, выдает ошибку:

Z:\Harbour SVN\contrib\hbpgsql>z:\HB32\BIN\hbmk2.exe hbpgsql.hbp
hbmk2: Warning: Missing dependency: pgsql

Подскажите пожалуйста, кто знает как собирать ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5012
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.16 17:47. Заголовок: Очень удобная вещь -..


Очень удобная вещь - этот PostgreSQL !!!
Принцип работы, как я понял также как в LetoDb.
Делаешь коннект к базе и работаешь...
Правда понятия отличны от Клипера/Харбора.
Условно говоря в PostgreSQL такая связка: БД -> таблицы -> схемы (более детально смотрите сами).

БД не такая как в Харборе:
1) между БД в PostgreSQL нет взаимодействия (или нужно ставить дополнение на сервере)
2) таблица в PostgreSQL соотвествует dbf-файлу Харбора

Переход с DBF на PostgreSQL в принципе не сложный.
TsBrowse работает с PostgreSQL, только надо его допиливать немного...
Пока гоняю тестовый пример, как сделаю - поделюсь.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5920
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.16 17:50. Заголовок: Andrey LetoDB чем н..


Andrey
LetoDB чем не устроил ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5013
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.16 20:44. Заголовок: Dima пишет: LetoDB ..


Dima пишет:

 цитата:
LetoDB чем не устроил ?


Из-за отсутствие обратной связи в LetoDb c Сайтом. Не смог написать (найти кто сделает) LetoDb->Руби->LetoDb.

C Андроидом тоже проблема. Как работать с LetoDb на нем - непонятно ? https://developer.android.com/studio/index.html
Т.е. вообще бы хорошо иметь:
1) Исходник клиента для других компиляторов: C++ и C#
2) Или независимую DLL для работы с LetoDb на других языках
3) для Андроида тоже нужны переходники.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5921
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.16 21:22. Заголовок: Andrey пишет: 3) дл..


Andrey пишет:

 цитата:
3) для Андроида тоже нужны переходники.


Для него если уже есть готовая прога есть протокол обмена , чем в данный момент и занимаюсь.
Все решаемо.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 315
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 24.07.16 21:55. Заголовок: Как запустить LETO н..


Как запустить LETO на WWW-сервере (LInux) ? Хоцца достучаться до него через Интернет без всяких медиаторов ...
(ТОже самое что написал Андрей чуть выше )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5014
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.16 00:41. Заголовок: Softlog86 пишет: Ка..


Softlog86 пишет:

 цитата:
Как запустить LETO на WWW-сервере (LInux) ? Хоцца достучаться до него через Интернет без всяких медиаторов ...



Спокойно запускается. У меня работает. Смотри тему http://clipper.borda.ru/?1-7-0-00000022-000-10001-0
К нему подключаются с других городов, я сам тестировал из-за границы.
Всё быстро, удобно. Мне очень нравиться.

Dima пишет:

 цитата:
Для него если уже есть готовая прога есть протокол обмена , чем в данный момент и занимаюсь.
Все решаемо.

У себя в проге обращаюсь поочередно к 2-м серверам: на CentOS и на Windows Server 2008.

У меня тоже есть прога на Андроиде. Работает через сайт. Сайт считывает записи из LetoDb.
Обратной связи нет.
Сделал костыль через CVS-файлы, эти файлы Андроид кладёт в папку и через файловые функции LetoDb перегоняю в DBF (раз в 3-5 минуты). А уже потом просматриваю dbf на МиниГуи.

Думаю, что через PostgreSQL буду получать данные напрямую в MiniGui + обратная связь будет, без таймера.





Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5017
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 13:09. Заголовок: Ну на до же, женщина..


Ну на до же, женщина кодит , да не просто так.

A patch for libpgsql
Скрытый текст

Уважаю !!!



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5925
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.16 14:13. Заголовок: Andrey А что тут де..


Andrey
А что тут делает эта тема вообще ?
Ей место в разделе выше ([x]Harbour) !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1208
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.07.16 14:31. Заголовок: Dima пишет: А что т..


Dima пишет:

 цитата:
А что тут делает эта тема вообще ?


Тема эта вроде в флейме была с другим названием (чем PostgreSQL лучше..), потом переползла в GUI из-за упоминания MiniGUI, наверное.
Лучше бы в флейме и осталась.




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5018
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 14:41. Заголовок: Петр пишет: Тема эт..


Петр пишет:

 цитата:
Тема эта вроде в флейме была с другим названием (чем PostgreSQL лучше..), потом переползла в GUI из-за упоминания MiniGUI, наверное.
Лучше бы в флейме и осталась.



Да нет эта тема задумывалась как переход на новые средства - МиниГуи + PostgreSQL



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5019
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 14:44. Заголовок: Dima пишет: Ей мест..


Dima пишет:

 цитата:
Ей место в разделе выше ([x]Harbour) !



Сделал тест для МиниГуи + PostgreSQL, копирование dbf-файла 13000 записей за 3 мин.
Тормоза однако. Но это копирование записей в лоб: одна за другой.
Искал варианты ускорения процесса.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5020
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 14:46. Заголовок: Что то не идёт сборк..


Петр пишет:

 цитата:
и пересоберите библиотеку hbpgsql



Что то не идёт сборка либы, выдает ошибку:

Z:\Harbour SVN\contrib\hbpgsql>z:\HB32\BIN\hbmk2.exe hbpgsql.hbp
hbmk2: Warning: Missing dependency: pgsql

Подскажите пожалуйста, кто знает как собирать ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1209
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.07.16 14:57. Заголовок: Переменная HB_WITH_P..


Переменная HB_WITH_PGSQL определена?

Почитайте README.md из поставки harbour

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5926
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.16 14:58. Заголовок: Andrey пишет: Да не..


Andrey пишет:

 цитата:
Да нет эта тема задумывалась как переход на новые средства - МиниГуи + PostgreSQL


Тут гуем и не пахнет да и при чем он тут , гуй это "средство для наведения красоты" и ты снова
путаешь теплое с мягким

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1248
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.07.16 16:31. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделал тест для МиниГуи + PostgreSQL, копирование dbf-файла 13000 записей за 3 мин.
Тормоза однако. Но это копирование записей в лоб: одна за другой.
Искал варианты ускорения процесса.


Андрюха, SQL никак не ускорит копирование файла. Это же ж Structured Query Language таки...)))

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5021
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 18:14. Заголовок: PSP пишет: Андрюха,..


PSP пишет:

 цитата:
Андрюха, SQL никак не ускорит копирование файла. Это же ж Structured Query Language таки...)))


Смотри Пост N: 5017 и читай по ссылке.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5022
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 18:16. Заголовок: Петр пишет: Почитай..


Петр пишет:

 цитата:
Почитайте README.md из поставки harbour


Не ту у меня такого файла...
Давно не обновлялся с CVS.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1210
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.07.16 19:45. Заголовок: Andrey пишет: Давно..


Andrey пишет:

 цитата:
Давно не обновлялся с CVS


Ну тогда открою великую тайну: harbour уже на git перешел..

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1249
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.07.16 20:23. Заголовок: Andrey пишет: Смотр..


Andrey пишет:

 цитата:
Смотри Пост N: 5017 и читай по ссылке.


И чё? "...in order to make the insertion of large portions of data into PostgreSQL faster..."
Одна простая вещь: физическая среда передачи данных. Всё остальное вторично. Если эта самая large portions of data пролазит через физику с трудом, то никакой SQL тут не поможет. Пойми это.
ps. nPreBuffer: автор подразумевает размер 1400 байт, чтобы был ниже стандартного MTU=1500 байт. Но, 1500 байт бывает только в случае соединения IPoE или в локальной сети. Все другие типы соединений имеют свой MTU. Это значит, что фрагментация пакетов будет в любом случае. Она там и пишет: "needs testing how libPQ is doing buffering by itself, and if this is needed?"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5023
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.16 21:10. Заголовок: Петр пишет: Ну тогд..


Петр пишет:

 цитата:
Ну тогда открою великую тайну: harbour уже на git перешел..


Спасибо ! Отстал я от жизни...

Но там тоже нет доки
https://github.com/harbour/core/tree/master/contrib/hbpgsql

Понял, про какую доку...
https://github.com/harbour/core/blob/master/README.md

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5927
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.16 21:56. Заголовок: вернул тему на место..


вернул тему на место

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5048
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.08.16 21:32. Заголовок: Разобрался со скорос..


Разобрался со скоростью загрузки в базу для PostgeSql.
Конвертор Dbf -> PostgeSql на MiniGui заработал !
База 18 Мб, 14 тыс.записей за 40 секунд всего - отправка ОДНИМ запросом. То что надо.
LetoDb так же примерно качает, может чуть быстрей, только за 15-20 транзакций.
Раньше было примерно 4 минуты.

Читал что в PostgeSql можно одним запросом отправлять 1Gb. Пока ещё не проверял...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5967
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.08.16 21:36. Заголовок: Andrey И в чем дело..


Andrey
И в чем дело было ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1253
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.08.16 21:45. Заголовок: Andrey пишет: Читал..


Andrey пишет:

 цитата:
Читал что в PostgeSql можно одним запросом отправлять 1Gb. Пока ещё не проверял...


К примеру, есть два канала: один - 10Миб/с, а второй 100Мбит/с. Как думаешь, одинаковое время будет затрачено на передачу пакета данных размером в 1Gb в обоих случаях? Может не стоит озвучивать цифры, зависящие от массы других факторов? Если на передачу тех же твоих 14тыс. записей через хреновый канал сотового оператора понадобится час, ты скажешь, что PostgeSQL - это отстой? Прости уж за сарказм))

 цитата:
LetoDb так же примерно качает, может чуть быстрей, только за 15-20 транзакций.


Это только подтверждает, что всё упирается в физику.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5049
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.08.16 14:26. Заголовок: PSP пишет: Это толь..


PSP пишет:

 цитата:
Это только подтверждает, что всё упирается в физику.



Да я не спорю с этим.
Просто долго ковырялся с простым решением у себя в тестовом примере, пока не догадался как сделать.

Dima пишет:

 цитата:
Andrey
И в чем дело было ?



Делал как раньше на LetoDb - отправка по одной записи.
Потом сделал (SergKis помог, без него бы не получилось!) отправку через транзакции.

В PostgreSql сделал отправку всей базы ОДНОЙ транзакцией.

Просто привыкнуть надо к Sql, работа с DBF это просто. Хотя дай поработать кто не работал с DBF, то для него будет много непоняток.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1256
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 17.08.16 14:29. Заголовок: Andrey пишет: Да я ..


Andrey пишет:

 цитата:
Да я не спорю с этим.
Просто долго ковырялся с простым решением у себя в тестовом примере, пока не догадался как сделать.


Ок, я тоже перегибаю)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5051
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.08.16 20:01. Заголовок: Хотелось бы иметь от..


Хотелось бы иметь отдельный модуль postgres_aadd.c
Чтобы не зависить от разработчиков contrib_hbpgsql, когда они ещё это сделают.


В свой проект я добавил модуль: postgres_aadd.c

---------------- файл postgres_aadd.c ------------------
/*
* Добавочный файл к postgres.c
* Для определения версии libpq
*/

#include "hbapierr.h"
#include "hbapiitm.h"

HB_FUNC( PQLIBVERSION )
{
//#if PG_VERSION_NUM >= 90100
hb_retni( PQlibVersion() );
//#else
// hb_retni( 0 );
//#endif
}

---------------- конец файла postgres_aadd.c ---------------

Закоментировал строчки, т.к. всегда возвращается 0
Но потом не идёт компиляция моего проекта, ошибка:
postgres_aadd.c:
Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland
Error: Unresolved external '_PQlibVersion' referenced from ....
hbmk2[dbf_to_PostgreSQL]: Error: Running linker. 2


Нашел в исходниках функцию:
int PQlibVersion(void)
{
return PG_VERSION_NUM;
}

Помогите пожалуйста кто может - как подсоединить эту функцию ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1257
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 20.08.16 21:51. Заголовок: PG_VERSION_NUM поищи..


PG_VERSION_NUM поищи для начала.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5052
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.16 04:28. Заголовок: PSP пишет: PG_VERSI..


PSP пишет:

 цитата:
PG_VERSION_NUM поищи для начала.



Не нашёл... Где хоть искаь то ?


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3483
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.16 09:00. Заголовок: Andrey пишет: Помог..


Andrey пишет:

 цитата:
Помогите пожалуйста кто может - как подсоединить эту функцию ?



Наверное надо подключить файлы в начале модуля:

#include "libpq-fe.h"
#include "pg_config.h"

А еще лучше

#include "hbpgsql.h"
в которм находятся соответствующий определения

А саму функцию лучше написать так:

#include "hbapi.h"
#include "hbpgsql.h"

HB_FUNC( PQLIBVERSION )
{
hb_retni( PG_VERSION_NUM );
}


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1264
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.08.16 12:30. Заголовок: Pasha пишет: А сам..


Pasha пишет:

 цитата:

А саму функцию лучше написать так:

Если Андрею дать грабли - он рано или поздно на них наступит.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5053
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.16 14:17. Заголовок: Петр пишет: Если Ан..


Петр пишет:

 цитата:
Если Андрею дать грабли - он рано или поздно на них наступит.


Не надо мне давать. Я и сам их найду !

Pasha пишет:

 цитата:
А саму функцию лучше написать так:


Спасибо ! Получилось.

Только фигня получается.
Эта функция возвращает 80408, т.е. номер библиотеки libpq.lib
А мне надо было версию libpq.dll лежащий рядом с ехе-ником, через которую обращаюсь с сервером PostgreSql.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1265
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.08.16 14:24. Заголовок: Andrey пишет: Тольк..


Andrey пишет:

 цитата:
Только фигня получается.


Не думал. что все получится так быстро (в смысле - грабли)

А ну попробуйте это
«
/* 
* IT IS IMPORTANT: in my case Postgres ver. 9.5.3 for Windows systems
* was installed on local machine, port 5432 (default)
*/

#include "hbdyn.ch"

PROCEDURE Main()

LOCAL hLib
LOCAL nVersion := 0

LOCAL cConnInfo
LOCAL host := "localhost"
LOCAL hostaddr := "127.0.0.1"
LOCAL port := 5432
LOCAL connect_timeout := 10

? PQlibVersion()
? hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } )
//? hb_DynCall( { "PQlibVersion", "libpq_8.dll", HB_DYN_CTYPE_INT } )

hLib := hb_libLoad ( "libpq.dll" )
IF ! Empty( hLib )
nVersion := hb_DynCall( { "PQlibVersion", hLib, HB_DYN_CTYPE_INT } )
IF nVersion < 90100
? "The function PQping() not supported."
QUIT
ENDIF
// 1) !!databases!! is not valid word for ConnInfo
cConnInfo := "host = localhost database = test"
PingTest( cConnInfo, hLib )
// 2) the default port for Postgres is 5432, but we can try connect to port 3333 and see what is happen
cConnInfo := "host = " + host + " port = " + "3333"
PingTest( cConnInfo, hLib )
// 3) next attempt
cConnInfo := hb_strFormat( "host = %1$s hostaddr = %2$s port = %3$d connect_timeout = %4$d", host, hostaddr, port, connect_timeout )
PingTest( cConnInfo, hLib )

hb_libFree( hLib )
ENDIF

RETURN

/*---
*
*/
STATIC PROCEDURE PingTest( c, hLib )

? 'cConnInfo is "' + c + '"'
? "PQPing( cConnInfo ) returns ", GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_INT }, c ) )

RETURN

/*---
*
*/
STATIC FUNCTION GetPingResult( n )

LOCAL aMsg := ;
{ ;
{ "PQPING_OK", "(server is accepting connections)"}, ;
{ "PQPING_REJECT", "(server is alive but rejecting connections)"}, ;
{ "PQPING_NO_RESPONSE", "(could not establish connection)"}, ;
{ "PQPING_NO_ATTEMPT", "(connection not attempted (bad params))"} ;
}
IF n >= 0 .AND. n < Len( aMsg )
RETURN ( aMsg[ n + 1 ][ 1 ] + " " + aMsg[ n + 1 ][ 2 ] )
ENDIF

RETURN ""

#pragma BEGINDUMP

#include "hbpgsql.h"

HB_FUNC( PQLIBVERSION )
{
hb_retni( PG_VERSION_NUM );
}

#pragma ENDDUMP
»

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5054
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.16 15:15. Заголовок: Петр пишет: А ну по..


Петр пишет:

 цитата:
А ну попробуйте это


Немного модифицировал под МиниГуи. Вот результат:
80408
90407
90407
cConnInfo is "host = localhost database = test"
PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params))
cConnInfo is "host = localhost port = 3333"
PQPing( cConnInfo ) returns PQPING_NO_RESPONSE (could not establish connection)
cConnInfo is "host = localhost hostaddr = 127.0.0.1 port = 5432 connect_timeout = 10"
PQPing( cConnInfo ) returns PQPING_NO_RESPONSE (could not establish connection)


Я так понял, что для определения версии libpq.dll достаточно всего этой строчки (и и новой функции):
? hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) ?

А выгружать/убить после этой функции hb_DynCall() - не надо ?
А то не пользовался такой функцией.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1266
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.08.16 15:26. Заголовок: Все понятно: - hbpgs..


Все понятно:
- hbpgsql из поставки MiniGUI;
- вызов hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) работает, пользуйтесь и помните о dll hell;
- сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте.





Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1267
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.08.16 15:29. Заголовок: Andrey пишет: А выг..


Andrey пишет:

 цитата:
А выгружать/убить после этой функции hb_DynCall() - не надо ?



Для вызова типа hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) никого убивать не надо.
hb_DynCall сама кого хошь убьет



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5055
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.16 15:54. Заголовок: Петр пишет: - серве..


Петр пишет:

 цитата:
- сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте.


Вот так:
80408 - 8.4.8
90407 - 9.4.7
90407 - 9.4.7
cConnInfo is "host = localhost database = test"
PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params))
cConnInfo is "host = Serv-Test port = 3333"
PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params))
cConnInfo is "host = Serv-Test hostaddr = 85.137.101.33 port = 5432 connect_timeout = 10"
PQPing( cConnInfo ) returns PQPING_OK (server is accepting connections)


Спасибо БОЛЬШОЕ Петр !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5058
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.08.16 00:09. Заголовок: Некоторые тесты срав..


Некоторые тесты сравнения LetoDb и PostgreSql.

LetoDb - отправка по 1000 записей за 1 транзакцию,
размер буфера транзакции равен 1 660 000 байт.

PostgreSql - отправка всех записей за 1 транзакцию,
размер буфера транзакции равен размеру файла.


Система CentOS, 1Gb ОЗУ, 2Gb HDD

----------------------------------
Файл: 16 Мб, 20 полей, 10 000 записей

LetoDb ver 2.15 - 15 транзакции, время копирования на сервер 00:04 (сек.)
PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 00:08 (сек.)


Файл: 158 Мб, 20 полей, 100 000 записей
LetoDb ver 2.15 - 143 транзакции, время копирования на сервер 00:25 (сек.)
PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер НЕТ. Вылет по ошибке.


Система Windows 2008 R2, 8Gb ОЗУ, 500Gb HDD
----------------------------------
Файл: 16 Мб, 20 полей, 10 000 записей

LetoDb ver 2.15 - 15 транзакции, время копирования на сервер 00:04 (сек.)
PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 00:08 (сек.)


Файл: 158 Мб, 20 полей, 100 000 записей
LetoDb ver 2.15 - 143 транзакции, время копирования на сервер 00:34 (сек.)
PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 01:22 (сек.)



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1259
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 25.08.16 16:42. Заголовок: Andrey пишет: Некот..


Andrey пишет:

 цитата:
Некоторые тесты сравнения LetoDb и PostgreSql.


Андрей, а скорость канала какая?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5059
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.08.16 17:18. Заголовок: 50-60 Мб...


50-60 Мб.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1260
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 25.08.16 17:32. Заголовок: Мне видится это так:..


Мне видится это так: когда передача идет порциями, сервер начинает записывать данные на диск по мере закрытия транзакций, не дожидаясь окончания передачи всех. В случае же, когда транзакция одна, сервер (postgre) сначала открывает новую транзакцию в журнале транзакций, накапливает ее (идет запись на диск), а потом, после закрытия клиентом, переписывает данные в основную базу (опять запись на диск). Т.е., идет интенсивное обращение к дисковой системе, растет время очереди диска. Получается, в этом примере postgre "уперся" в производительность диска.
Андрей, интересно, какие будут результаты, если на postgre тоже передать кусками.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1269
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.08.16 19:43. Заголовок: Andrey пишет: Систе..


Andrey пишет:

 цитата:
Система CentOS, 1Gb ОЗУ, 2Gb HDD


Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий?

Кроме скорости копирования, ведь важна и сохранность данных. К сожалению, мы не видим кода и говорить что-то по теме тяжело.

Andrey пишет:

 цитата:
PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер НЕТ. Вылет по ошибке.


Что значит вылет - программа упала или что?
Ошибка обрабатывалась?

Несколько ссылок по теме, ИМХО

Производительность приложений на основе PostgreSQL

Транзакции и точки сохранения в PostgreSQL


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5060
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.16 17:19. Заголовок: Петр пишет: Система..


Петр пишет:

 цитата:
Система CentOS, 1Gb ОЗУ, 2Gb HDD

Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий?


Это сервер, рабочий - взят в аренду. Прекрасно работает уже лет 5. ЛетоДБ уже года три работает на нем.
Поставил туда PostgreSQL для тестирования.
Петр пишет:

 цитата:
Что значит вылет - программа упала или что?
Ошибка обрабатывалась?



Ошибка не обрабатывалась. Программа упала при записи ОДНОЙ большой транзакции состоящей из 158 Мб (размер строки).
Смотрел по логам, нехватка памяти для PostgreSQL.
Т.е. нужно больше оперативки для PostgreSQL, а там всего 1Gb, свободно примерно 500Мб под работу.
Это не особо важно, что упала программа. Самое главное что такие данные можно писать в PostgreSQL.
Хотя реально такие большие данные сложно представить, да и оперативки сейчас много на серверах.

Тесты делал для сравнения с ЛетоДБ и текущими задачами, которые делаю.
Получается что ЛетоДБ шустрей будет в таких тестах. А дальше посмотрим.

Код выложу, просто ещё тест не доделал до конца.

Петр СПАСИБО за статьи !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5063
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.08.16 03:33. Заголовок: При старте программы..


PSP пишет:

 цитата:
Андрей, интересно, какие будут результаты, если на postgre тоже передать кусками.


Да наверно это лучше будет и по скорости и сервер с маленькой памятью - падать не будет.

--------------------
При старте программы открываю базу:
conn := PQconnectdb( "dbname="+cDatabase+"host ="+cHost+"user="+cUser+"password = "+cPass+"port=5432" )

Как проверить доступность базы через час/два/и т.д. из программы ?

Будет ли правильным следующий код:
IF PQstatus( conn ) != CONNECTION_OK
MsgStop( "Error connecting to server !")
ELSE
// запись в базу !
MsgLog(conn, VALTYPE(conn)) // возвращает ->'P' P что за тип такой ?
ENDIF

Читал про PQstatus здесь https://postgrespro.ru/docs/postgresql/9.5/libpq-status

И как сделать PQreset при ошибке ?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1270
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.08.16 07:15. Заголовок: Andrey пишет: MsgLo..


Andrey пишет:

 цитата:
MsgLog(conn, VALTYPE(conn)) // возвращает ->'P' P что за тип такой ?


Andrey пишет:

 цитата:


PSP пишет:
цитата:
Andrey, pointer - это указатель.






Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1271
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.08.16 07:54. Заголовок: Andrey пишет: Будет..


Andrey пишет:

 цитата:
Будет ли правильным следующий код:


В чем сомнения?

Можно так написать

 цитата:
 
IF PQstatus( conn ) == CONNECTION_BAD
PQreset( conn )
ENDIF

IF PQstatus( conn ) == CONNECTION_OK
// запись в базу !
ELSE
MsgStop( "Error connecting to server !")
ENDIF




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1272
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.08.16 08:32. Заголовок: Andrey пишет: Как п..


Andrey пишет:

 цитата:
Как проверить доступность базы через час/два/и т.д. из программы ?


Умеете изъясняться высоким стилем..

из программы ?
Программно используя libpq — библиотеку для языка C, hbpqsql — библиотеку для Harbour

через час/два/и т.д. ?
Используйте таймер.

доступность базы?
Нет в терминах postgree понятия доступность базы - есть доступность сервера (PQping) и статус соединения (PQstatus), есть PQsocket.
После подтвержения статуса соединения можно получить имя базы, с которой установлено соединение (PQdb)

В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5071
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.09.16 01:45. Заголовок: Петр пишет: В любом..


Петр пишет:

 цитата:
В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение.


Спасибо ! Понял.

Можно ли при получении данных с сервера:
oQuery := oServer:Query( "SELECT * FROM " + cTable )

как то и куда то поставить - do events ?
А то форма (в другом потоке) замирает и всё...

Потом в исходнике tpostgre.prg надо бы исправить
METHOD TableStruct( cTable ) CLASS TPQserver
строка 344 и ниже, а так же добавить новые типы полей для Харбора :
ELSEIF "timestamp" $ cType
cType := "C"

Как это сделать ? Писать в Github ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1275
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.09.16 12:13. Заголовок: Andrey пишет: Можно..


Andrey пишет:

 цитата:
Можно ли при получении данных с сервера:
oQuery := oServer:Query( "SELECT * FROM " + cTable )

как то и куда то поставить - do events ?


В существующем виде ответ - НЕТ

Или перепишите/дополните hbpgsql ( в части см. подключение к серверу баз данных неблокирующим способом), или оптимизируйте ваш запрос, потому, что

а) использование * вместо select_list в некоторых кругах считается плохим тоном ;
б) обратите внимание на то, что указания LIMIT и OFFSET позволяют получить только часть строк из тех, что выдал остальной запрос
Если и у вас в форме отображается 100 строк, зачем вам тащить 1000 (или того больше).


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1202
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.09.16 12:38. Заголовок: Andrey пишет: Потом ..


Andrey пишет:
 цитата:
Потом в исходнике tpostgre.prg надо бы исправить
METHOD TableStruct( cTable ) CLASS TPQserver
строка 344 и ниже, а так же добавить новые типы полей для Харбора :
ELSEIF "timestamp" $ cType
cType := "C"
Как это сделать ? Писать в Github ?


Можно сделать свой клас, наследованный от TPQserver, скопировать (в свой класс) и подправить как нужно METHOD TableStruct( cTable )
В программе вместо TPQserver использовать свой класс.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1277
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.09.16 17:59. Заголовок: Andrey пишет: Как э..


Andrey пишет:

 цитата:
Как это сделать ? Писать в Github ?



Кстати, с почином


 цитата:
2016-09-02 01:58 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com)
* contrib/hbpgsql/hbpgsql.hbx
* contrib/hbpgsql/postgres.c
+ add PQlibVersion() -> <nVersion> (returns 0 for pre-9.1 postresql versions)
Ref: https://github.com/harbour/core/pull/127/ by @VerchenkoAG



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5073
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.09.16 19:59. Заголовок: Петр пишет: Кстати,..


Петр пишет:

 цитата:
Кстати, с почином


Спасибо !
Буду дальше тогда предложения выкладывать...

Пока использую библиотеку \MiniGUI\SOURCE\HbPgSql, там сам tpostgre.prg исправил,
и очень хорошо и просто собирается libpq.lib - СПАСИБО БОЛЬШОЕ Григорию, об нас всех позаботился !!!
В Харборе contrib_hbpgsql - так и не смог собрать.

Столкнулся с такой непоняткой.
Тестирую работу с базой при отрыве соединения.
Т.е. база открыта в Tsbrowse, а потом я отключаю службу на сервере - Postgres.
Ну типа внезапный обрыв соединения.

После обрыва соединения проверяю доступность коннекта:
? "Ответ сервера при закрытии: ", PQstatus( oServer:pDb() )
IF PQstatus( oServer:pDb() ) == CONNECTION_OK
oServer:Commit()
ELSE
? "Ошибка сервера :", oServer:ErrorMsg()
ENDIF
oServer:Destroy() // убить объект


Почему PQstatus( oServer:pDb() ) выдаёт 0 (т.е. CONNECTION_OK ) ?
Что не так делаю ?

А потом сваливается с ошибкой в tpostgre.prg
Error BASE/2020 Неверный аргумент: PQRESULTSTATUS</p><BR>
Called from PQRESULTSTATUS(0)
Called from TPQSERVER:COMMIT(168)


res := PQexec( ::pDB, "COMMIT" ) // Строка 167
lError := PQresultStatus( res ) != PGRES_COMMAND_OK // Строка 168


Как в исходнике убрать ошибку или не надо убирать ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1278
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.09.16 22:13. Заголовок: Andrey пишет: Что н..


Andrey пишет:

 цитата:
Что не так делаю ?

Вам виднее

Andrey пишет:

 цитата:
А потом сваливается с ошибкой в tpostgre.prg

Ошибка в postgres.c

Andrey пишет:

 цитата:
или не надо убирать ?

Надо

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5075
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 15:39. Заголовок: А как бы использоват..


А как бы использовать функцию PQping у себя ?
Или нужно как то затаскивать через те функции которые давали:

hLib := hb_libLoad( "libpq.dll" )
? GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_CHAR }, c )

Неудобно уж очень.

Подскажите (помогите) сделать пожалуйста эту функцию для tpostgre.prg из MiniGUI\SOURCE\HbPgSql
Заранее огромное спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1279
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 03.09.16 16:04. Заголовок: Andrey пишет: Подск..


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)

Убедитесь, что все компилируется нормально и библиотеки создаются.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1280
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 03.09.16 16:16. Заголовок: Если все "хорошо..


Если все "хорошо", можете добавить нужную вам функциональность в postgres.c


 цитата:
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
}




ну и пересобрать библиотеку, конечно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5082
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.09.16 00:04. Заголовок: Петр пишет: ну и пе..


Петр пишет:

 цитата:
ну и пересобрать библиотеку, конечно.



Всё заработало !
Спасибо ОГРОМНОЕ !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1281
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.09.16 09:33. Заголовок: 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. в вашем случае переход на старшую версию вполне оправдан.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5083
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.09.16 16:55. Заголовок: Петр пишет: P.S. в ..


Петр пишет:

 цитата:
врядли вы сможете ощутить значительные неудобства при вызове _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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1284
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.09.16 17:21. Заголовок: Andrey пишет: Функц..


Andrey пишет:

 цитата:
Функция PQping() прекрасно ловит потерю связи с сервером


это хорошо, НО
Andrey пишет:

 цитата:
res := PQexec( ::pDB, "COMMIT" ) // Строка 167
lError := PQresultStatus( res ) != PGRES_COMMAND_OK // Строка 168

Как в исходнике убрать ошибку или не надо убирать ?


ошибку все равно убрать нужно

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5084
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.09.16 18:49. Заголовок: Петр пишет: ошибку ..


Петр пишет:

 цитата:
ошибку все равно убрать нужно


Да не знаю как...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5094
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.16 18:26. Заголовок: Столкнулся с большой..


Столкнулся с большой проблемой...
Использую 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 ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1227
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.16 18:57. Заголовок: Andrey пишет: Но про..


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


Так dbf или индекс не открыт ? Определись.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5095
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.16 19:41. Заголовок: На экране открываю 2..


На экране открываю 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




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1228
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.16 19:44. Заголовок: Andreyпишет DEFINE T..


Andreyпишет
 цитата:
DEFINE TBROWSE oBrw2 ;


хотелось уточнить что там дальше в ALIAS

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5098
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.16 22:15. Заголовок: Потом программа выле..


Ставлю проверку:
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() } ;
...


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6005
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.09.16 22:44. Заголовок: Andrey пишет: Error..


Andrey пишет:

 цитата:
Error BASE/1003 Переменная не существует: OQUERY


а она есть ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5099
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.16 23:16. Заголовок: Dima пишет: а она е..


Dima пишет:

 цитата:
а она есть ?



Есть. Объект не удалял.




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1051
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.09.16 09:28. Заголовок: Andrey пишет: Есть...


Andrey пишет:

 цитата:
Есть. Объект не удалял.


Весь код давай , а то тут все в угадайку играют

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6006
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.09.16 16:06. Заголовок: А если ее сделать не..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5100
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.09.16 16:16. Заголовок: Dima пишет: А если ..


Dima пишет:

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



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



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1229
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.16 16:17. Заголовок: Dima пишет А если ее..


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


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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5101
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.09.16 16:24. Заголовок: Нашёл в \hmg.3.4..


Нашёл в \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 ;" ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1292
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 10.09.16 18:13. Заголовок: Andrey пишет: Что з..


Andrey пишет:

 цитата:
Что за фокус такой, открывать "SELECT * FROM test ;" ?


Андрей, скачайте, наконец, с помощью git сырцы harbour, посмотрите contrib rddsql/sddpg и не морочьте голову людям своими (чужими) строчками.

По существу - это какое-то PGRDD (VIA "pgrdd"), скорее всего на базе RDDSQL, украшенное препроцессором


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 238
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 10.09.16 19:10. Заголовок: Andrey пишет: Что з..


Andrey пишет:

 цитата:
Что за фокус такой, открывать "SELECT * FROM test ;" ?



Например с помощью ADO

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5312
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.02.17 17:50. Заголовок: Блин, что за SQL так..


Блин, что за SQL такая непростая штука...
Чтобы записать в базу несколько полей целые простыни писать приходиться....

Кому интересно (примерно так):
Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 664
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 12.02.17 10:20. Заголовок: Andrey Блин, что за..


Andrey

 цитата:
Блин, что за SQL такая непростая штука...
Чтобы записать в базу несколько полей



Харбоур на SQL и не ориентирован. Вот пример запроса на обновление, на отбор данных.
Строится с помощью построителя

 цитата:

Обновление
PARAMETERS SourceId Long, DestId Long;
INSERT INTO DocAdd ( KOD, SCHET1, SCHET2, AmortSum, Skl, KOL2, Norma, BalSt, OBECT1, golov, id )
SELECT DocAdd.KOD, DocAdd.SCHET1, DocAdd.SCHET2, DocAdd.NDS, DocAdd.Skl, DocAdd.KOL, DocAdd.Price, DocAdd.SUMMA, DocAdd.OBECT1, DocAdd.golov, [DestId] AS Выражение1
FROM DocAdd
WHERE (((DocAdd.id)=[SourceId]));

ВЫборка
SELECT treb.SCHET1, Sum(treb.SUMMA) AS Summa, treb.SCHET2, Org.REMNAME AS Org
FROM PubVar, Org INNER JOIN treb ON Org.NPP = treb.Org2
WHERE (((treb.SCHET1) Like [PubVar].[Sch]) AND ((treb.SCHET2) Like [PubVar].[SchK]) AND ((treb.DATA) Between [PubVar].[NData] And [PubVar].[EData]))
GROUP BY treb.SCHET1, treb.SCHET2, Org.REMNAME;




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1361
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.17 20:02. Заголовок: Andrey пишет целые п..


Andrey пишет
 цитата:
целые простыни писать приходиться....


кто мешает сделать как то так
 
Func SqlData( dD, cT )
Local cRet := "NULL"
If empty(dD); RETURN cRet
EndIf
cRet := TRANSFORM( DTOS(dD),"@R 9999-99-99" )
If !Empty(cT); cRet += TRANSFORM(cT,"@R 99:99") + ":00'"
EndIf
RETURN cRet

для др. типов данных так же сделать преобразовани для команды sql

Func SqlExec( cQuery, cMsg )
Local ... // сам определишь

res := PQping( M->cPubPgConnInfo ) // проверка доступности сервера
IF res == PQPING_OK
PQexec( oServer:pDB, "BEGIN" ) // oServer:StartTransaction()
res := PQexec( oServer:pDB, cQuery )
nResultStatus := PQresultStatus( res )
M->oServer:cError := PQresultErrorMessage( res )
IF nResultStatus == PGRES_COMMAND_OK
cMsg += "Результат: " + GetResultStatus( nResultStatus, 2 ) + CRLF + CRLF
//WaitWindowOk(cMsg + CRLF)
cErr := "Добавление строки: " + HB_UTF8TOSTR( oServer:ErrorMsg() ) + CRLF + CRLF
cErr += "Запрос: " + HB_UTF8TOSTR( cQuery )
//HB_MemoWrit( ChangeFileExt( cFile, ".ok" ), cErr )
ELSE
cMsg += "Результат: " + GetResultStatus( nResultStatus, 2 ) + " - "
cMsg += GetResultStatus( nResultStatus, 3 ) + CRLF + CRLF
WaitWindowError(cMsg + CRLF)
cErr := "Ошибка добавления строки: " + HB_UTF8TOSTR( oServer:ErrorMsg() ) + CRLF + CRLF
cErr += "Запрос, вызвавший ошибку: " + HB_UTF8TOSTR( cQuery )
HB_MemoWrit( ChangeFileExt( cFile, ".err" ), cErr )
ENDIF
PQexec( oServer:pDB, "END" )
lRet := .t.
ELSE
lRet := .f.
cMsg := "Ошибка сервера: " + GetPingResult( res )
cMsg += CRLF + "Запись с XID="+HB_NtoS(nIdz) + " не проведена !"
? cMsg
WaitWindowError(cMsg)
// вывести в журнал отладку
cMsg := "Ошибка сервера: " + GetPingResult( res )
cMsg += CRLF + "Запись с XID="+HB_NtoS(nIdz)+" не проведена !"
cMsg += " -> Oператор: " + HB_NtoS(M->nOperat)
ENDIF

Retrun

и твой набор команд сократиться. Еще делаем шаблоны sql команд и hash с блоками кодов для получения значений полей табл.:
hBlock := {"^01" => {|| ...}, ;
"^02" => {|| ...}, ;
... ;
}
cMaska := '"cnza"=^01, "dtza"=^02, "kmaster"=^03, "qadres"=^04, "qdop"=^05, "qoborud"=^06, "qneispr"=^07,
"qsrokza"=^08, "qoperat"=^09, "qvipza"=^10, "kdate"=^11, "kvipza"=^12, "datesrok"=^13, "datepere"=^13, "rem"=^15'
aDim := HB_ATokens( cMaska, ',')
aOut := {}
For i := 1 To len(aDim)
a := HB_ATokens(aDim[ i ], "=")
b := hb_HGetDef(nBlock, a[ i ][2], Nil)
If hb_IsBlock(b)
s := EVal(b) // возврат всегда строка
If len(s) > 0; AAdd(aOut, a[ i ][1]+"="+s // есть резултат (длина > 0)
EndIf
EndIf
Next
cQuery := 'UPDATE test SET '
k := len(aOut)
For i := 1 To k; cQuery += aOut[ i ] + iif( i < k, ", ", "" )
Next
? cQuery

Это схема, а не отлаженный код.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5313
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.02.17 13:15. Заголовок: SergKis пишет: кто ..


SergKis пишет:

 цитата:
кто мешает сделать как то так


Да я только начал с синтаксисом разбираться. Идея отличная. Буду впоследствии так и делать. Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 665
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 13.02.17 14:22. Заголовок: Буду впоследствии т..



 цитата:
Буду впоследствии так и делать.


Лучше в построителе строить запрос с ПАРАМЕТРАМИ. Они (построители) для Postgres то же есть. Строишь запрос, проверяешь , а потом одну (всего одну строку) , возможно
длинную, копируешь в свою программу. Добавляешь передачу параметров и все ок

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5314
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.02.17 16:45. Заголовок: Vlad04 пишет: Лучше..


Vlad04 пишет:

 цитата:
Лучше в построителе строить запрос с ПАРАМЕТРАМИ. Они (построители) для Postgres то же есть.



Я его ещё в глаза не видел.
Где его смотреть ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1362
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.02.17 16:48. Заголовок: Vlad04 пишет Лучше в..


Vlad04 пишет
 цитата:
Лучше в построителе строить


С формы ввода (изменено несколько Getbox данных) перегонять на сервер всю запись, можно, но ...
можно гнать только реально измененные значения, создав sql команду на лету (как показано выше)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 668
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 13.02.17 18:29. Заголовок: Andrey Я его ещё в ..


Andrey

 цитата:
Я его ещё в глаза не видел.


Самый доступный посмотреть, это в MSACCESS.
Для Postgres то же есть, поищи в Интернете.

SergKis
Да все возможно.Это хорошо, когда есть варианты.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5316
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.02.17 01:50. Заголовок: Запускаю свою прогу ..


Запускаю свою прогу на МиниГуи + PgSql на ХР (libpq.dll от версии 9.5 и соответственно libpq.lib этой версии)
Требует intl.dll при запуске. Добавил его и ещё libeay32.dll + ssleay32.dll
Далее требует msvcr120.dll
Нашёл сайте Майкрософт vcredist_x86.exe 2012 года
Поддерживаемая операционная система
Windows 7 Service Pack 1; Windows 8; Windows 8.1; Windows Server 2003; Windows Server 2008 R2 SP1; Windows Server 2008 Service Pack 2; Windows Server 2012; Windows Vista Service Pack 2; Windows XP

Установил его в ХР, всё равно не работает программа, не запускается !!!

Под 7-кой приложение нормально запускается.

Вопрос: как запустить под ХР ????

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3533
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.02.17 08:51. Заголовок: Наверное, надо устан..


Наверное, надо установить msvc runtime соответствующей версии. Какой - не знаю.
Выдал у себя команду:

dir/s msvcr*.dll >e:\msv.txt

нашлось много чего:

Содержимое папки C:\Windows\System32

01.10.2012 21:30 829 264 msvcr100.dll
11.09.2013 19:39 18 000 msvcr100_clr0400.dll
05.11.2012 23:26 849 360 msvcr110.dll
11.09.2013 19:39 855 664 msvcr110_clr0400.dll
24.07.2014 23:47 869 544 msvcr120_clr0400.dll
16.12.2011 11:46 634 880 msvcrt.dll
6 файлов 4 056 712 байт

Содержимое папки C:\Windows\SysWOW64

13.06.2014 10:23 773 968 msvcr100.dll
11.09.2013 21:21 18 000 msvcr100_clr0400.dll
06.11.2012 02:20 875 472 msvcr110.dll
11.09.2013 21:21 863 344 msvcr110_clr0400.dll
25.07.2014 02:35 875 688 msvcr120_clr0400.dll
18.03.2002 16:01 344 064 msvcr70.dll
21.02.2003 15:42 348 160 msvcr71.dll
16.12.2011 10:52 690 688 msvcrt.dll
14.07.2009 04:15 253 952 msvcrt20.dll
14.07.2009 04:07 60 928 msvcrt40.dll
10 файлов 5 104 264 байт

это все для разных версий msvc, многие продукты требуют для работы свою версию.

Ну и традиционное общее замечание:
Невозможно писать программу на "МиниГуи + PgSql"
Можно писать на Harbour + bcc или скажем mingw, и использовать какие-то дополнительные библиотеки, те же minugui и hbpqsql.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6300
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.02.17 09:34. Заголовок: Andrey Отсюда бери ..

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5317
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.02.17 11:37. Заголовок: Pasha пишет: Наверн..


Pasha пишет:

 цитата:
Наверное, надо установить msvc runtime соответствующей версии. Какой - не знаю.


Это точно так. Я понял, что здесь собака и зарыта.

Методом проб и ошибок нашёл что нужно для XP чтобы прога "Harbour + bcc + minugui + hbpqsql" заработала.
Нужно в систему ставить Microsoft Visual C++ 2013 Redistributable (x86) 12.0.30501 - 6,3Mb всего.
После этого прога в ХР заработала....

Блин и как теперь можно сделать замену этого малопонятного окна у себя в программе ?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1424
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 20.02.17 15:05. Заголовок: Andrey пишет: Блин ..


Andrey пишет:

 цитата:
Блин и как теперь можно сделать замену этого малопонятного окна у себя в программе ?


Чтоб сделать замену именно этого придется немало поучиться

С другой стороны ничто не мешает проверить наличие установленной версии MS runtime
Примерно во так как здесь
Detect if Visual C++ Redistributable for Visual Studio 2013 is installed


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1372
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.02.17 17:11. Заголовок: Andrey перепиши все..


Andrey
перепиши все нужные dll из vc к своему exe и так устанавливай. А что у кого (версии ms) стоит\нет - не всегда поможет решить проблемму, то админа нет, то прав и т.д.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5318
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.02.17 19:52. Заголовок: Петр пишет: С друго..


Петр пишет:

 цитата:
С другой стороны ничто не мешает проверить наличие установленной версии MS runtime


Да делал такое уже один раз в своём почтовике.
Ехе-ник проверял Redistributable for Visual Studio 2008 если нет, то давал возможность ставить его по ссылке с сайта,
а если есть, то выгружал из своих ресурсов второй ехе-ник, уже отправляющий почту.
Люблю проги из одного ехе-ника !
Девиз: всё своё ношу с собой !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5319
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.02.17 07:01. Заголовок: Для работы PostgreSq..


Для работы PostgreSql на МиниГуи в проект добавляю следующие библиотеки:
# extension *.Lib  PostgreSQL 
-lhbpgsql
-llibpq


Для работы ехе-ника необходимы 4 dll-ки:
libpq.dll (версии 9.5)
intl.dll
libeay32.dll
ssleay32.dll


Можно как то отказаться от intl.dll чтобы далее не требовалась msvcr120.dll,
т.е. обойтись без Microsoft Visual C++ 2013 Redistributable (x86) 12.0.30501 ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1426
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.02.17 09:45. Заголовок: Chapter 16. Installa..


Chapter 16. Installation from Source Code
16.7.4. MinGW/Native Windows

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5326
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.03.17 21:01. Заголовок: Всем привет ! Имею ..


Всем привет !

Имею такой код отправки на сервер:
    res := PQping( M->cPubPgConnInfo ) // проверка доступности сервера   
IF res == PQPING_OK
PQexec( oServer:pDB, "BEGIN" ) // oServer:StartTransaction()
res := PQexec( oServer:pDB, cQuery )
nResultStatus := PQresultStatus( res ) // строка 657
M->oServer:cError := PQresultErrorMessage( res )
IF nResultStatus == PGRES_COMMAND_OK
cMsg += "Результат: " + GetResultStatus( nResultStatus, 2 ) + CRLF + CRLF
//WaitWindowOk(cMsg + CRLF)
cErr := "Добавление строки: " + HB_UTF8TOSTR( oServer:ErrorMsg() ) + CRLF + CRLF
cErr += "Запрос: " + HB_UTF8TOSTR( cQuery )
//HB_MemoWrit( ChangeFileExt( cFile, ".ok" ), cErr )
ELSE
cMsg += "Результат: " + GetResultStatus( nResultStatus, 2 ) + " - "
cMsg += GetResultStatus( nResultStatus, 3 ) + CRLF + CRLF
WaitWindowError(cMsg + CRLF)
cErr := "Ошибка добавления строки: " + HB_UTF8TOSTR( oServer:ErrorMsg() ) + CRLF + CRLF
cErr += "Запрос, вызвавший ошибку: " + HB_UTF8TOSTR( cQuery )
HB_MemoWrit( ChangeFileExt( cFile, ".err" ), cErr )
ENDIF
PQexec( oServer:pDB, "END" )
lRet := .t.
ELSE
lRet := .f.
cMsg := "Ошибка сервера: " + GetPingResult( res )
cMsg += CRLF + "Запись с XID="+HB_NtoS(nIdz) + " не проведена !"
? cMsg
WaitWindowError(cMsg)
// вывести в журнал отладку
cMsg := "Ошибка сервера: " + GetPingResult( res )
cMsg += CRLF + "Запись с XID="+HB_NtoS(nIdz)+" не проведена !"


Периодически у ОДНОГО заказчика (другие не жаловались) вылетает прога с такой ошибкой:


Судя по коду - ошибка в С-функции...
Как исправить это ?
Почему только у одного заказчика вылетает ( Операционка Win7) ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1430
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.03.17 01:12. Заголовок: Andrey пишет: Как и..


Andrey пишет:

 цитата:
Как исправить это ?


все функции проверять на код возврата, тогда и вопросов меньше будет.

Andrey пишет:

 цитата:
Почему только у одного заказчика вылетает


Странно, что у всех работает
У этого банально может сеть глючить.

Andrey пишет:

 цитата:
Судя по коду - ошибка в С-функции...


там же написано - неверный аргумент.

все функции проверять на код возврата, по возможности применять async api


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5327
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.03.17 20:25. Заголовок: Петр пишет: все фун..


Петр пишет:

 цитата:
все функции проверять на код возврата, по возможности применять async api



Подскажи пожалуйста как это сделать правильно ?
А то сомневаюсь я что сделаю правильно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1431
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.03.17 11:58. Заголовок: Andrey пишет: Подск..


Andrey пишет:

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


Во-первых извините за задержку с ответом, не всегда есть время отвечать.
Во-вторых, чего непонятного я написал?

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



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1432
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.03.17 12:20. Заголовок: Andrey пишет: 1)re..


Andrey пишет:

 цитата:
 
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
и т.д.



Вы же проверки делаете через раз и проверки делаете формально.

В строке 1) проверка вроде есть, допустим сервер пингуется.
Но в строке 3) перед вызовом PQexec состояние соединения (PQstatus) не определяется, после вызова состояние результата (PQresultStatus) игнорируется, состояние транзакции (PQTransactionStatus) игнорируется.

В строке 5) проводится проверка, но она приводит к плачевным результатам (плачевным для существуюшей реализации, но относительно корректным вообще), потому, что игнорируется возможный результат возврата функции PQexec() и поведение функции PQresultStatus().

Корректная проверка должна выглядеть как-то так

 
res := PQexec( oServer:pDB, cQuery )
if Empty( res )
nResultStatus := PGRES_FATAL_ERROR
else
nResultStatus := PQresultStatus( res )
endif

или в более компактной версии
nResultStatus := if( Empty( res ), PGRES_FATAL_ERROR, PQresultStatus( res ) )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1433
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.03.17 12:35. Заголовок: Чтобы меньше букафф..


Чтобы меньше букафф писать и исходя из описания

 цитата:
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).



функция
 
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 );
}

может быть реализована так
 
HB_FUNC( PQRESULTSTATUS )
{
PGresult * res = hb_PGresult_par( 1 );

hb_retni( PQresultStatus( res ) );
}


напишите разработчикам (Виктору)



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5328
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.03.17 16:28. Заголовок: Петр СПАСИБО БОЛЬШОЕ..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5350
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.04.17 14:37. Заголовок: Переделал проверку. ..


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

Странная ошибка очень...
И только у одного клиента.
И почему вешается программа после отправки (или во время следующей отправки) ?




Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 147
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 29.11.18 20:43. Заголовок: До сегодняшнего дня ..


До сегодняшнего дня не имел дела с 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 нашел.
Кто этот квест уже проходил, напишите, где их брать. Если у вас есть, может вышлете?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6974
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.11.18 00:07. Заголовок: rvu пишет: Кто этот..


rvu пишет:

 цитата:
Кто этот квест уже проходил, напишите, где их брать


Это к Андрею , главное что бы он не забыл что делал ....

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 148
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 30.11.18 15:31. Заголовок: Dima пишет: Это к А..


Dima пишет:

 цитата:
Это к Андрею , главное что бы он не забыл что делал ....



Если делает, dll у него, наверное, есть.
Только зашел бы он в эту тему...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6136
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.11.18 19:58. Заголовок: Dima пишет: Это к А..


Dima пишет:

 цитата:
Это к Андрею , главное что бы он не забыл что делал ....


Специально сделал готовые примеры, которых нет у Григория.
https://abonent4.ru/minigui/

Смотреть - Пример работы с объектом Tsbrowse и конвертирование dbf в PostgresSQL и обратно в dbf

У меня в задаче включена работа с PostgresSQL (база в инете на сайте) и LetoDB (сервер тоже в инете).
Отличные продукты.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 149
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 05.12.18 14:29. Заголовок: Andrey пишет: Специ..


Andrey пишет:

 цитата:
Специально сделал готовые примеры, которых нет у Григория.



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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1418
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.12.18 15:24. Заголовок: rvu пишет: А вот вы..


rvu пишет:

 цитата:
А вот вышеуказанный пример из Минигуи так и не пошел. Видимо, не подходят ему эти dll. Где их брать?


http://clipper.borda.ru/?1-4-1544012562201-00000950-000-10001-0#002.001
и прочитать несколько постов ниже

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6982
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.12.18 16:10. Заголовок: Haz пишет: и прочит..


Haz пишет:

 цитата:
и прочитать несколько постов ниже


или тут https://indy.fulgan.com/SSL/
или самостоятельно погуглить

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 133 , стр: 1 2 3 4 5 6 7 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 653
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет