Scripte

PHP Script: flatbox-0.2.2_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. ### flat_box.php              ###
  15.  
  16. ### Copyright:                ###
  17. ### Thomas Schmieder          ###
  18. ### Dennis Riehle             ###
  19.  
  20. ### Stand 10.07.2005 15:04:13 ###
  21. ### Version 0.2.2             ###
  22.  
  23.  
  24. ######################################################################
  25. #/------------------------------------------------------------------\#
  26. #|                            Changelog                             |#
  27. #\------------------------------------------------------------------/#
  28. ######################################################################
  29.  
  30. /*
  31. - get_microtime verändert, dass in PHP5 der Workaround nicht gebraucht wird
  32. - Beschreibung zu get_microtime erstellt
  33. - Beschreibung zu strip erweitert
  34. - In allen Beschreibungen die Parameter entfernt, wozu braucht man die da?
  35.   Es gibt doch schließlich eine Doku ;-)
  36. - ASCII Flatbox Schrifzug am Anfang eingefügt
  37. - Konstanten PRINT_NOTICES, PRINT_WARNINGS und PRINT_FAILES eingeführt
  38. - Funktion get_error_description angepasst, sodass sich über die drei oben
  39.   genannten Konstanten die Ausgabe von Fehlermeldungen steuern lässt.
  40. - Alle Funktion sofern angepasst, dass diese nicht mehr direkt den Errorcode
  41.   zurück liefern, sondern dass der Errorcode erst durch get_error_description
  42.   gejagt wird und dann zurückgegeben wird. So lässt sich mit den obigen
  43.   Konstanten die Fehlerausgabe aller Funktion kontrollieren.
  44. */
  45.  
  46. ######################################################################
  47. #/------------------------------------------------------------------\#
  48. #|     Definition der benötigten Funktionen mit Erklärung           |#
  49. #\------------------------------------------------------------------/#
  50. ######################################################################
  51.  
  52. /*
  53. Dauerfunktionen:
  54. ================
  55. - get_error_description               => Liefert die Beschreibungen zu einem
  56.                                          Fehler, je nach definierten Konstanten,
  57.                                          werden diese ausgegeben oder nicht.
  58. - get_microtime                       => Diese Funktion liefert einen Timestamp
  59.                                          zurück, der die aktuelle Zeit in Sekunden
  60.                                          mit 4 Nachkommastellen angibt.
  61.                                          Was in PHP5 durch microtime(true); erledigt
  62.                                          werden kann, kann in PHP4 nur mit einem
  63.                                          Workaround erzielt werden.
  64. - get_time_s                          => Liefert die aktuelle Zeit zurück,
  65.                                          in einem speziallen Timestamp:
  66.                                          JahrMonatTagStundeMinuteSekunde.Millisekunden
  67. - strip                               => Rekursive Entfernung der
  68.                                          Maskierungs-Backslashes in $data, sofern
  69.                                          magic_quotes aktiviert sind
  70. - flat_open_lock                      => Öffnet $filename und nutzt als
  71.                                          Sperrmethode $lockmode
  72. Einmalige Funktionen:
  73. =====================
  74. - flat_file_create                    => Erstellt die Datei $filepath
  75. - flat_file_alter                     => Ändert die Dateien, wenn z.B. ein
  76.                                          Feld dazukommt
  77. Grundfunktionen (BIOS):
  78. =======================
  79. - flat_rec_insert                     => Schreibt einen neuen Datensatz in
  80.                                          die angegebene Datei
  81. - flat_rec_select                     => holt eine Recordliste aus
  82.                                          einem File
  83. - flat_rec_update                     => Erneuert Datensätze in $filepath
  84.                                          oder fügt sie hinzu, wenn die ID noch
  85.                                          nicht vorhanden war.
  86. - flat_rec_delete                     => Löscht die Datensätze in $filename
  87. Anzeigefunktionen:
  88. ==================
  89. - flat_rec_get_listdata               => Besorgt alle notwendigen Daten für
  90.                                          die HTML Ausgabe mit Blätterfunktion
  91. - flat_rec_make_list                  => Erzeugt die HTML Ausgabe für die
  92.                                          Anzeige mit Blätterfunktion
  93. - flat_rec_make_detail                => Erzeugt die HTML Ausgabe für
  94.                                          einen angeforderten Datenksatz
  95. - flat_rec_search                     => Sucht je nach Auswahl im Archiv oder
  96.                                          aktuell.dat nach String
  97. Backup- und Archivierungsfunktionen:
  98. ====================================
  99. - flat_rec_copy                       => Kopiert eine bestimmte Menge an
  100.                                          Datensätzen, wird zur Archivierung genutzt
  101. - flat_file_backup                    => Erstellt ein Backup der
  102.                                          Datei $filepath am Ort $backuppath,
  103.                                          zusätzlich kann ein Komprimierungscode
  104.                                          angegeben werden.
  105. */
  106.  
  107.  
  108. #--------------------------------------------------------------------
  109. # includes und Konstanten
  110. #--------------------------------------------------------------------
  111. define ('FLAT_MAXFILESIZE', 1000000);
  112. define ('PRINT_NOTICES',    true   );
  113. define ('PRINT_WARNINGS',   true   );
  114. define ('PRINT_FAILES',     true   );
  115.  
  116.  
  117. #--------------------------------------------------------------------
  118. # Dauerfunktionen
  119. #--------------------------------------------------------------------
  120. function get_error_description($errnr, $returndescr = false)
  121. {
  122.   //Notiz-Meldungen, 0 und 100+
  123.   $_notices = array(
  124.          0 => "No errors, function was successfully carried out."
  125.     );
  126.   //Warn-Meldungen, 1 bis 49
  127.   $_warnings = array(
  128.          2 => "Low-Level Error: Flat Box wasn't able to find the selected file.",
  129.          3 => "Low-Level Error: Selected file already exists.",
  130.          4 => "Low-Level Error: There are no data records, selected file is empty.",
  131.          5 => "Low-Level Error: Authorisation Error on low-level section.",
  132.          8 => "Low-Level Error: Flat Box wasn't able to write in the file.",
  133.         10 => "Low-Level Error: Maximum allowable filesize is transgressed.",
  134.         11 => "Data Error: File format doesn't match.",
  135.         12 => "Data Error: Still erroneous data records in ['denied'].",
  136.         13 => "Data Error: There are still some data records that couldn't be worked up.",
  137.         14 => "Data Error: There are no data records, but the file format is OK."
  138.     );
  139.   //Fehler-Meldungen in der Userverwaltung, 50 bis 99
  140.   $_failes = array(
  141.         50 => "Authorisation Error, no further information avaliable."
  142.     );
  143.  
  144.   //Wenn keine Error Nummer übergeben wurde, abbrechen
  145.   if(!is_numeric($errnr)) return false;
  146.   //Prüfen, ob es sich um eine existierende Notice-Meldung handelt
  147.   elseif($errnnr == 0 OR $errnr >= 100 AND isset($_notices[$errnr]))
  148.   {
  149.     $message = $_notices[$errnr];
  150.     //Wenn entsprechend definiert, Meldung ausgeben
  151.     if(defined('PRINT_NOTICES') AND PRINT_NOTICES)
  152.     {
  153.       echo "<b>Notice:</b> " . $message . "<br /><br />\n";
  154.     }
  155.   }
  156.   //Prüfen, ob es sich um eine existierende Warning-Meldung handelt
  157.   elseif($errnr >= 1 AND $errnr <= 49 AND isset($_warnings[$errnr]))
  158.   {
  159.     $message = $_warnings[$errnr];
  160.     //Wenn entsprechend definiert, Meldung ausgeben
  161.     if(defined('PRINT_WARNINGS') AND PRINT_WARNINGS)
  162.     {
  163.       echo "<b>Warning:</b> " . $message . "<br /><br />\n";
  164.     }
  165.   }
  166.   //Prüfen, ob es sich um eine existierende Fehler-Meldung handelt
  167.   elseif($errnr >= 50 AND $errnr <= 99 AND isset($_failes[$errnr]))
  168.   {
  169.     $message = $_failes[$errnr];
  170.     //Wenn entsprechend definiert, Meldung ausgeben
  171.     if(defined('PRINT_WARNINGS') AND PRINT_WARNINGS)
  172.     {
  173.       echo "<b>Warning:</b> " . $message . "<br /><br />\n";
  174.     }
  175.   }
  176.   //Ansonsten ist der Errorcode unbekannt
  177.   else
  178.   {
  179.     $message = "An unknown error occured, please refer to Thomas Schmieder or "
  180.              . "Dennis Riehle to get more information about error " . $errnr;
  181.     echo "<b>Fatal Error:</b> " . $message . "<br /><br />\n";
  182.   }
  183.   if($returndescr)
  184.   {
  185.     return $message;
  186.   }
  187.   else
  188.   {
  189.     return $errnr;
  190.   }
  191. }
  192.  
  193. #--------------------------------------------------------------------
  194. function get_microtime()
  195. {
  196.   //Wir eine PHP Version kleiner 5 verwendet?
  197.   if(version_compare(phpversion(), "5", "<"))
  198.   {
  199.     //Dann müssen wir uns die Zahl selber zusammenstellen
  200.     list($usec, $sec) = explode(" ",microtime());
  201.     $microtime = (float)$usec + (float)$sec;
  202.   }
  203.   else
  204.   {
  205.     //PHP5 kennt einen opt. Parameter für microtime(),
  206.     //der das bereits alles erledigt
  207.     $microtime = microtime(true);
  208.   }
  209.   return $microtime;
  210. }
  211.  
  212. #--------------------------------------------------------------------
  213. function get_time_s()
  214. {
  215.   list($usec, $sec) = explode(" ",microtime());
  216.   $time_s = date("YmdHis").substr($usec,1,7);
  217.  
  218.   return $time_s;
  219. }
  220.  
  221. #--------------------------------------------------------------------
  222. function strip($data)       
  223. {
  224.   if (!get_magic_quotes_gpc())
  225.   {
  226.     return $data;
  227.   }
  228.  
  229.   if (is_array($data))
  230.   {
  231.     foreach($data as $key => $val)
  232.     {
  233.       $data[$key] = strip($val);
  234.     }
  235.   }
  236.   else
  237.   {
  238.     $data = stripslashes($data);
  239.   } 
  240.  
  241.   return $data;
  242. }
  243.  
  244.  
  245. #--------------------------------------------------------------------
  246. function flat_open_lock($filepath,$lockmode)
  247. { 
  248.   # Lockdatei öffnen oder anlegen
  249.   for ($x=0;$x<5;$x++)
  250.   {
  251.     if($lh = @fopen($filepath,"a+")) break;
  252.     usleep(8000)## 8ms warten bis zum nächsten Versuch
  253.   }
  254.  
  255.   if (!$lh) return false
  256.  
  257.   # Lockversuch
  258.   for ($x=0;$x<5;$x++)
  259.   {
  260.     if (@flock($lh,$lockmode + LOCK_NB)) return $lh;
  261.     usleep(8000)## 8ms warten bis zum nächsten Versuch
  262.   }
  263.  
  264.   fclose($lh);
  265.   return false;
  266. }
  267.  
  268.  
  269. #--------------------------------------------------------------------
  270. # Einmalige Funktionen
  271. #--------------------------------------------------------------------
  272. function flat_file_create($filepath)     
  273. {
  274.  clearstatcache();                     ## Statusbuffer rücksetzen
  275.  
  276.  if(file_exists($filepath)) return get_error_description(3)## Datei existiert schon
  277.  
  278.  $fp = flat_open_lock($filepath,LOCK_EX);
  279.  
  280.  if($fp)
  281.  {                                     ## wenn File > 0 war es schon da
  282.    if (filesize($filepath) > 0)        ## man muss das hier nochmal bzw
  283.                                        ## eigentlich erst hier testen,
  284.    {                                   ## weil zwischen Handle-Beschaffung
  285.                                        ## und Lock Zeit vergeht
  286.      fclose($fp);
  287.      return get_error_description(3)## Datei existiert schon
  288.    }
  289.    $time_s = get_time_s();
  290.    $time_u = time();
  291.    
  292.    $_file         = array();
  293.    $_file['meta'] = array();
  294.    $_file['data'] = array();
  295.    
  296.    $_file['meta']['created']    = $time_u;      ## erstellt am
  297.    $_file['meta']['lastupdate'] = $time_s;      ## letztes Write   
  298.    $_file['meta']['lastid']     = 0;
  299.    $_file['meta']['amount']     = 0;
  300.    
  301.    $_file_packed = serialize($_file);
  302.    fseek($fp,0);
  303.    fwrite($fp,$_file_packed,strlen($_file_packed));
  304.    fclose($fp);
  305.    
  306.    return get_error_description(0);    ##Code für kein Fehler
  307.  }
  308.  else return get_error_description(5); ##Code für Datei nicht geöffnet
  309. }
  310.  
  311. #--------------------------------------------------------------------
  312. function flat_file_alter()
  313. {
  314.  
  315.  
  316. }
  317.  
  318.  
  319. #--------------------------------------------------------------------
  320. # Grundfunktionen (BIOS)
  321. #--------------------------------------------------------------------
  322. function flat_rec_insert($filepath,&$_recdata)
  323. {
  324.   //status-Buffer rücksetzen
  325.   clearstatcache();
  326.  
  327.   //Datei öffnen und locken, bei Fehler abrechen
  328.   $fp = flat_open_lock($filepath,LOCK_EX);
  329.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  330.  
  331.   // maximale Dateigröße prüfen
  332.   $filesize = filesize($filepath);
  333.   if ($filesize > FLAT_MAXFILESIZE)
  334.   {
  335.     fclose($fp);
  336.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  337.   }
  338.        
  339.   //Datei entpacken
  340.   fseek($fp,0,SEEK_SET);
  341.   $_file_packed = fread($fp,$filesize);
  342.   $_file = unserialize($_file_packed);
  343.      
  344.  
  345.   //Zeitstempel erzeugen und merken
  346.   $time_s = get_time_s();
  347.   $time_u = time();
  348.  
  349.   //$_file anlegen, falls nicht vorhanden
  350.   if(empty($_file))
  351.   {
  352.     $_file = array();
  353.     $_file['meta'] = array();
  354.     $_file['data'] = array();
  355.  
  356.     $_file['meta']['created'] = $time_u;
  357.     $_file['meta']['lastupdate'] = $time_s;       
  358.     $_file['meta']['lastid'] = 0;
  359.     $_file['meta']['amount'] = 0;
  360.   }
  361.   else
  362.   {
  363.     //Dateiformat überprüfen
  364.     if (!isset($_file['meta']['created']) or
  365.         !isset($_file['meta']['lastupdate']) or
  366.         !isset($_file['meta']['lastid']) or
  367.         !isset($_file['meta']['amount']) or
  368.         !is_array($_file['data']))
  369.     {
  370.       fclose($fp);
  371.       return get_error_description(11);           ## Dateiformat passt nicht
  372.     }
  373.  
  374.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  375.     {
  376.       fclose($fp);                       ## noch fehlerhafte Datensätze im Array
  377.       return get_error_description(12);                         ## oder noch Ergebnisdaten vorhanden
  378.     }
  379.     $_recdata['meta']   = array();       ## es könnten ja noch leere Strings sein
  380.     $_recdata['denied'] = array();
  381.   }
  382.      
  383.   $_recdata['meta']['rec_inserted'] = 0## Anzahl der fehlerfrei updated Records
  384.   $_recdata['meta']['rec_denied']  = 0;   ## Anzahl der abgelehnten Records
  385.  
  386.   foreach($_recdata['data'] as $key => $_record)
  387.   {
  388.     if(!empty($_record))
  389.     {
  390.       $_recdata['meta']['rec_inserted'] ++; ## fehlerfrei eingefügten DS zählen
  391.       $_file['meta']['lastid'] ++;   
  392.       $_file['meta']['amount'] ++;           
  393.    
  394.       $new_key = $_file['meta']['lastid'];
  395.    
  396.       $_file['data'][$new_key] = $_record;   ## Daten übertragen
  397.       $_file['data'][$new_key]['lastupdate'] = $time_s; ## Aktualisierungsdatum eintragen
  398.       $_file['data'][$new_key]['created']   = $time_u; ## Erstelldatum eintragen
  399.       unset($_recdata['data'][$key]);        ## Record aus Auftragsliste löschen
  400.    
  401.       $_recdata['rec_inserted'][$key]['new_id'] = $new_key; ## Erteilter Schlüssel
  402.     }
  403.     else
  404.     {
  405.       $_recdata['denied'][$key] = $_record## abgelehnter Datensatz
  406.       $_recdata['meta']['rec_denied'] ++;    ## "abgelehnt" zählen
  407.     }
  408.   }
  409.  
  410.   // wenn Datensätze eingefügt wurden
  411.   if ($_recdata['meta']['rec_inserted'] > 0)
  412.   {
  413.     // letzte Veränderung eintragen
  414.     $_file['meta']['lastupdate'] = $time_s;
  415.  
  416.     //Datei verpacken
  417.     $_file_packed = serialize($_file);
  418.        
  419.     //und abspeichern
  420.     fseek($fp,0);
  421.     ftruncate($fp,0);
  422.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  423.   }   
  424.  
  425.   @fclose($fp);
  426.  
  427.   //Rückgabewert der Funktion
  428.   if (!$writeok)
  429.   {
  430.     return get_error_description(8);     # Fehler beim Schreiben der Daten;
  431.   } 
  432.  
  433.   if (count($_recdata['denied'])==0)
  434.   {
  435.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze verarbeitet.
  436.   }
  437.   else
  438.   {
  439.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  440.   }
  441. }
  442.  
  443. #--------------------------------------------------------------------
  444. function flat_rec_select($filepath,&$_recdata,$_userdata,$_rights)
  445. {
  446.   //status-Buffer rücksetzen
  447.   clearstatcache();
  448.  
  449.   //Datei öffnen und locken, bei Fehler abrechen
  450.   $fp = flat_open_lock($filepath,LOCK_SH)
  451.  
  452.   if (!$fp) return get_error_description(5);           ## Datei konnte nicht gesperrt werden
  453.  
  454.   // maximale Dateigröße prüfen
  455.   $filesize = filesize($filepath);
  456.   if ($filesize > FLAT_MAXFILESIZE + 5000)
  457.   {
  458.     fclose($fp);
  459.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  460.   }
  461.        
  462.   //Datei entpacken
  463.   fseek($fp,0,SEEK_SET);
  464.   $_file_packed = fread($fp,$filesize);
  465.   fclose($fp);       
  466.   $_file = unserialize($_file_packed);
  467.  
  468.   //abbrechen, falls $_file leer ist
  469.   if(empty($_file) or ($filesize == 0))
  470.   {
  471.     return get_error_description(4);
  472.   }
  473.   else
  474.   {
  475.     //Dateiformat überprüfen
  476.     if (!isset($_file['meta']['created']) or
  477.         !isset($_file['meta']['lastupdate']) or
  478.         !isset($_file['meta']['lastid']) or
  479.         !isset($_file['meta']['amount']) or
  480.         !is_array($_file['data']))
  481.     {
  482.       return get_error_description(11);           ## Dateiformat passt nicht
  483.     }
  484.  
  485.      
  486.     $_recdata = array();
  487.     $_recdata['meta'] = $_file['meta'];      ## Metadaten übertragen
  488.     $_recdata['meta']['rec_denied']    = 0## Anzahl der verbotenen Records
  489.     $_recdata['meta']['rec_selected']  = 0## Anzahl der gelieferten Records
  490.  
  491.  
  492.     foreach($_file['data'] as $key => $_record)
  493.     {
  494.       if(isset($_record['rights']) and (false))           ## Einschränkende rechte vorhanden
  495.       {
  496.         $_recdata['meta']['rec_denied'] ++;              ## mangelnde Userrechte
  497.       }
  498.       else
  499.       {
  500.         $_recdata['meta']['rec_selected'] ++;            ## erlaubter Datensatz
  501.         $_recdata['data'][$key] = $_record;              ## Daten übertragen
  502.       }
  503.     }
  504.     ksort($_recdata['data']);                            ## nach IDs sortieren
  505.   }
  506.  
  507.      
  508.   //Rückgabewert der Funktion
  509.  
  510.   if ($_recdata['meta']['rec_denied'] == 0)              ## alle Sätze erlaubt
  511.   {
  512.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze verarbeitet.
  513.   }
  514.   else
  515.   {
  516.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  517.   }
  518. }
  519.  
  520. #--------------------------------------------------------------------
  521. function flat_rec_update($filepath,&$_recdata)
  522. {
  523.   //status-Buffer rücksetzen
  524.   clearstatcache();
  525.  
  526.   //Datei öffnen und locken, bei Fehler abrechen
  527.   $fp = flat_open_lock($filepath,LOCK_EX);
  528.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  529.  
  530.   // maximale Dateigröße prüfen
  531.   $filesize = filesize($filepath);
  532.   if ($filesize > FLAT_MAXFILESIZE)
  533.   {
  534.     fclose($fp);
  535.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  536.   }
  537.  
  538.   //Datei entpacken
  539.   fseek($fp,0,SEEK_SET);
  540.   $_file_packed = fread($fp,$filesize);
  541.   $_file = unserialize($_file_packed);
  542.      
  543.  
  544.   //Zeitstempel erzeugen und merken
  545.   $time_s = get_time_s();
  546.   $time_u = time();
  547.  
  548.   //$_file anlegen, falls nicht vorhanden
  549.   if(empty($_file))
  550.   {
  551.     $_file = array();
  552.     $_file['meta'] = array();
  553.     $_file['data'] = array();
  554.  
  555.     $_file['meta']['created'] = $time_u;
  556.     $_file['meta']['lastupdate'] = $time_s;       
  557.     $_file['meta']['lastid'] = 0;
  558.     $_file['meta']['amount'] = 0;
  559.   }
  560.   else
  561.   {
  562.     //Dateiformat überprüfen
  563.     if (!isset($_file['meta']['created']) or
  564.         !isset($_file['meta']['lastupdate']) or
  565.         !isset($_file['meta']['lastid']) or
  566.         !isset($_file['meta']['amount']) or
  567.         !is_array($_file['data']))
  568.     {
  569.       fclose($fp);
  570.       return get_error_description(11);           ## Dateiformat passt nicht
  571.     }
  572.  
  573.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  574.     {
  575.       fclose($fp);                       ## noch fehlerhafte Datensätze im Array
  576.       return get_error_description(12);                         ## oder noch Ergebnisdaten vorhanden
  577.     }
  578.     $_recdata['meta']   = array();       ## es könnten ja noch leere Strings sein
  579.     $_recdata['denied'] = array();
  580.   }
  581.      
  582.   $_recdata['meta']['rec_updated'] = 0## Anzahl der fehlerfrei updated Records
  583.   $_recdata['meta']['rec_denied']  = 0## Anzahl der abgelehnten Records
  584.  
  585.   foreach($_recdata['data'] as $key => $_record)
  586.   {
  587.     if(isset($_file['data'][$key]))      ## Datensatz ist vorhanden
  588.     {
  589.       if ($_file['data'][$key]['lastupdate'] == $_record['lastupdate'])
  590.       {
  591.         $_recdata['meta']['rec_updated'] ++;           ## fehlerfrei updated zählen
  592.         $_file['data'][$key] = $_record;               ## Daten übertragen
  593.         $_file['data'][$key]['lastupdate'] = $time_s;   ## Aktualisierungsdatum eintragen
  594.         unset($_recdata['data'][$key]);                ## Record aus Auftragsliste löschen
  595.       }
  596.       else
  597.       {
  598.         $_recdata['denied'][$key] = $_file['data'][$key]; ## Daten aus dem File holen
  599.         $_recdata['meta']['rec_denied'] ++;               ## "abgelehnt" zählen
  600.       }
  601.     }
  602.     else  ## Datensatz aus der Auftragsliste ist noch nicht im File
  603.     {
  604.       if ($key > $_file['meta']['lastid'])             ## wenn die ID aus der Auftragsliste
  605.       {                                                ## größer als die größte ID im File
  606.         $_file['meta']['lastid'] = $key;               ## ist, lastID erhöhen
  607.       }
  608.      
  609.       if (trim($_record['lastupdate']) == "")           ## record hat keinen Meinstamp
  610.       {
  611.         $_record['lastupdate'] = $time_s;               ## Aktualisierungsdatum eintragen
  612.       }
  613.      
  614.       $_file['data'][$key] = $_record;                 ## Satz hinzufügen
  615.       $_file['meta']['amount'] ++;                     ## datensatz im File zählen
  616.       $_recdata['meta']['rec_updated'] ++;             ## erfolgreichen Auftrag zählen
  617.       unset($_recdata['data'][$key]);                  ## Record aus Auftragsliste löschen     
  618.     }
  619.   }
  620.  
  621.   //wenn Datensätze verändert oder eingefügt wurden
  622.   if ($_recdata['meta']['rec_updated'] >0)
  623.   {
  624.     // letzte Veränderung eintragen
  625.     $_file['meta']['lastupdate'] = $time_s;
  626.  
  627.     //Datei verpacken
  628.     $_file_packed = serialize($_file);
  629.      
  630.     //und abspeichern
  631.     fseek($fp,0);
  632.     ftruncate($fp,0);
  633.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  634.   } 
  635.    
  636.   @fclose($fp);
  637.      
  638.   //Rückgabewert der Funktion
  639.  
  640.   if (!$writeok) return get_error_description(8); # Fehler beim Schreiben;
  641.  
  642.   if (count($_recdata['denied'])==0)
  643.   {
  644.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze verarbeitet.
  645.   }
  646.   else
  647.   {
  648.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  649.   }
  650. }
  651.  
  652.  
  653. #--------------------------------------------------------------------
  654. function flat_rec_delete($filepath,&$_recdata)
  655. {
  656.   //status-Buffer rücksetzen
  657.   clearstatcache();
  658.  
  659.   //Datei öffnen und locken, bei Fehler abrechen
  660.   $fp = flat_open_lock($filepath,LOCK_EX);
  661.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  662.  
  663.   // maximale Dateigröße prüfen
  664.   $filesize = filesize($filepath);
  665.  
  666.   // maximale Dateigröße zuzüglich Sicherheitszuschlag für LESEN
  667.   if ($filesize > FLAT_MAXFILESIZE + 5000)
  668.   {                             
  669.     fclose($fp);
  670.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  671.   }
  672.    
  673.   //Datei entpacken
  674.   fseek($fp,0,SEEK_SET);
  675.   $_file_packed = fread($fp,$filesize);
  676.   $_file = unserialize($_file_packed);
  677.  
  678.   //Zeitstempel erzeugen.
  679.   $time_s = get_time_s();
  680.  
  681.   //Prüfen, ob $_file Daten enthält
  682.   if(empty($_file))
  683.   {
  684.     return get_error_description(4);              ## Keine Daten vorhanden
  685.   }
  686.   else
  687.   {
  688.     //Dateiformat überprüfen
  689.     if (!isset($_file['meta']['created']) or
  690.         !isset($_file['meta']['lastupdate']) or
  691.         !isset($_file['meta']['lastid']) or
  692.         !isset($_file['meta']['amount']) or
  693.         !is_array($_file['data']))
  694.     {
  695.       fclose($fp);
  696.       return get_error_description(11);           ## Dateiformat passt nicht
  697.     }
  698.  
  699.     if (!empty($_recdata['denied']) or !empty($_recdata['meta']))
  700.     {
  701.       fclose($fp);
  702.       return get_error_description(12);           ## noch fehlerhafte Datensätze im Array
  703.     }                      ## oder noch falsche Ergbnisdaten
  704.     $_recdata['meta']   = array();
  705.     $_recdata['denied'] = array();
  706.    
  707.   }
  708.  
  709.   $_recdata['meta']['rec_deleted'] = 0## Anzahl der fehlerfrei gelöschten Records
  710.   $_recdata['meta']['rec_denied']  = 0## Anzahl der abgelehnten Records
  711.  
  712.   foreach($_recdata['data'] as $key => $_record)
  713.   {
  714.     if(isset($_file['data'][$key]))      ## Datensatz ist vorhanden
  715.     {
  716.       if ($_file['data'][$key]['lastupdate'] == $_record['lastupdate'])
  717.       {
  718.         $_recdata['meta']['rec_deleted'] ++;  ## fehlerfrei updated zählen
  719.         unset($_file['data'][$key]);          ## Daten löschen
  720.         unset($_recdata['data'][$key]);       ## Record aus Auftragsliste löschen
  721.         $_file['meta']['amount']--;           ## Satzanzahl verringern
  722.       }
  723.       else
  724.       {
  725.         $_recdata['denied'][$key] = $_file['data'][$key]; ## Daten aus dem File holen
  726.         $_recdata['meta']['rec_denied'] ++;               ## "abgelehnt" zählen
  727.       }
  728.     }
  729.     else        ## Datensatz aus der Auftragsliste ist nicht im File
  730.     {
  731.       unset($_recdata['data'][$key]);       ## Record aus Auftragsliste löschen   
  732.     }
  733.   }
  734.  
  735.   // Wenn datensätze gelöscht wurden
  736.   if ($_recdata['meta']['rec_deleted'] >0)
  737.   {
  738.     // letzte Veränderung eintragen
  739.     $_file['meta']['lastupdate'] = $time_s;
  740.  
  741.     //Datei verpacken
  742.     $_file_packed = serialize($_file);
  743.      
  744.     //und abspeichern
  745.     fseek($fp,0);
  746.     ftruncate($fp,0);
  747.     $writeok = @fwrite($fp,$_file_packed,strlen($_file_packed));
  748.   }
  749.  
  750.   @fclose($fp);
  751.      
  752.   //Rückgabewert der Funktion
  753.  
  754.   if (!$writeok) return get_error_description(8);   ## Fehler beim Schreiben;
  755.  
  756.   if (count($_recdata['denied'])==0)
  757.   {
  758.     return get_error_description(0);       # kein Fehler aufgetreten, alle Sätze gelöscht wurden.
  759.   }
  760.   else
  761.   {
  762.     return get_error_description(13);      # nicht alle Sätze konnten verarbeitet werden
  763.   }
  764. }
  765.  
  766.  
  767. #--------------------------------------------------------------------
  768. # Anzeigefunktionen
  769. #--------------------------------------------------------------------
  770. function flat_rec_get_listdata($filepath,&$_showdata,&$nextID,&$lastID,$startID=false,$show=5,
  771.                               $_userdata=false,$_rights=false)
  772. {
  773.   //status-Buffer rücksetzen
  774.   clearstatcache();
  775.  
  776.   //alle Daten einlesen
  777.   $ok = flat_rec_select($filepath,&$_recdata,$userdata=false,$_right=false);
  778.  
  779.   //und bei Fehler abbrechen
  780.   if($ok != 0) return $ok;
  781.  
  782.   if(!$startID) $startID = $_recdata['meta']['lastid'];
  783.  
  784.   //Der Zähler für bereits rüberkopierte Datensätze auf 0 setzen
  785.   $count = 0;
  786.  
  787.   for($ID = $startID; $ID >= 0; $ID--)
  788.   {
  789.     //Wenn der Datensatz vorhanden ist
  790.     if(isset($_recdata['data'][$ID]))
  791.     {
  792.       //und noch Datensätze bis zum Soll fehlen
  793.       if($count < $show)
  794.       {
  795.         //Dann kopiere diesen Datensatz rüber
  796.         $_showdata['data'][$ID] = $_recdata['data'][$ID];
  797.         $count++;
  798.       }
  799.       //und das Soll errreicht ist
  800.       else
  801.       {
  802.         //Diese ID als nächste ID festhalten
  803.         $nextID = $ID;
  804.         //Und abbrechen
  805.         break;
  806.       }
  807.     }
  808.     //Wenn der Datensatz nicht vorhanden ist,
  809.     //einfach weitermachen
  810.   }
  811.   //Falls keine Datensätze gefunden wurden
  812.   if(empty($nextID)) $nextID = false;
  813.  
  814.   //LastID ermitteln:
  815.   //Den Zähler wieder auf null setzen
  816.   $count = 0;
  817.   for($ID = $startID; $ID <= $_recdata['meta']['lastid']; $ID++)
  818.   {
  819.     //Wenn der Datensatz vorhanden ist
  820.     if(isset($_recdata['data'][$ID]))
  821.     {
  822.       if($count < $show)
  823.       {
  824.         $count++;
  825.       }
  826.       else
  827.       {
  828.         $lastID = $ID;
  829.         break;
  830.        }
  831.     }
  832.     //Wenn der Datensatz nicht vorhanden ist,
  833.     //einfach weitermachen
  834.   }
  835.   //Wenn die lastID noch nicht herrausgefunden wurde
  836.   if(empty($lastID))
  837.   {
  838.     //Auf false setzen wenn gleich der es keine vorherigen Einträge
  839.     //mehr gibt
  840.     if($startID == $_recdata['meta']['lastid']) $lastID = false;
  841.     //Oder ansonsten auf die höchste ID setzen
  842.     else $lastID = $_recdata['meta']['lastid'];
  843.   }
  844.  
  845.   //Rückgabewert feststellen
  846.   if(empty($_showdata)) return get_error_description(4); //Keine Daten vorhanden
  847.   else                  return get_error_description(0); //Alles OK ;-)
  848. }
  849.  
  850. #--------------------------------------------------------------------
  851. function flat_rec_make_list($filepath,$startID=false,$show=5,$_userdata=false,$_rights=false)
  852. {
  853.   //status-Buffer rücksetzen
  854.   clearstatcache();
  855.  
  856.   $ok = flat_rec_get_listdata($filepath,$_showdata,$nextID,$lastID,$startID,$show,
  857.                                                          $_userdata=false,$_rights=false);
  858.  
  859.   //Bei Fehler abbrechen
  860.   if($ok != 0) return $ok;
  861.  
  862.   echo "<h2>Übersicht alles ausgewählten Records</h2>\n\n";
  863.   foreach($_showdata['data'] as $id => $_record)
  864.   {
  865.     echo "<div class=\"beitrag\">\n";
  866.     echo "Eintrags ID: $id<br>\n";
  867.     echo "<a href=\"".$_SERVER['PHP_SELF']."?detailID=".$id."&amp;backID=".$startID."\">Details</a><br>\n";
  868.     echo "</div>\n\n";
  869.   }
  870.  
  871.   if($lastID != false)
  872.   {
  873.     echo "<a href=\"".$_SERVER['PHP_SELF']."?startID=".$lastID."\">Vorherige Einträge</a><br>\n";
  874.   }
  875.   if($nextID != false)
  876.   {
  877.     echo "<a href=\"".$_SERVER['PHP_SELF']."?startID=".$nextID."\">Weitere Einträge</a><br>\n";
  878.   }
  879. }
  880.  
  881. #--------------------------------------------------------------------
  882. function flat_rec_make_detail($filepath,$dataID,$backStartID = false)
  883. {
  884.   //status-Buffer rücksetzen
  885.   clearstatcache();
  886.  
  887.   //Einen Datensatz holen
  888.   $ok = flat_rec_get_listdata($filepath,$_showdata,$nextID,$lastID,$dataID,$show = 1,
  889.                                                          $_userdata=false,$_rights=false);
  890.  
  891.   //Bei Fehler abbrechen
  892.   if($ok != 0) return $ok;
  893.  
  894.   //Es ist maximal ein Record im Array $_showdata['data']
  895.   foreach($_showdata['data'] as $id => $_record)
  896.   {
  897.     echo "<h3>Detailansicht eines Records</h3>\n";
  898.     echo "<div class=\"beitrag\">\n";
  899.     echo "  <table cellpadding=2 cellspacing=2>\n";
  900.     foreach($_showdata['data'][$id] as $key => $value)
  901.     {
  902.       echo "    <tr>\n";
  903.       echo "        <td>".$key.":</td>\n";
  904.       echo "        <td>".$value."</td>\n";
  905.       echo "    </tr>\n";
  906.     }
  907.     echo "  </table>\n";
  908.     echo "</div>\n\n";
  909.   }
  910.  
  911.   //Wenn eine Zurück ID angegeben wurde, diese ausgeben
  912.   if($backStartID)
  913.   {
  914.     echo "<a href=\"".$_SERVER['PHP_SELF']."?startID=".$lastID."\">Zurück</a><br>\n";
  915.   }
  916. }
  917.  
  918. #--------------------------------------------------------------------
  919. function flat_rec_search()
  920. {
  921.  
  922.  
  923. }
  924.  
  925.  
  926. #--------------------------------------------------------------------
  927. # Backup- und Archivierungsfunktionen
  928. #--------------------------------------------------------------------
  929. function flat_rec_copy()
  930. {
  931.  
  932.  
  933. }
  934.  
  935. #--------------------------------------------------------------------
  936. function flat_file_backup($filepath,$backuppath,$compress=0)
  937. {
  938.   //status-Buffer rücksetzen
  939.   clearstatcache();
  940.  
  941.   //Datei öffnen und locken, bei Fehler abrechen
  942.   $fp = flat_open_lock($filepath,LOCK_EX);
  943.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  944.  
  945.   $filesize = filesize($filepath);
  946.  
  947.   // maximal zulässige Filegröße + Sicherheit zum Öffnen
  948.   if ($filesize > FLAT_MAXFILESIZE+5000)
  949.   {                             
  950.     fclose($fp);
  951.     return get_error_description(10)## max. zulässige Dateigröße überschritten
  952.   }
  953.  
  954.   //Datei einlesen
  955.   fseek($fp,0,SEEK_SET);
  956.   $_file_packed = fread($fp,$filesize);
  957.  
  958.   fclose($fp);
  959.  
  960.   if($backuppath===false)
  961.   {
  962.     $backuppath = $filepath . date(".Ymd");
  963.   }
  964.  
  965.   // wahlweise Komprimierung durchführen
  966.   $compress = intval($compress);
  967.   if ($compress > 0)
  968.   {
  969.     $backuppath .= '.cpr';
  970.     $_file_packed = gzencode($_file_packed,$compress)## gZIP erstellen
  971.   }
  972.    
  973.   if($compress == 0)
  974.   {
  975.     $backuppath .= '.abk';
  976.   }
  977.    
  978.    
  979.   $fp = flat_open_lock($backuppath,LOCK_EX);
  980.   if (!$fp) return get_error_description(5); ## Datei konnte nicht gesperrt werden
  981.  
  982.   // prüfen, ob Ausgabefile schon Daten enthielt.
  983.   $filesize = filesize($backuppath);
  984.   if ($filesize > 0)
  985.   {
  986.     fclose($fp);
  987.     return get_error_description(3)## File existiert schon
  988.   }
  989.  
  990.   fwrite($fp,$_file_packed,strlen($_file_packed));
  991.   fclose($fp);
  992.  
  993.   return get_error_description(0)## Kein Fehler aufgetreten
  994. }
  995.  
  996. #--------------------------------------------------------------------
  997.  
  998. ### EOF ###
  999.  

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.