Scripte

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