Scripte

PHP Script: flatbox-0.3_beta.lib.php

Nach obenNach unten

Zurück zur Übersicht - Datei downloaden

  1. <?php
  2.  
  3. ######################################################################
  4. #/------------------------------------------------------------------\#
  5. #|            ____               _____   __    __                   |#
  6. #|            |__   |      /\      |    |  |  |  |  \ /             |#
  7. #|            |     |     /--\     |    |-{   |  |   X              |#
  8. #|            |     |__  /    \    |    |__|  |__|  / \             |#
  9. #|                                                                  |#
  10. #\------------------------------------------------------------------/#
  11. ######################################################################
  12.  
  13.  
  14. ### FlatBox - Verwalten von Datensätzen in FlatFiles (Textdateien) ###
  15.  
  16. ### Autoren:                                                       ###
  17. ### ===============                                                ###
  18. ### Thomas Schmieder  <tschmider@bitworks.de>                      ###
  19. ### Dennis Riehle     <selfhtml@riehle-web.com>                    ###
  20.  
  21. ### Stand:    03.09.2005 20:53:13                                  ###
  22. ### Version:  0.3                                                  ###
  23. ### Stable?   Beta                                                 ###
  24.  
  25.  
  26. ######################################################################
  27. #/------------------------------------------------------------------\#
  28. #|                              Lizenz                              |#
  29. #\------------------------------------------------------------------/#
  30. ######################################################################
  31.  
  32. /*
  33. */
  34.  
  35.  
  36. ######################################################################
  37. #/------------------------------------------------------------------\#
  38. #|                            Changelog                             |#
  39. #\------------------------------------------------------------------/#
  40. ######################################################################
  41.  
  42. /*
  43. - Funktion flat_rec_filter eingeführt, mit der sich aus der Rückgabe von
  44.   flat_rec_select bequem ein einzelner Datensatz oder ein Datensatzbereich
  45.   herrausfiltern lässt.
  46. - Mal an die Funktion flat_file_alter herangemacht, es ist jetzt möglich,
  47.   über alle Datensätze in einem Flatfile hinweg ein Feld zu löschen oder
  48.   ein Feld mit einem Default Wert anzulegen, optional dabei auch bereits
  49.   existierende zu überschreiben
  50. - Fehler in flat_rec_select korrigiert - da gabs bis jetzt immer noch eine
  51.   Fehlermeldung, wenn man einen File öffnen wollte, der _leer_ war, also
  52.   keine leeren Arrays drin, sondern eine Datei mit der Länge 0, fread be-
  53.   schwert sich nämlich, wenn es als Filesize 0 übergeben bekommt
  54. - flat_rec_insert, da gabs ne Notice Meldung wegen einem nicht angelegten
  55.   Array Index, außerdem musste auch hier noch wie bei flat_rec_select eine
  56.   Kontrolle eingebaut werden, ob der File leer ist
  57. - Errorcode 9 eingeführt: In die Datei können keine Datensätze eingetragen
  58.   werden, weil der Filetype nicht flatfile ist.
  59.   Gedenke ich für die Archivierung zu nutzen - wird meta['filetype'] auf
  60.   etwas anders als flatfile gesetzt, ist ein Eintragen mit flat_rec_insert
  61.   nicht mehr möglich, ein Archiv-File wäre somit geschützt, habe flat_rec_
  62.   insert und flat_file_create diesbezüglich angepasst.
  63.   Ist meta['filetype'] nicht vorhanden, so ist das auch OK, aus Gründen der
  64.   Abwärtskompilität
  65. - gleiches Problem wie bei flat_rec_select und bei flat_rec_insert existierte
  66.   auch noch bei flat_rec_update und flat_rec_delete - ist jetzt gefixed
  67. - flat_rec_search geschrieben, die Funktion kann bis jetzt wahlweise in
  68.   den Schlüsseln oder in den Werten der Datensätze suchen und das wahlweise
  69.   mit einem einfachen Vergleich oder mit einem regulären Ausdruck. Alle
  70.   Datensätze in denen nichts gefunden wurde, werden entfernt
  71. - bei flat_rec_update wäre es bis jetzt noch möglich gewesen, [created] zu
  72.   überschreiben, ist aber nicht sinnvoll, geht jetzt nicht mehr
  73. - flat_rec_update hat bis jetzt Datensatze die noch nicht im Flatfile waren
  74.   neu eingefügt, abgesehen davon, dass da noch einiges nicht so ganz korrekt
  75.   war, ist das doch auch Schwachsinn - dazu soll der Programmierer doch bitte
  76.   flat_rec_insert benutzen, wir sind doch nicht dazu verpflichtet, den "Arsch
  77.   des faulen Programmierers zu retten" ;-)
  78. - bei flat_rec_get_listdata, flat_rec_make_list und flat_rec_make_detail den
  79.   ersten Parameter Filepath durch $_recdata ersetzt - das bläht den Quellcode
  80.   nur unnötig auf, wenn jede Funktion selber wieder noch andere Funktionen
  81.   aufruft. Da ist es doch besser, wenn man einfach sich von flat_rec_select
  82.   $_recdata geben lässt und dass dann selber weiterreicht, so ersparen wir
  83.   uns auch das Durchschleifen von $_userdata und $_rights
  84. - in flat_rec_make_detail kleinen Bug gefixet - da wurde auf eine nicht
  85.   existierende Variable zugegriffen, kleiner Schreibfehler
  86. - in flat_rec_make_detail war eine sinnlose foreach, dass ließ sich alles
  87.   viel einacher lösen, weil man ja $dataID zur Verfügung hat - jetzt kann
  88.   problemlos das komplette $_recdata übergeben werden.
  89. - Für unsere drei Konstanten fürs Error Reporting habe ich jetzt noch eine
  90.   Abfrage eingebaut, sodass diese nur dann definiert werden, sofern sie
  91.   nicht schon definiert sind. Das hat den Vorteil, dass der Anweder die
  92.   Konstanten  selber in seinem Script schon vor dem Includen der FlatBox
  93.   setzten kann
  94. - Das BIOS (alle 4 Hauptfunktionen) mal durchgegangen und teilweise noch
  95.   etwas  bereinigt, vereinfacht, Struktur optimiert, vereinheitlicht und
  96.   weiter kommentiert
  97. - Die Beschreibungen der Funktionen unter dem Changelog hier aufs Nötigste
  98.   reduziert und einen Hinweis auf die Doku hinzugefügt
  99. - bei flat_rec_get_listdata hätte es noch ein kleines Problem gegeben, wenn
  100.   last bzw. nextID 0 gewesen wäre (sollte zwar nicht vorkommen) - ließ
  101.   sich durch eine Typenprüfung lösen
  102. - von flat_rec_get_listdata nach flat_rec_make_list werden die Informationen
  103.   nextID, lastID und starID jetzt auch über meta in $_showdata weitergegeben
  104. - in flat_rec_make_list und flat_rec_make_detail werden HTML Elementen
  105.   (CSS) Klassen vergeben - da wir eigentlich überall engliche Begriffe
  106.   verwenden, hab ich die Klassennamen mal auf entry und detailentry geändert
  107. */
  108.  
  109.  
  110. ######################################################################
  111. #/------------------------------------------------------------------\#
  112. #|     Definition der benötigten Funktionen mit Erklärung           |#
  113. #\------------------------------------------------------------------/#
  114. ######################################################################
  115.  
  116. /*
  117. Hinweis: Eine ausführliche Beschreibung der Funktionen, sowie eine
  118.          Auflistung derer Parameter finden Sie in der Dokumentation zur
  119.          FlatBox.
  120. Dauerfunktionen:
  121. ================
  122. - get_error_description               => Ist für die Ausgabe von Fehlermeldungen
  123.                                          verantwortlicht.
  124. - get_microtime                       => Besorgt einen Timestamp der aktuellen
  125.                                          Uhrzeit in Millisekunden
  126. - get_time_s                          => Liefert einen Spezial Timestamp in
  127.                                          Millisekunden zurück
  128. - strip                               => Rekursive Entfernung der
  129.                                          Maskierungs-Backslashes, sofern
  130.                                          magic_quotes aktiviert sind
  131. - flat_open_lock                      => Öffnet und sperrt Dateien, existiert
  132.                                          die Datei nicht, wird sie angelegt
  133. Einmalige Funktionen:
  134. =====================
  135. - flat_file_create                    => Legt einen FlatFile an und füllt ihn
  136.                                          mit den Meta Daten
  137. - flat_file_alter                     => Ändert die Dateien, wenn z.B. ein
  138.                                          Feld dazukommt
  139. Grundfunktionen (BIOS):
  140. =======================
  141. - flat_rec_insert                     => Schreibt einen neuen Datensatz in
  142.                                          eine Datei, bzw. legt eine Datei davor
  143.                                          auch an
  144. - flat_rec_select                     => holt eine Liste aller Datensätze
  145.                                          aus einem File
  146. - flat_rec_update                     => Aktualisiert Datensätze in einer Datei
  147.                                          nach lastupdate Vergleich
  148. - flat_rec_delete                     => Löscht Datensätze in einer Datei
  149. Anzeigefunktionen:
  150. ==================
  151. - flat_rec_get_listdata               => Besorgt alle notwendigen Daten für
  152.                                          die HTML Ausgabe mit Blätterfunktion
  153. - flat_rec_make_list                  => Erzeugt die HTML Ausgabe für die
  154.                                          Anzeige mit Blätterfunktion
  155. - flat_rec_make_detail                => Erzeugt die HTML Ausgabe für
  156.                                          einen angeforderten Datenksatz
  157. - flat_rec_search                     => Sucht im übergebenen Array der Datensätze
  158.                                          nach bestimmtem Text, auch reguläre
  159.                                          Ausdrücke können angewandt werden
  160. - flat_rec_filter                     => Filtert Datensätze anhand ihrer ID
  161.                                          aus den Informationen von flat_rec_select
  162.                                          herraus
  163. Backup- und Archivierungsfunktionen:
  164. ====================================
  165. - flat_rec_copy                       => Kopiert eine bestimmte Menge an
  166.                                          Datensätzen, wird zur Archivierung genutzt
  167.                                          -- nocht nicht geschrieben! --
  168. - flat_file_backup                    => Erstellt ein Backup von FlatFiles,
  169.                                          zusätzlich kann ein Komprimierungsgrad
  170.                                          angegeben werden.
  171. */
  172.  
  173.  
  174. #--------------------------------------------------------------------
  175. # includes und Konstanten
  176. #--------------------------------------------------------------------
  177.  
  178. //Konstante für die maximale Größe eines Flatfiles
  179. define ('FLAT_MAXFILESIZE', 1000000);
  180.  
  181. //Drei Konstanten für das Error Reporting
  182. //nur dann definieren, sofern diese nicht schon vorher durch den
  183. //Anwender definiert wurden
  184. if(!defined('PRINT_NOTICES'))
  185. {
  186.   define('PRINT_NOTICES', true);
  187. }
  188. if(!defined('PRINT_WARNINGS'))
  189. {
  190.   define('PRINT_WARNINGS', true);
  191. }
  192. if(!defined('PRINT_FAILES'))
  193. {
  194.   define('PRINT_FAILES', true);
  195. }
  196.  
  197.  
  198. #--------------------------------------------------------------------
  199. # Dauerfunktionen
  200. #--------------------------------------------------------------------
  201. function get_error_description($errnr, $returndescr = false)
  202. {
  203.   //Notiz-Meldungen, 0 und 100+
  204.   $_notices = array(
  205.          0 => "No errors, function was successfully carried out."
  206.     );
  207.   //Warn-Meldungen, 1 bis 49
  208.   $_warnings = array(
  209.          2 => "Low-Level Error: Flat Box wasn't able to find the selected file.",
  210.          3 => "Low-Level Error: Selected file already exists.",
  211.          4 => "Low-Level Error: There are no data records, selected file is empty.",
  212.          5 => "Low-Level Error: Authorisation Error on low-level section.",
  213.          8 => "Low-Level Error: Flat Box wasn't able to write in the file.",
  214.          9 => "Low-Level Error: Inserting into this file is not possible becaus filetype is not flatfile.",
  215.         10 => "Low-Level Error: Maximum allowable filesize is transgressed.",
  216.         11 => "Data Error: File format doesn't match.",
  217.         12 => "Data Error: Still erroneous data records in ['denied'].",
  218.         13 => "Data Error: There are still some data records that couldn't be worked up.",
  219.         14 => "Data Error: There are no data records, but the file format is OK."
  220.     );
  221.   //Fehler-Meldungen in der Userverwaltung, 50 bis 99
  222.   $_failes = array(
  223.         50 => "Authorisation Error, no further information avaliable."
  224.     );
  225.  
  226.   //Wenn keine Error Nummer übergeben wurde, abbrechen
  227.   if(!is_numeric($errnr)) return false;
  228.   //Prüfen, ob es sich um eine existierende Notice-Meldung handelt
  229.   elseif($errnr == 0 OR $errnr >= 100 AND isset($_notices[$errnr]))
  230.   {
  231.     $message = $_notices[$errnr];
  232.     //Wenn entsprechend definiert, Meldung ausgeben
  233.     if(defined('PRINT_NOTICES') AND PRINT_NOTICES)
  234.     {
  235.       echo "<b>Notice:</b> " . $message . "<br /><br />\n";
  236.     }
  237.   }
  238.   //Prüfen, ob es sich um eine existierende Warning-Meldung handelt
  239.   elseif($errnr >= 1 AND $errnr <= 49 AND isset($_warnings[$errnr]))
  240.   {
  241.     $message = $_warnings[$errnr];
  242.     //Wenn entsprechend definiert, Meldung ausgeben
  243.     if(defined('PRINT_WARNINGS') AND PRINT_WARNINGS)
  244.     {
  245.       echo "<b>Warning:</b> " . $message . "<br /><br />\n";
  246.     }
  247.   }
  248.   //Prüfen, ob es sich um eine existierende Fehler-Meldung handelt
  249.   elseif($errnr >= 50 AND $errnr <= 99 AND isset($_failes[$errnr]))
  250.   {
  251.     $message = $_failes[$errnr];
  252.     //Wenn entsprechend definiert, Meldung ausgeben
  253.     if(defined('PRINT_WARNINGS') AND PRINT_WARNINGS)
  254.     {
  255.       echo "<b>Warning:</b> " . $message . "<br /><br />\n";
  256.     }
  257.   }
  258.   //Ansonsten ist der Errorcode unbekannt
  259.   else
  260.   {
  261.     $message = "An unknown error occured, please refer to Thomas Schmieder or "
  262.              . "Dennis Riehle to get more information about error " . $errnr;
  263.     echo "<b>Fatal Error:</b> " . $message . "<br /><br />\n";
  264.   }
  265.   if($returndescr)
  266.   {
  267.     return $message;
  268.   }
  269.   else
  270.   {
  271.     return $errnr;
  272.   }
  273. }
  274.  
  275. #--------------------------------------------------------------------
  276. function get_microtime()
  277. {
  278.   //Wir eine PHP Version kleiner 5 verwendet?
  279.   if(version_compare(phpversion(), "5", "<"))
  280.   {
  281.     //Dann müssen wir uns die Zahl selber zusammenstellen
  282.     list($usec, $sec) = explode(" ",microtime());
  283.     $microtime = (float)$usec + (float)$sec;
  284.   }
  285.   else
  286.   {
  287.     //PHP5 kennt einen opt. Parameter für microtime(),
  288.     //der das bereits alles erledigt
  289.     $microtime = microtime(true);
  290.   }
  291.   return $microtime;
  292. }
  293.  
  294. #--------------------------------------------------------------------
  295. function get_time_s()
  296. {
  297.   list($usec, $sec) = explode(" ",microtime());
  298.   $time_s = date("YmdHis").substr($usec,1,7);
  299.  
  300.   return $time_s;
  301. }
  302.  
  303. #--------------------------------------------------------------------
  304. function strip($data)       
  305. {
  306.   if (!get_magic_quotes_gpc())
  307.   {
  308.     return $data;
  309.   }
  310.  
  311.   if (is_array($data))
  312.   {
  313.     foreach($data as $key => $val)
  314.     {
  315.       $data[$key] = strip($val);
  316.     }
  317.   }
  318.   else
  319.   {
  320.     $data = stripslashes($data);
  321.   } 
  322.  
  323.   return $data;
  324. }
  325.  
  326.  
  327. #--------------------------------------------------------------------
  328. function flat_open_lock($filepath, $lockmode)
  329. { 
  330.   # Lockdatei öffnen oder anlegen
  331.   for ($x=0;$x<5;$x++)
  332.   {
  333.     if($lh = @fopen($filepath,"a+")) break;
  334.     usleep(8000)## 8ms warten bis zum nächsten Versuch
  335.   }
  336.  
  337.   if (!$lh) return false
  338.  
  339.   # Lockversuch
  340.   for ($x=0;$x<5;$x++)
  341.   {
  342.     if (@flock($lh,$lockmode + LOCK_NB)) return $lh;
  343.     usleep(8000)## 8ms warten bis zum nächsten Versuch
  344.   }
  345.  
  346.   fclose($lh);
  347.   return false;
  348. }
  349.  
  350.  
  351. #--------------------------------------------------------------------
  352. # Einmalige Funktionen
  353. #--------------------------------------------------------------------
  354. function flat_file_create($filepath)     
  355. {
  356.  clearstatcache();                     ## Statusbuffer rücksetzen
  357.  
  358.  if(file_exists($filepath)) return get_error_description(3)## Datei existiert schon
  359.  
  360.  $fp = flat_open_lock($filepath,LOCK_EX);
  361.  
  362.  if($fp)
  363.  {                                     ## wenn File > 0 war es schon da
  364.    if (filesize($filepath) > 0)        ## man muss das hier nochmal bzw
  365.                                        ## eigentlich erst hier testen,
  366.    {                                   ## weil zwischen Handle-Beschaffung
  367.                                        ## und Lock Zeit vergeht
  368.      fclose($fp);
  369.      return get_error_description(3)## Datei existiert schon
  370.    }
  371.    $time_s = get_time_s();
  372.    $time_u = time();
  373.    
  374.    $_file         = array();
  375.    $_file['meta'] = array();
  376.    $_file['data'] = array();
  377.    
  378.    $_file['meta']['created']    = $time_u;      ## erstellt am
  379.    $_file['meta']['lastupdate'] = $time_s;      ## letztes Write   
  380.    $_file['meta']['lastid']     = 0;
  381.    $_file['meta']['amount']     = 0;
  382.    $_file['meta']['filetype']   = "flatfile";
  383.    
  384.    $_file_packed = serialize($_file);
  385.    fseek($fp,0);
  386.    fwrite($fp,$_file_packed,strlen($_file_packed));
  387.    fclose($fp);
  388.    
  389.    return get_error_description(0);    ##Code für kein Fehler
  390.  }
  391.  else return get_error_description(5); ##Code für Datei nicht geöffnet
  392. }
  393.  
  394. #--------------------------------------------------------------------
  395. function flat_file_alter($filepath, $action, $fieldname, $value = "", $overwrite = false)
  396. {
  397.   //status-Buffer rücksetzen
  398.   clearstatcache();
  399.  
  400.   //Datei öffnen und locken, bei Fehler abrechen
  401.   $fp = flat_open_lock($filepath,LOCK_EX)
  402.  
  403.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  404.  
  405.   //Zeitstempel erzeugen und merken
  406.   $time_s = get_time_s();
  407.   $time_u = time();
  408.  
  409.   //Dateigröße feststellen
  410.   $filesize = filesize($filepath);
  411.   //maximale Dateigröße prüfen
  412.   if($filesize > FLAT_MAXFILESIZE + 5000)
  413.   {
  414.     fclose($fp);
  415.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  416.   }
  417.   //ist in der Datei überhaupt etwas drin?
  418.   elseif($filesize == 0)
  419.   {
  420.     fclose($fp);
  421.     return get_error_description(4);   ## File ist leer
  422.   }
  423.  
  424.   //Datei entpacken
  425.   fseek($fp,0,SEEK_SET);
  426.   $_file_packed = fread($fp,$filesize);
  427.   $_file = unserialize($_file_packed);
  428.  
  429.   //abbrechen, falls $_file leer ist
  430.   if(empty($_file))
  431.   {
  432.     return get_error_description(4);
  433.   }
  434.   //Dateiformat prüfen
  435.   elseif(!isset($_file['meta']['created']) or
  436.         !isset($_file['meta']['lastupdate']) or
  437.         !isset($_file['meta']['lastid']) or
  438.         !isset($_file['meta']['amount']) or
  439.         !is_array($_file['data']))
  440.   {
  441.     return get_error_description(11);      ## Dateiformat passt nicht
  442.   }
  443.   //Alle Datensätze bearbeiten
  444.   foreach($_file['data'] as $key => $_record)
  445.   {
  446.     if($action == "remove" and isset($_record[$fieldname]))
  447.     {
  448.       unset($_file['data'][$key][$fieldname]);
  449.       $_file['data'][$key]['lastupdate'] = $time_s;
  450.     }
  451.     elseif($action == "add")
  452.     {
  453.       if(!isset($_record[$fieldname]) or $overwrite)
  454.       {
  455.         $_file['data'][$key][$fieldname] = $value;
  456.         $_file['data'][$key]['lastupdate'] = $time_s;
  457.       }
  458.     }
  459.   }
  460.  
  461.   //letzte Veränderung eintragen
  462.   $_file['meta']['lastupdate'] = $time_s;
  463.  
  464.   //Datei verpacken
  465.   $_file_packed = serialize($_file);
  466.      
  467.   //und abspeichern
  468.   fseek($fp,0);
  469.   ftruncate($fp,0);
  470.   $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  471.  
  472.   @fclose($fp);
  473.      
  474.   //Rückgabewert der Funktion
  475.   if (!$writeok) return get_error_description(8); # Fehler beim Schreiben;
  476.  
  477.   return get_error_description(0);       ## Kein Fehler aufgetreten
  478. }
  479.  
  480.  
  481. #--------------------------------------------------------------------
  482. # Grundfunktionen (BIOS)
  483. #--------------------------------------------------------------------
  484. function flat_rec_insert($filepath, &$_recdata)
  485. {
  486.   //status-Buffer rücksetzen
  487.   clearstatcache();
  488.  
  489.   //Datei öffnen und locken, bei Fehler abrechen
  490.   $fp = flat_open_lock($filepath,LOCK_EX);
  491.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  492.  
  493.   // maximale Dateigröße prüfen
  494.   $filesize = filesize($filepath);
  495.   if ($filesize > FLAT_MAXFILESIZE)
  496.   {
  497.     fclose($fp);
  498.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  499.   }
  500.  
  501.   //Wenn Daten vorhanden, diese entpacken
  502.   if($filesize > 0)
  503.   {
  504.     fseek($fp,0,SEEK_SET);
  505.     $_file_packed = fread($fp,$filesize);
  506.     $_file = unserialize($_file_packed);
  507.   }
  508.   else
  509.   {
  510.     $_file = array();
  511.   }
  512.  
  513.   //Zeitstempel erzeugen und merken
  514.   $time_s = get_time_s();
  515.   $time_u = time();
  516.  
  517.   //$_file anlegen, falls nicht vorhanden
  518.   if(empty($_file))
  519.   {
  520.     $_file = array();
  521.     $_file['meta'] = array();
  522.     $_file['data'] = array();
  523.  
  524.     $_file['meta']['created'] = $time_u;
  525.     $_file['meta']['lastupdate'] = $time_s;       
  526.     $_file['meta']['lastid'] = 0;
  527.     $_file['meta']['amount'] = 0;
  528.     $_file['meta']['filetype'] = "flatfile";
  529.   }
  530.   else
  531.   {
  532.     //Dateiformat überprüfen
  533.     if (!isset($_file['meta']['created']) or
  534.         !isset($_file['meta']['lastupdate']) or
  535.         !isset($_file['meta']['lastid']) or
  536.         !isset($_file['meta']['amount']) or
  537.         !is_array($_file['data']))
  538.     {
  539.       fclose($fp);
  540.       return get_error_description(11)## Dateiformat passt nicht
  541.     }
  542.  
  543.     if (isset($_file['meta']['filetype']) AND     ## isset, wegen Abwärtskompatiblität
  544.         $_file['meta']['filetype'] != "flatfile")
  545.     {
  546.       return get_error_description(9);   ## Ist kein Flatfile, möglicherweise ein
  547.                                          ## Archiv File
  548.     }
  549.     elseif (!isset($_file['meta']['filetype']))   ## existierte keine Angabe flatfile
  550.     {
  551.       $_file['meta']['filetype'] = "flatfile";    ## so wird diese angelegt
  552.     }
  553.    
  554.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  555.     {
  556.       fclose($fp);                       ## noch fehlerhafte Datensätze im Array
  557.       return get_error_description(12)## oder noch Ergebnisdaten vorhanden
  558.     }
  559.   }
  560.  
  561.   $_recdata['meta']                 = array(); ## es könnten ja noch leere Strings sein
  562.   $_recdata['meta']['rec_inserted'] = 0;       ## Anzahl der fehlerfrei updated Records
  563.   $_recdata['meta']['rec_denied']   = 0;       ## Anzahl der abgelehnten Records
  564.   $_recdata['denied']               = array(); ## Array f. abgelehnte Datensätze anlegen
  565.   $_recdata['rec_inserted']         = array(); ## Array f. eingefügte Datensätze anlegen
  566.  
  567.   foreach($_recdata['data'] as $key => $_record)
  568.   {
  569.     if(!empty($_record))
  570.     {
  571.       $_recdata['meta']['rec_inserted'] ++; ## fehlerfrei eingefügten DS zählen
  572.       $_file['meta']['lastid'] ++;
  573.       $_file['meta']['amount'] ++;
  574.    
  575.       $new_key = $_file['meta']['lastid'];
  576.    
  577.       $_file['data'][$new_key] = $_record;   ## Daten übertragen
  578.       $_file['data'][$new_key]['lastupdate'] = $time_s; ## Aktualisierungsdatum eintragen
  579.       $_file['data'][$new_key]['created']    = $time_u## Erstelldatum eintragen
  580.       unset($_recdata['data'][$key]);        ## Record aus Auftragsliste löschen
  581.    
  582.       $_recdata['rec_inserted'][$key]['new_id'] = $new_key; ## Erteilter Schlüssel
  583.     }
  584.     else
  585.     {
  586.       $_recdata['denied'][$key] = $_record## abgelehnter Datensatz
  587.       $_recdata['meta']['rec_denied'] ++;    ## "abgelehnt" zählen
  588.     }
  589.   }
  590.  
  591.   // wenn Datensätze eingefügt wurden
  592.   if ($_recdata['meta']['rec_inserted'] > 0)
  593.   {
  594.     // letzte Veränderung eintragen
  595.     $_file['meta']['lastupdate'] = $time_s;
  596.  
  597.     //Datei verpacken
  598.     $_file_packed = serialize($_file);
  599.        
  600.     //und abspeichern
  601.     fseek($fp,0);
  602.     ftruncate($fp,0);
  603.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  604.   }   
  605.  
  606.   @fclose($fp);
  607.  
  608.   //Rückgabewert der Funktion
  609.   if (!$writeok)
  610.   {
  611.     return get_error_description(8);     # Fehler beim Schreiben der Daten;
  612.   } 
  613.  
  614.   if (count($_recdata['denied'])==0)
  615.   {
  616.     return get_error_description(0);     # kein Fehler aufgetreten, alle Sätze verarbeitet.
  617.   }
  618.   else
  619.   {
  620.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  621.   }
  622. }
  623.  
  624. #--------------------------------------------------------------------
  625. function flat_rec_select($filepath, &$_recdata, $_userdata = false, $_rights = false)
  626. {
  627.   //status-Buffer rücksetzen
  628.   clearstatcache();
  629.  
  630.   //Datei öffnen und locken, bei Fehler abrechen
  631.   $fp = flat_open_lock($filepath,LOCK_SH)
  632.  
  633.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  634.  
  635.   //Dateigröße feststellen
  636.   $filesize = filesize($filepath);
  637.   //maximale Dateigröße prüfen
  638.   if($filesize > FLAT_MAXFILESIZE + 5000)
  639.   {
  640.     fclose($fp);
  641.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  642.   }
  643.   //ist in der Datei überhaupt etwas drin?
  644.   elseif($filesize == 0)
  645.   {
  646.     fclose($fp);
  647.     return get_error_description(4);   ## File ist leer
  648.                                        ## müssen wir hier schon abbrechen, weil sonst
  649.                                        ## fread und unserialize Fehler melden
  650.   }
  651.   //Datei entpacken
  652.   else
  653.   {
  654.     fseek($fp,0,SEEK_SET);
  655.     $_file_packed = fread($fp,$filesize);
  656.     fclose($fp);       
  657.     $_file = unserialize($_file_packed);
  658.   }
  659.  
  660.   //abbrechen, falls nur ein leeres Array im File sein sollte
  661.   if(empty($_file))
  662.   {
  663.     return get_error_description(4);
  664.   }
  665.   else
  666.   {
  667.     //Dateiformat überprüfen
  668.     if (!isset($_file['meta']['created']) or
  669.         !isset($_file['meta']['lastupdate']) or
  670.         !isset($_file['meta']['lastid']) or
  671.         !isset($_file['meta']['amount']) or
  672.         !is_array($_file['data']))
  673.     {
  674.       return get_error_description(11);      ## Dateiformat passt nicht
  675.     }
  676.  
  677.      
  678.     $_recdata = array();
  679.     $_recdata['meta'] = $_file['meta'];      ## Metadaten übertragen
  680.     $_recdata['meta']['rec_denied']    = 0## Anzahl der verbotenen Records
  681.     $_recdata['meta']['rec_selected']  = 0## Anzahl der gelieferten Records
  682.  
  683.  
  684.     foreach($_file['data'] as $key => $_record)
  685.     {
  686.       if(isset($_record['rights']) and (false))          ## Einschränkende rechte vorhanden
  687.       {
  688.         $_recdata['meta']['rec_denied'] ++;              ## mangelnde Userrechte
  689.       }
  690.       else
  691.       {
  692.         $_recdata['meta']['rec_selected'] ++;            ## erlaubter Datensatz
  693.         $_recdata['data'][$key] = $_record;              ## Daten übertragen
  694.       }
  695.     }
  696.     ksort($_recdata['data']);                            ## nach IDs sortieren
  697.   }
  698.  
  699.   //Rückgabewert der Funktion
  700.   if ($_recdata['meta']['rec_denied'] == 0)              ## alle Sätze erlaubt
  701.   {
  702.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze verarbeitet.
  703.   }
  704.   else
  705.   {
  706.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  707.   }
  708. }
  709.  
  710. #--------------------------------------------------------------------
  711. function flat_rec_update($filepath, &$_recdata)
  712. {
  713.   //status-Buffer rücksetzen
  714.   clearstatcache();
  715.  
  716.   //Datei öffnen und locken, bei Fehler abrechen
  717.   $fp = flat_open_lock($filepath,LOCK_EX);
  718.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  719.  
  720.   //Dateigröße feststellen
  721.   $filesize = filesize($filepath);
  722.   //maximale Dateigröße prüfen
  723.   if($filesize > FLAT_MAXFILESIZE + 5000)
  724.   {
  725.     fclose($fp);
  726.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  727.   }
  728.   //ist in der Datei überhaupt etwas drin?
  729.   elseif($filesize == 0)
  730.   {
  731.     fclose($fp);
  732.     return get_error_description(4);   ## File ist leer
  733.   }
  734.   //Daten entpacken
  735.   else
  736.   {
  737.     fseek($fp,0,SEEK_SET);
  738.     $_file_packed = fread($fp,$filesize);
  739.     $_file = unserialize($_file_packed);
  740.   }
  741.  
  742.   //Zeitstempel erzeugen und merken
  743.   $time_s = get_time_s();
  744.   $time_u = time();
  745.  
  746.   //abbrechen, falls nur ein leeres Array im File sein sollte
  747.   if(empty($_file))
  748.   {
  749.     return get_error_description(4);
  750.   }
  751.   else
  752.   {
  753.     //Dateiformat überprüfen
  754.     if (!isset($_file['meta']['created']) or
  755.         !isset($_file['meta']['lastupdate']) or
  756.         !isset($_file['meta']['lastid']) or
  757.         !isset($_file['meta']['amount']) or
  758.         !is_array($_file['data']))
  759.     {
  760.       fclose($fp);
  761.       return get_error_description(11);           ## Dateiformat passt nicht
  762.     }
  763.  
  764.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  765.     {
  766.       fclose($fp);                       ## noch fehlerhafte Datensätze im Array
  767.       return get_error_description(12)## oder noch Ergebnisdaten vorhanden
  768.     }
  769.   }
  770.  
  771.   $_recdata['denied'] = array();
  772.   $_recdata['meta']['rec_updated'] = 0## Anzahl der fehlerfrei updated Records
  773.   $_recdata['meta']['rec_denied']  = 0## Anzahl der abgelehnten Records
  774.  
  775.   foreach($_recdata['data'] as $key => $_record)
  776.   {
  777.     if(isset($_file['data'][$key]))      ## Datensatz ist vorhanden
  778.     {
  779.       if ($_file['data'][$key]['lastupdate'] == $_record['lastupdate'])
  780.       {
  781.         //Ein Manipulieren von [created] soll nicht möglich sein
  782.         unset($_recdata['data']['created']);
  783.         //Datensatz einfügen
  784.         $_recdata['meta']['rec_updated'] ++;           ## fehlerfrei updated zählen
  785.         $_file['data'][$key] = $_record;               ## Daten übertragen
  786.         $_file['data'][$key]['lastupdate'] = $time_s## Aktualisierungsdatum eintragen
  787.         unset($_recdata['data'][$key]);                ## Record aus Auftragsliste löschen
  788.       }
  789.       else
  790.       {
  791.         $_recdata['denied'][$key] = $_file['data'][$key]; ## Daten aus dem File holen
  792.         $_recdata['meta']['rec_denied'] ++;               ## "abgelehnt" zählen
  793.       }
  794.     }
  795.     else  ## Datensatz aus der Auftragsliste ist nicht im File
  796.     {
  797.       $_recdata['meta']['rec_denied'] ++;    ## "abgelehnt" hochzählen
  798.       $_recdata['denied'][$key] = $_record## Datensatz in [denied] kopieren
  799.     }
  800.   }
  801.  
  802.   //wenn Datensätze verändert wurden
  803.   if ($_recdata['meta']['rec_updated'] > 0)
  804.   {
  805.     // letzte Veränderung eintragen
  806.     $_file['meta']['lastupdate'] = $time_s;
  807.  
  808.     //Datei verpacken
  809.     $_file_packed = serialize($_file);
  810.      
  811.     //und abspeichern
  812.     fseek($fp,0);
  813.     ftruncate($fp,0);
  814.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  815.   } 
  816.    
  817.   @fclose($fp);
  818.      
  819.   //Rückgabewert der Funktion
  820.   if (!$writeok) return get_error_description(8); # Fehler beim Schreiben;
  821.  
  822.   if (count($_recdata['denied']) == 0)
  823.   {
  824.     return get_error_description(0);    ## kein Fehler aufgetreten, alle Sätze verarbeitet.
  825.   }
  826.   else
  827.   {
  828.     return get_error_description(13);   ## nicht alle Sätze konnten verarbeitet werden
  829.   }
  830. }
  831.  
  832. #--------------------------------------------------------------------
  833. function flat_rec_delete($filepath, &$_recdata)
  834. {
  835.   //status-Buffer rücksetzen
  836.   clearstatcache();
  837.  
  838.   //Datei öffnen und locken, bei Fehler abrechen
  839.   $fp = flat_open_lock($filepath,LOCK_EX);
  840.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  841.  
  842.   //Dateigröße feststellen
  843.   $filesize = filesize($filepath);
  844.   //maximale Dateigröße prüfen
  845.   if($filesize > FLAT_MAXFILESIZE + 5000)
  846.   {
  847.     fclose($fp);
  848.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  849.   }
  850.   //ist in der Datei überhaupt etwas drin?
  851.   elseif($filesize == 0)
  852.   {
  853.     fclose($fp);
  854.     return get_error_description(4);   ## File ist leer
  855.   }
  856.   //Daten entpacken
  857.   else
  858.   {
  859.     fseek($fp,0,SEEK_SET);
  860.     $_file_packed = fread($fp,$filesize);
  861.     $_file = unserialize($_file_packed);
  862.   }
  863.  
  864.   //Zeitstempel erzeugen.
  865.   $time_s = get_time_s();
  866.  
  867.   //Prüfen, ob $_file Daten enthält
  868.   if(empty($_file))
  869.   {
  870.     return get_error_description(4);              ## Keine Daten vorhanden
  871.   }
  872.   else
  873.   {
  874.     //Dateiformat überprüfen
  875.     if (!isset($_file['meta']['created']) or
  876.         !isset($_file['meta']['lastupdate']) or
  877.         !isset($_file['meta']['lastid']) or
  878.         !isset($_file['meta']['amount']) or
  879.         !is_array($_file['data']))
  880.     {
  881.       fclose($fp);
  882.       return get_error_description(11);           ## Dateiformat passt nicht
  883.     }
  884.  
  885.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  886.     {
  887.       fclose($fp);
  888.       return get_error_description(12);           ## noch fehlerhafte Datensätze im Array
  889.     }                      ## oder noch falsche Ergbnisdaten
  890.    
  891.    
  892.   }
  893.  
  894.   $_recdata['meta']   = array();
  895.   $_recdata['denied'] = array();
  896.   $_recdata['meta']['rec_deleted'] = 0## Anzahl der fehlerfrei gelöschten Records
  897.   $_recdata['meta']['rec_denied']  = 0## Anzahl der abgelehnten Records
  898.  
  899.   foreach($_recdata['data'] as $key => $_record)
  900.   {
  901.     if(isset($_file['data'][$key]))      ## Datensatz ist vorhanden
  902.     {
  903.       if ($_file['data'][$key]['lastupdate'] == $_record['lastupdate'])
  904.       {
  905.         $_recdata['meta']['rec_deleted'] ++;  ## fehlerfrei updated zählen
  906.         unset($_file['data'][$key]);          ## Daten löschen
  907.         unset($_recdata['data'][$key]);       ## Record aus Auftragsliste löschen
  908.         $_file['meta']['amount']--;           ## Satzanzahl verringern
  909.       }
  910.       else
  911.       {
  912.         $_recdata['denied'][$key] = $_file['data'][$key]; ## Daten aus dem File holen
  913.         $_recdata['meta']['rec_denied'] ++;               ## "abgelehnt" zählen
  914.       }
  915.     }
  916.     else        ## Datensatz aus der Auftragsliste ist nicht im File
  917.     {
  918.       unset($_recdata['data'][$key]);       ## Record aus Auftragsliste löschen   
  919.     }
  920.   }
  921.  
  922.   // Wenn datensätze gelöscht wurden
  923.   if ($_recdata['meta']['rec_deleted'] >0)
  924.   {
  925.     // letzte Veränderung eintragen
  926.     $_file['meta']['lastupdate'] = $time_s;
  927.  
  928.     //Datei verpacken
  929.     $_file_packed = serialize($_file);
  930.      
  931.     //und abspeichern
  932.     fseek($fp,0);
  933.     ftruncate($fp,0);
  934.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  935.   }
  936.  
  937.   @fclose($fp);
  938.      
  939.   //Rückgabewert der Funktion
  940.  
  941.   if (!$writeok) return get_error_description(8);   ## Fehler beim Schreiben;
  942.  
  943.   if (count($_recdata['denied'])==0)
  944.   {
  945.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze gelöscht wurden.
  946.   }
  947.   else
  948.   {
  949.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  950.   }
  951. }
  952.  
  953.  
  954. #--------------------------------------------------------------------
  955. # Anzeigefunktionen
  956. #--------------------------------------------------------------------
  957. function flat_rec_get_listdata(&$_recdata, &$_showdata, $startID = false, $show = 5)
  958. {
  959.   //status-Buffer rücksetzen
  960.   clearstatcache();
  961.  
  962.   if(!$startID) $startID = $_recdata['meta']['lastid'];
  963.  
  964.   //Der Zähler für bereits rüberkopierte Datensätze auf 0 setzen
  965.   $count = 0;
  966.  
  967.   //Default Wert für nächste ID festlegen
  968.   $nextID = false;
  969.  
  970.   //Next ID ermitteln
  971.   for($ID = $startID; $ID >= 0; $ID--)
  972.   {
  973.     //Wenn der Datensatz vorhanden ist
  974.     if(isset($_recdata['data'][$ID]))
  975.     {
  976.       //und noch Datensätze bis zum Soll fehlen
  977.       if($count < $show)
  978.       {
  979.         //Dann kopiere diesen Datensatz rüber
  980.         $_showdata['data'][$ID] = $_recdata['data'][$ID];
  981.         $count++;
  982.       }
  983.       //und das Soll errreicht ist
  984.       else
  985.       {
  986.         //Diese ID als nächste ID festhalten
  987.         $nextID = $ID;
  988.         //Und abbrechen
  989.         break;
  990.       }
  991.     }
  992.     //Wenn der Datensatz nicht vorhanden ist,
  993.     //einfach weitermachen
  994.   }
  995.  
  996.   //Den Zähler wieder auf null setzen
  997.   $count = 0;
  998.  
  999.   //Default für lastID setzen
  1000.   $lastID = false;
  1001.  
  1002.   //LastID ermitteln:
  1003.   for($ID = $startID; $ID <= $_recdata['meta']['lastid']; $ID++)
  1004.   {
  1005.     //Wenn der Datensatz vorhanden ist
  1006.     if(isset($_recdata['data'][$ID]))
  1007.     {
  1008.       if($count < $show)
  1009.       {
  1010.         $count++;
  1011.       }
  1012.       else
  1013.       {
  1014.         $lastID = $ID;
  1015.         break;
  1016.        }
  1017.     }
  1018.     //Wenn der Datensatz nicht vorhanden ist,
  1019.     //einfach weitermachen
  1020.   }
  1021.   //Wenn die lastID noch nicht herrausgefunden wurde
  1022.   if($lastID === false AND $startID != $_recdata['meta']['lastid'])
  1023.   {
  1024.     //lastID auf die höchste ID setzen
  1025.     $lastID = $_recdata['meta']['lastid'];
  1026.   }
  1027.  
  1028.   //NextID, LastID und StartID in meta schreiben
  1029.   $_showdata['meta']['nextID']  = $nextID;
  1030.   $_showdata['meta']['lastID']  = $lastID;
  1031.   $_showdata['meta']['startID'] = $startID;
  1032.  
  1033.   //Rückgabewert feststellen
  1034.   if(empty($_showdata)) return get_error_description(4); //Keine Daten vorhanden
  1035.   else                  return get_error_description(0); //Alles OK ;-)
  1036. }
  1037.  
  1038. #--------------------------------------------------------------------
  1039. function flat_rec_make_list(&$_showdata)
  1040. {
  1041.   //status-Buffer rücksetzen
  1042.   clearstatcache();
  1043.  
  1044.   echo "<h2>Übersicht aller ausgewählten Records</h2>\n\n";
  1045.   foreach($_showdata['data'] as $id => $_record)
  1046.   {
  1047.     echo "<div class=\"entry\">\n";
  1048.     echo "Eintrags ID: $id<br>\n";
  1049.     echo "<a class=\"detailslink\" href=\"" . $_SERVER['PHP_SELF'] . "?detailID=" . $id . "&amp;backID=";
  1050.     echo intval($_showdata['meta']['startID']) . "\">Details ansehen</a><br>\n";
  1051.     echo "</div>\n\n";
  1052.   }
  1053.  
  1054.   if($_showdata['meta']['lastID'] !== false)
  1055.   {
  1056.     echo "<a id=\"beforelink\" href=\"" . $_SERVER['PHP_SELF'] . "?startID=" . $_showdata['meta']['lastID'];
  1057.     echo "\">Vorherige Einträge</a>\n";
  1058.   }
  1059.   if($_showdata['meta']['nextID'] !== false)
  1060.   {
  1061.     echo "<a id=\"nextlink\" href=\"" . $_SERVER['PHP_SELF'] . "?startID=" . $_showdata['meta']['nextID'];
  1062.     echo "\">Weitere Einträge</a>\n";
  1063.   }
  1064. }
  1065.  
  1066. #--------------------------------------------------------------------
  1067. function flat_rec_make_detail(&$_recdata, $dataID, $backStartID = false)
  1068. {
  1069.   //status-Buffer rücksetzen
  1070.   clearstatcache();
  1071.  
  1072.   echo "<h3>Detailansicht eines Records</h3>\n";
  1073.   echo "<div class=\"detailentry\">\n";
  1074.   echo "<table cellpadding=2 cellspacing=2>\n";
  1075.   foreach($_recdata['data'][$dataID] as $key => $value)
  1076.   {
  1077.     echo "<tr>\n";
  1078.     echo "<td>" . $key . ":</td>\n";
  1079.     echo "<td>" . $value . "</td>\n";
  1080.     echo "</tr>\n";
  1081.   }
  1082.   echo "</table>\n";
  1083.   echo "</div>\n\n";
  1084.  
  1085.   //Wenn eine Zurück ID angegeben wurde, diese ausgeben
  1086.   if($backStartID)
  1087.   {
  1088.     echo "<a id=\"backlink\" href=\"" . $_SERVER['PHP_SELF'] . "?startID=";
  1089.     echo $backStartID . "\">Zurück</a>\n";
  1090.   }
  1091. }
  1092.  
  1093. #--------------------------------------------------------------------
  1094. function flat_rec_search(&$_recdata, $term, $searchin = "value", $searchtype = "simple")
  1095. {
  1096.   //Dateiformat überprüfen
  1097.   if (!is_array($_recdata) or
  1098.       !is_array($_recdata['data']))
  1099.   {
  1100.     return get_error_description(11);    ## Dateiformat passt nicht
  1101.   }
  1102.   //Überhaupt Datensätze vorhanden?
  1103.   if (empty($_recdata))
  1104.   {
  1105.     return get_error_description(14);    ## Format ok, aber keine Datensätze
  1106.   }
  1107.   //Soll in den Schlüsseln gesucht werden?
  1108.   if($searchin == "key")
  1109.   {
  1110.     //Alle Datensätze durchgehen
  1111.     foreach($_recdata['data'] as $id => $_record)
  1112.     {
  1113.       //Schalter, ob etwas gefunden wurde
  1114.       $found = false;
  1115.       //Alle Datensätze durchgehen
  1116.       foreach($_record as $key => $value)
  1117.       {
  1118.         //Aufwendige Suche?
  1119.         if($searchtype == "preg")
  1120.         {
  1121.           //Wenn was gefunden, Schalter auf true setzen
  1122.           if(preg_match($term, $key)) $found = true;
  1123.         }
  1124.         //Sonst einfache Suche
  1125.         else
  1126.         {
  1127.           //Wenn was gefunden, Schalter auf true setzen
  1128.           if($key == $term) $found = true;
  1129.         }
  1130.       }
  1131.       //Wenn nichts gefunden wurde, Datensatz entfernen
  1132.       if($found == false)
  1133.       {
  1134.         unset($_recdata['data'][$id]);
  1135.       }
  1136.     }
  1137.   }
  1138.   //Ansonsten suchen wir in den Werten
  1139.   else //$searchin == "value"
  1140.   {
  1141.     //Alle Datensätze durchgehen
  1142.     foreach($_recdata['data'] as $id => $_record)
  1143.     {
  1144.       //Schalter, ob etwas gefunden wurde
  1145.       $found = false;
  1146.       //Alle Datensätze durchgehen
  1147.       foreach($_record as $key => $value)
  1148.       {
  1149.         //Handelt es sich um ein Unter-Array?
  1150.         //Das können wir bis jetzt noch nicht durchsuchen
  1151.         if(is_array($value)) continue;
  1152.         //Aufwendige Suche?
  1153.         if($searchtype == "preg")
  1154.         {
  1155.           //Wenn was gefunden, Schalter auf true setzen
  1156.           if(preg_match($term, $value)) $found = true;
  1157.         }
  1158.         else
  1159.         {
  1160.           //Wenn was gefunden, Schalter auf true setzen
  1161.           if($value == $term) $found = true;
  1162.         }
  1163.       }
  1164.       //Wenn nichts gefunden wurde, Datensatz entfernen
  1165.       if($found == false)
  1166.       {
  1167.         unset($_recdata['data'][$id]);
  1168.       }
  1169.     }
  1170.   }
  1171.   return get_error_description(0)## Kein Fehler aufgetreten
  1172. }
  1173.  
  1174. #--------------------------------------------------------------------
  1175. function flat_rec_filter(&$_recdata, $startID, $stopID = false)
  1176. {
  1177.   //Dateiformat überprüfen
  1178.   if (!is_array($_recdata) or
  1179.       !is_array($_recdata['data']))
  1180.   {
  1181.     return get_error_description(11);    ## Dateiformat passt nicht
  1182.   }
  1183.   //Überhaupt Datensätze vorhanden?
  1184.   if (empty($_recdata))
  1185.   {
  1186.     return get_error_description(14);    ## Format ok, aber keine Datensätze
  1187.   }
  1188.   //Wenn nur ein Datensatz herrausgefiltert werden soll
  1189.   if($stopID === false)
  1190.   {
  1191.     foreach($_recdata as $key => $_record)
  1192.     {
  1193.       //Alle nicht passenden Datensätze rauslöschen
  1194.       if($key != $startID)
  1195.       {
  1196.         unset($_recdata[$key]);
  1197.       }
  1198.     }
  1199.   }
  1200.   //Wenn ein Bereich an Datensätzen herrausgefiltert werden soll
  1201.   else
  1202.   {
  1203.     foreach($_recdata as $key => $_record)
  1204.     {
  1205.       //Alle nicht in diesem Bereich liegenden Datensätze löschen
  1206.       if($key < $startID OR $key > $stopID)
  1207.       {
  1208.         unset($_recdata[$key]);
  1209.       }
  1210.     }
  1211.   }
  1212.   return get_error_description(0);    ## Keine Fehler aufgetreten
  1213. }
  1214.  
  1215.  
  1216. #--------------------------------------------------------------------
  1217. # Backup- und Archivierungsfunktionen
  1218. #--------------------------------------------------------------------
  1219. function flat_rec_copy()
  1220. {
  1221.  
  1222.  
  1223. }
  1224.  
  1225. #--------------------------------------------------------------------
  1226. function flat_file_backup($filepath, $backuppath, $compress = 0)
  1227. {
  1228.   //status-Buffer rücksetzen
  1229.   clearstatcache();
  1230.  
  1231.   //Datei öffnen und locken, bei Fehler abrechen
  1232.   $fp = flat_open_lock($filepath,LOCK_EX);
  1233.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  1234.  
  1235.   $filesize = filesize($filepath);
  1236.  
  1237.   // maximal zulässige Filegröße + Sicherheit zum Öffnen
  1238.   if ($filesize > FLAT_MAXFILESIZE+5000)
  1239.   {                             
  1240.     fclose($fp);
  1241.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  1242.   }
  1243.  
  1244.   //Datei einlesen
  1245.   fseek($fp,0,SEEK_SET);
  1246.   $_file_packed = fread($fp,$filesize);
  1247.  
  1248.   fclose($fp);
  1249.  
  1250.   if($backuppath===false)
  1251.   {
  1252.     $backuppath = $filepath . date(".Ymd");
  1253.   }
  1254.  
  1255.   // wahlweise Komprimierung durchführen
  1256.   $compress = intval($compress);
  1257.   if ($compress > 0 AND $compress < 10)
  1258.   {
  1259.     $backuppath .= '.cpr';
  1260.     //Haben wir eine PHP Version >= 4.2? Denn der Komprimierungsgrad als
  1261.     //zweiter Parameter für gzencode() wurde erst in PHP 4.2 eingeführt!
  1262.     if(version_compare(phpversion(), "4.2", ">="))
  1263.     {
  1264.         $_file_packed = gzencode($_file_packed,$compress)## gZIP erstellen
  1265.     }
  1266.     else
  1267.     {
  1268.         $_file_packed = gzencode($_file_packed);            ## gZIP erstellen
  1269.     }
  1270.   }
  1271.   else
  1272.   {
  1273.     $backuppath .= '.abk';
  1274.   }
  1275.    
  1276.    
  1277.   $fp = flat_open_lock($backuppath,LOCK_EX);
  1278.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  1279.  
  1280.   // prüfen, ob Ausgabefile schon Daten enthielt.
  1281.   $filesize = filesize($backuppath);
  1282.   if ($filesize > 0)
  1283.   {
  1284.     fclose($fp);
  1285.     return get_error_description(3)## File existiert schon
  1286.   }
  1287.  
  1288.   fwrite($fp,$_file_packed,strlen($_file_packed));
  1289.   fclose($fp);
  1290.  
  1291.   return get_error_description(0)## Kein Fehler aufgetreten
  1292. }
  1293.  
  1294.  
  1295. ######################################################################
  1296. #/------------------------------------------------------------------\#
  1297. #|                           End of File                            |#
  1298. #\------------------------------------------------------------------/#
  1299. ######################################################################
  1300.  
  1301. ?>

Zurück zur Übersicht - Datei downloaden

Nach obenNach unten

Valid XHTML 1.0! Valid CSS!

Letzte Änderungen: Sonntag, der 03. Februar 2008
© 2005, Dennis Riehle.