Existiert dbf im ADS?

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Existiert dbf im ADS?

Beitrag von Jan »

Moin,

früher konnte ich vor dem Öffnen per IF File() checken, ob die dbf existierte. Heute liegen die dbf im ADS, und auf den dazugehörigen Server hat der normale User keinen Zugriff. Damit fällt die alte Abfrage flach. Gibt es irgend eine Möglichkeit festzustellen, ob eine bestimmte Datei im ADS-Repository aufgeführt ist?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
sammler0002
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Mi, 23. Dez 2015 22:46
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Existiert dbf im ADS?

Beitrag von sammler0002 »

Moin,

einfach mal schnell rauskopiert wie wir es machen:

Code: Alles auswählen


FUNCTION ads_fexist(cDBF)
   local xOldSel ,bSaveError
   local lRet := .T.
   local l1

   bSaveError := ErrorBlock( {|oError| dummy_err_hnd(oError) } )
   xOldSel := select()

   *Datei testweise öffnen  RO Shared
   DbUseArea(.T.,,cDBF,,.T.,.T.)

   *getLastError, relevante Codes
   *0   : ok
   *7013: File AccessError ( z.B. fehlende Rechte), Datei aber vorhanden
   *7014: kein DBF-File, Datei vorhanden
   *7041: Datei nicht vorhanden
   *7061: beim testen einer NTX, Datei vorhanden, warum auch immer kommt
   *      diese Nummer statt 7014

   l1 := oSession:getLastError()
     //? "oSessionErrC", l1
     //cErrorMsg  := oSession:getLastMessage()
     //? "oSessionErrM", cErrorMsg

   do case
    case l1 == 0
      DbCloseArea()
    case l1 == 7041
      lRet := .F.
    end case

   *Errorhandler zurück
   ErrorBlock(bSaveError)
   select(xOldSel)

   RETURN lRet
   
Grüße von Philipp
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Existiert dbf im ADS?

Beitrag von Jan »

Moin Philipp,

das ist natürlich brachial mit Brechstange. Ich hatte gehofft es gibt irgendwas eleganteres, z. B. auf SQL-Basis.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Existiert dbf im ADS?

Beitrag von nightcrawler »

Hallo Jan,
leider auch nichts besseres. Auch ein SELECT würde versuchen, die Tabelle zu öffnen. Damit wird das Filesystem enorm belasted und die Gesamt-Performance geht in die Knie.
Deshalb gab es ja mit Version 6 (kurz nach dem Jahrtausendwechsel) die Erweiterung der Data Dictionaries. Eine Zusammenfassung der Einzel-Dateien zu einer übergreifenden Datenbank ;)
Was möglich wäre (und etwas ähnliches habe ich schonmal mit Delphi gemacht): Du schreibst eine Extended Stored Procedure (in eine native Windows-DLL), welche die FileExist-Abfrage direkt auf dem Server macht, ohne die Datei dabei zu öffnen. Das könnte schneller gehen, als über eine ADS-OpenTable Abfrage.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
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: Existiert dbf im ADS?

Beitrag von Tom »

Aber das ist doch keine Brechstange, das mit dem ErrorBlock von Philipp - sondern eine recht elegante Lösung. Auch hier geht es um die negative Antwort auf einen File-Request. Man darf sich nicht dadurch irritieren lassen, dass vermeintlich eine Fehlersituation behandelt wird.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Existiert dbf im ADS?

Beitrag von Jan »

Hallo Tom,

ja klar geht das. Und auch sicher. Was ich damit meinte ist: Ich provoziere einen Laufzeitfehler, den ich dann aber natürlich geordnet abfange und auswerte. Gegenüber irgendwas in SQL wie isTable (jetzt unwissend und naiv dahin geschrieben) wäre da halt wesentlich eleganter. Daher der Vergleich mit der brachialen Brechstange.

Ich seh aber gerade: In einem anderen, älteren Modul benutze ich ein Abfrage "Select name from system.tables order by name". Das gibt mir irgend sowas wie ein Array zurück, das ich dann auslesen kann. Oder ich könnte schauen ob man das so umbauen kann das ich nicht komplett alle dbf aus dem ADS zurückbekomme, sondern nur Datei eine spezielle. Dann wäre die Rückgabe natürlich leer. Ich werd da mal etwas mit spielen und dann das Ergebnis hier posten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Existiert dbf im ADS?

Beitrag von Tom »

Häng Dich nicht am Begriff "Fehler" auf, Jan. Letztlich geht es darum, dass ein Request - ob nun auf Betriebssystem- oder auf Serverebene, scheißegal - eine negative Antwort liefert. Diese negative Antwort ruft das Fehlersystem - ordentlich funktionierende Module der Software! - auf, und Du bringst das Fehlersystem dazu, in Deinem Sinne zu reagieren. Du provozierst nichts Falsches; so wird unter der Haube andauernd gearbeitet. Schau Dir mal die Logs an, die ein Tool wie ProcMon liefert, während Deine Anwendung irgendwas lokal mit Daten macht. Da werden pausenlos "Fehlerzustände" erzeugt und behandelt. Es ist kein Fehler, proaktiv darauf zu reagieren, wenn eine Tabelle sich aufgrund ihres Fehlens nicht öffnen lässt. Ein Fehler wäre, derlei zu tun, obwohl es bei korrekt installierter und betriebener Software nicht so sein sollte, dass Tabellen nicht vorhanden sind, die man braucht.

Problematisch ist das nur, wenn jetzt ein Fehler innerhalb dieser kurzen Codestrecke auftritt.
Herzlich,
Tom
Antworten