Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle? Kann es die dbf-Beschränkungen für die Datenbankgröße von 2 GB und die Anzahl der Felder von 2048 überwinden?

Ist es möglich, die einfachsten Beispiele für die Verwendung des Servers zu nennen https://sourceforge.net/projects/pgsqlportable/ auf meinem kleinen Lernbeispiel (beigefügt):

Code: Alles auswählen

     PROCEDURE AppSys
     // Рабочий стол остается окном приложения
     RETURN
     
     ********************************************************************************
     FUNCTION Main()
     
     LOCAL Getlist := {}, oProgress, oDialog
     LOCAL aSay[30], Mess97, Mess98, Mess99               // Массив сообщений отображаемых стадий исполнения (до 30 на экране)

        DC_IconDefault(1000)

        SET DECIMALS TO 15
        SET DATE GERMAN
        SET ESCAPE On

********************************************************************

mNField  = 2048
mNRecord = 1000000000


mNField  = 10
mNRecord = 10000000

@1,1  DCGROUP oGroup1 CAPTION 'Задайте параметры базы данных:' SIZE 40.0, 3.5

@1,2  DCSAY "Количество полей:"                  PARENT oGroup1 
@1,20 DCSAY "" GET mNField  PICTURE "##########" PARENT oGroup1 

@2,2  DCSAY "Количество записей:"                PARENT oGroup1 
@2,20 DCSAY "" GET mNRecord PICTURE "##########" PARENT oGroup1 

DCREAD GUI;
      TO lExit ;
      FIT;
      ADDBUTTONS;
      MODAL;
      TITLE 'Эксперименты с ADS и PGDBU'
      IF lExit
         ** Button Ok
      ELSE
         QUIT
      ENDIF
********************************************************************

   Wsego = mNRecord

   // Отображение стадии исполнения. Будет написано прямо в окне Progress-bar
   d = 0
   @0,0 DCGROUP oGroup1 CAPTION 'Стадии исполнения процесса' FONT "6.Helv" SIZE 105+d, 2.5 PARENT oTabPage1
   @4,0 DCGROUP oGroup2 CAPTION 'Прогноз времени исполнения' FONT "6.Helv" SIZE 105+d, 5.0 PARENT oTabPage2
   
    s = 1
   @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT aSay[ 1] FONT "10.Helv"
    s++
   @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay97   FONT "10.HelvBold"
    s++
   @0.2+s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay98 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
   @1.5+s  ,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay99 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
   
   @s  ,1 DCPROGRESS oProgress ;
          SIZE 95,1.5 ;
          PERCENT ;
          EVERY 1;                          // Кол-во обновлений изображения
          MAXCOUNT Wsego; 
          COLOR GRA_CLR_CYAN                // Цвет полосы
   @s++,97 DCPUSHBUTTON  CAPTION '&Cancel' ;
          ACTION {||lOk:=.T.} OBJECT oButton ;
          SIZE 7,1.5
   DCREAD GUI ;
          TITLE 'Создание базы данных "BigData.dbf"' ;
          PARENT @oDialog  ;
          FIT ;
          EXIT ;
          MODAL

   oDialog:alwaysOnTop = .T.       // Окно открывается на переднем плане
   oDialog:show()

   ****** Обработка ошибки ******************
   bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
   BEGIN SEQUENCE                                   // код нормального исполнения

         *** код нормального исполнения

         aStructure := { { "NumbRecord"  , "N", 19, 0} }
         
         FOR j=1 TO mNField
             FieldName = "F"+ALLTRIM(STR(j,19))
             AADD(aStructure, { FieldName  , "N", 19, 7 })
         NEXT
         DbCreate( "BigData.dbf", aStructure )

   RECOVER                                          // код обработки ошибки
         aMess := {}
         AADD(aMess, "Возникла ошибка при попытке создания БД с числом полей: "+ALLTRIM(STR(mNField)))
         LB_Warning(aMess)
         MsgBox('')
         QUIT
   ENDSEQUENCE 
   ErrorBlock( bError )                             // переустановить старый кодовый 
   ******************************************

   // Начало отсчета времени для прогнозирования длительности исполнения
   Time_progress = 0
   // Прошло секунд с начала процесса
   // Процесс может идти больше суток, поэтому для определения
   // во всех случаях вычисляется время, прошедшее с начала года
      T_Mess1    = "Начало:"+" "+TIME()            // Начало
      Sec_1      = (DOY(DATE())-1)*86400+SECONDS()
      PUBLIC T1 := (DOY(DATE())-1)*86400+SECONDS()        // Время предыдущей индикации процесса исполнения
      PUBLIC T2 := (DOY(DATE())-1)*86400+SECONDS()+1      // Текущее время (1-й раз оно заметно больше T1 чтобы было отображение)
      PUBLIC T1tp := T1
      PUBLIC T2tp := T2
   *********************************************************************************

   ****** Обработка ошибки ******************
   bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
   BEGIN SEQUENCE                                   // код нормального исполнения

         *** код нормального исполнения

         aSay[ 1]:SetCaption('Идет процесс создания базы данных: "BigData.dbf"')

         USE BigData EXCLUSIVE NEW

         FOR r=1 TO mNRecord

             APPEND BLANK
             REPLACE NumbRecord WITH r

             lOk = Time_Progress (++Time_Progress, mNRecord, oProgress, lOk )

         NEXT

   RECOVER                                          // код обработки ошибки
         CLOSE ALL
         aMess := {}
         AADD(aMess, "Возникла ошибка при попытке добавления в БД записи N=й: "+ALLTRIM(STR(r)))
         LB_Warning(aMess)
         MsgBox('')
         QUIT
   ENDSEQUENCE 
   ErrorBlock( bError )                             // переустановить старый кодовый 
   ******************************************

   CLOSE ALL

   oSay97:SetCaption(oSay97:caption)
   oButton:SetCaption('&Ok')          // Деструктурирование окна отображения графического Progress-bar
   oButton:activate := {||PostAppEvent(xbeP_Close,,,oDialog)}  //<<<<<< Add This
   DC_AppEvent( @lOk )
*  PostAppEvent(xbeP_Activate,,,DC_GetObject(GetList,'DCGUI_BUTTON_OK'))       // Роджер
   oDialog:Destroy()

   aMess := {}
   AADD(aMess, 'База данных: "BigData.dbf" успешно создана')
   LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')

   RETURN NIL

   ***********************************************************************************************************************

   FUNCTION LB_Warning( message, ctitle )
   
     LOCAL aMsg := {}
   *  DEFAULT cTitle TO ''
     IF valtype(message) # 'A'
       aadd(aMsg,message)
     ELSE
       aMsg := message
     ENDIF
     IF LEN(ALLTRIM(cTitle)) > 0
        DC_MsgBox(10,10,aMsg,cTitle)
     ELSE
        DC_MsgBox(10,10,aMsg,'Эксперименты с "BigData.dbf"')
     ENDIF
   
   RETURN NIL

   ***********************************************************************************************************************

***********************************************************************************************************
****** Графический прогресс-бар (на основе примера XSample_14() xdemo.exe)
***********************************************************************************************************
FUNCTION Time_Progress(Time_Progress, Wsego, oProgress, lOk )

    LOCAL nMaxCount := Wsego
    xtime     = Time_Progress

    ** Отображение занимает очень много времени, поэтому показывать прогресс не чаще чем через 0.1 секунды (как в PercTimeVisio())

    T2tp = (DOY(DATE())-1)*86400+SECONDS()          // Текущее время
    IF T2tp - T1tp > 0.1 .OR. xtime = Wsego         // Время в секундах или 100%

*      aSay[mPTVnumb]:SetCaption(mPTVmess+' '+ALLTRIM(STR(mNumPP/Wsego*100,15,7))+'%')

       *** Индикация времени исполнения

       ***** Процесс может идти больше суток, поэтому для определения
       ***** во всех случаях вычисляется время, прошедшее с начала года
*      T_Mess1 = "Начало:"+" "+TIME()           // Начало

       ***** Прошло секунд с начала процесса
       PUBLIC T_Mess2 := "ch:mi:se"
       Sec_2   = (DOY(DATE())-1)*86400+SECONDS() - Sec_1
       ch2 = INT(Sec_2/3600)                    // Часы
       mm2 = INT(Sec_2/60)-ch2*60               // Минуты
       cc2 = Sec_2-ch2*3600-mm2*60              // Секунды
       T_Mess2 = "Прошло:"+" "+ALLTRIM(STRTRAN(T_Mess2,"ch",STR(ch2,19)))
       T_Mess2 = STRTRAN(T_Mess2,"mi",STRTRAN(STR(mm2,2)," ","0"))
       T_Mess2 = STRTRAN(T_Mess2,"se",STRTRAN(STR(cc2,2)," ","0"))
       *@19,2 SAY T_Mess2+" всего: "+ALLTRIM(STR(Sec_2,17))+" сек."

       PUBLIC T_Mess3 := "ch:mi:se"             // Осталось
       Sec_3 = Sec_2*Wsego/xtime                // Прогн.длит.исп. в секундах
       ch3 = INT(Sec_3/3600)                    // Часы
       mm3 = INT(Sec_3/60)-ch3*60               // Минуты
       cc3 = Sec_3-ch3*3600-mm3*60              // Секунды
       T_Mess3 = ALLTRIM(STRTRAN(T_Mess3,"ch",STR(ch3,19)))
       T_Mess3 = STRTRAN(T_Mess3,"mi",STRTRAN(STR(mm3,2)," ","0"))
       T_Mess3 = STRTRAN(T_Mess3,"se",STRTRAN(STR(cc3,2)," ","0"))
       *@20,2 SAY T_Mess3+" всего: "+ALLTRIM(STR(Sec_3,17))+" сек."

       PUBLIC T_Mess4 := "ch:mi:se"             // Окончание
       Sec_4 = Sec_1 + Sec_3 - (DOY(DATE())-1)*86400
       ch4 = INT(Sec_4/3600)                    // Часы
       mm4 = INT(Sec_4/60)-ch4*60               // Минуты
       cc4 = Sec_4-ch4*3600-mm4*60              // Секунды
       T_Mess4 = "Окончание:"+" "+ALLTRIM(STRTRAN(T_Mess4,"ch",STR(ch4,19)))
       T_Mess4 = STRTRAN(T_Mess4,"mi",STRTRAN(STR(mm4,2)," ","0"))
       T_Mess4 = STRTRAN(T_Mess4,"se",STRTRAN(STR(cc4,2)," ","0"))
       *@21,2 SAY T_Mess4+" всего: "+ALLTRIM(STR(Sec_4,17L())+" сек.с нач.суток")

       PUBLIC T_Mess5 := "Средн.время обработки 1-го объекта: ch:mi:se"
       Sec_5 = Sec_2/xtime
       ch5 = INT(Sec_5/3600)                    // Часы
       mm5 = INT(Sec_5/60)-ch5*60               // Минуты
       cc5 = Sec_5-ch5*3600-mm5*60              // Секунды
       T_Mess5 = ALLTRIM(STRTRAN(T_Mess5,"ch",STR(ch5,19)))
       T_Mess5 = STRTRAN(T_Mess5,"mi",STRTRAN(STR(mm5,2)," ","0"))
       T_Mess5 = STRTRAN(T_Mess5,"se",STRTRAN(STR(cc5,2)," ","0"))
       *@22,2 SAY T_Mess5+" всего: "+ALLTRIM(STR(Sec_5,17))+" сек."

       PUBLIC T_Mess6 := "ch:mi:se"             // Осталось
       Sec_6 = Sec_3 - Sec_2
       ch6 = INT(Sec_6/3600)                    // Часы
       mm6 = INT(Sec_6/60)-ch6*60               // Минуты
       cc6 = Sec_6-ch6*3600-mm6*60              // Секунды
       T_Mess6 = "Осталось:"+" "+ALLTRIM(STRTRAN(T_Mess6,"ch",STR(ch6,19)))
       T_Mess6 = STRTRAN(T_Mess6,"mi",STRTRAN(STR(mm6,2)," ","0"))
       T_Mess6 = STRTRAN(T_Mess6,"se",STRTRAN(STR(cc6,2)," ","0"))
       *@23,2 SAY T_Mess6+" всего: "+ALLTRIM(STR(Sec_6,17))+" сек."

       Mess98 = T_Mess1+SPACE(142-LEN(T_Mess1)-LEN(T_Mess4))+T_Mess4  // Начало, окончание (прогноз) 145
       oSay98:SetCaption(Mess98);oSay98:SetCaption(oSay98:caption)

       Mess99 = T_Mess2+SPACE(144-LEN(T_Mess2)-LEN(T_Mess6))+T_Mess6  // Прошло, осталось (прогноз)  146
       oSay99:SetCaption(Mess99);oSay99:SetCaption(oSay99:caption)

       DC_GetProgress( oProgress, Time_Progress, Wsego )              // Отображение графического Progress-bar

       DC_AppEvent( @lOk, 0, .01 )

       T1tp = T2tp
    ENDIF

RETURN lOk

Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Ich habe einen tragbaren Server heruntergeladen und installiert PostgreSQL 12. In der Dokumentation steht, dass der Server die Sprachen Perl 5.26, Python 3.7, Tcl 8.6 unterstützt. Was ist mit Alaska?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Tom »

Hallo, Eugine.

Man kann Perl, Python und noch ein paar andere Sprachen verwenden, um Stored Procedures für den PostGreS zu schreiben, also Funktionen oder Prozeduren, die im Server ausgeführt werden. Das geht mit Xbase++ nicht. Es hat nichts damit zu tun, in welcher Sprache eine Software geschrieben sein darf, die mit dem PostGreS arbeitet. Das kann fast jede Sprache sein, die eine TCP/IP-Verbindung herstellen kann.
Herzlich,
Tom
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Hallo, Tom!

In Alaska gibt es überhaupt keine Probleme, eine solche Verbindung herzustellen
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Tom »

Nein, keine Probleme. Es geht im sogar einfacher als via ODBC oder ähnliches. Man braucht nur eine DacSession je Thread - oder man verwendet ein Session-Objekt via <SessionObject>:SetDefault in allen Threads. Das ist alles. Im ISAM-Modus sollte man außerdem die PGDBE als Standard-DBE setzen.
Herzlich,
Tom
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Tom hat geschrieben: Mi, 05. Jan 2022 12:12 Nein, keine Probleme. Es geht im sogar einfacher als via ODBC oder ähnliches. Man braucht nur eine DacSession je Thread - oder man verwendet ein Session-Objekt via <SessionObject>:SetDefault in allen Threads. Das ist alles. Im ISAM-Modus sollte man außerdem die PGDBE als Standard-DBE setzen.
Gibt es eine Dokumentation oder Tutorials mit Beispielen dafür, wie dies in Alaska möglich ist? Ich würde es lesen, es versuchen... Gibt es eine Dokumentation oder Tutorials mit Beispielen dafür, wie dies in Alaska möglich ist? Ich würde es lesen, es versuchen... Überhaupt stellt sich die Frage, wie es in Alaska einfacher und bequemer ist, die Beschränkung des dfb auf die Datenbankgröße von 2 GB und die Anzahl der darin enthaltenen Felder auf 2048.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Tom »

Die Online-Hilfe erklärt, wie man das Beispiel "MDIDEMO" nach PostGres/ISAM migriert.
Herzlich,
Tom
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Hallo, Tom!

Genau das, was Sie sagen, habe ich nicht gefunden. Kann mir sagen, wo es in der Auskunft darüber gibt. Aber während der Suche habe ich viel gefunden, und Dokumentation (auch in russischer Sprache) und viele Bücher. Sie können mir raten, was Sie zuerst lesen sollen?

Auskunft:
http://127.0.0.1:12417/help/help/index.html?ver=42400

Dokumentation in russischer Sprache:
https://postgrespro.ru/docs/postgresql

Die Bücher:
https://www.postgresql.org/docs/books/

Russische Version des Servers:
https://postgrespro.ru/products/postgrespro
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Tom hat geschrieben: Mi, 05. Jan 2022 16:25 Die Online-Hilfe erklärt, wie man das Beispiel "MDIDEMO" nach PostGres/ISAM migriert.
Ist das hier irgendwo? http://127.0.0.1:12417/help/help/index.html?ver=42400
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Werner_Bayern »

Hallo Eugeny
test.PNG
test.PNG (98.38 KiB) 3388 mal betrachtet
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Eugeny Lutsenko »

Werner_Bayern! Vielen Dank! Jetzt kann ich damit umgehen
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Gibt es ein portables (nicht installierbares) lokales PostgreSQL mit einer ISAM-Schnittstelle?

Beitrag von Werner_Bayern »

=D>
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten