0) return false; # touch() erlaubt ## Lockmode feststellen $mode = strtoupper($mode); $lockmode = LOCK_SH; if ($mode == 'W') { $openmode = 'rb+'; $lockmode = LOCK_EX; } elseif ($mode == 'C') { $openmode = 'xb+'; $error_no = 8; ## Datei wurde angelegt $lockmode = LOCK_EX; } elseif($mode == 'R') { $openmode = 'rb'; $lockmode = LOCK_SH; } else { $error_no = 100; ## falsche Funktionsnutzung return false; } ## Dateihandle beschaffen for ($x=0;$x<5;$x++) ## Schleife 5 mal durchlaufen { clearstatcache(); $php_errormsg = ''; if($lh = @fopen($lockfile_name,$openmode)) { $error_no = 0; break; ## oder bei Erfolg abbrechen } else { $errormsg = strtolower($php_errormsg); if(strpos($errormsg,'invalid argument')!==false) { $error_no = 101; ## hier könnte man auch überlegen $openmode = 'rb+'; ## es doch mit rb+ zu versuchen /* if (touch($lockfile_name)) { $openmode = 'rb+'; ## es doch mit rb+ zu versuchen $error_no = 8; } else return false; */ } elseif(strpos($errormsg,'illegal operation argument')!==false) { $error_no = 101; $openmode = 'rb+'; ## es doch mit rb+ zu versuchen /* if (touch($lockfile_name)) { $openmode = 'rb+'; $error_no = 8; } else return false; */ } elseif(strpos($errormsg,'no such file or directory')!==false) { $error_no = 2; return false; } elseif(strpos($errormsg,'permission denied')!==false) { $error_no = 5; return false; } elseif(strpos($errormsg,'file exists')!==false) { $openmode = 'rb+'; } } ## zur Zeit sind fopen() und dio_open() noch nicht aufeinander abgestimmt ## Eine Verzögerung beim Öffen ist daher noch nicht sinnvoll #usleep(8000); ## 8ms warten bis zum nächsten } ## Öffnungsversuch if (!$lh) { $error_no = 5; ## konnte Datei nicht öffnen return false; ## bei Misserfolg Funktionsende } # Lockversuch for ($x=0;$x<5;$x++) { if (@flock($lh,$lockmode + LOCK_NB)) { $lastwrite = filemtime($lockfile_name); ## letzes Modifikationsdatum return $lh; } usleep(8000); ## 8ms warten bis zum nächsten Versuch } $error_no = 6; ## konnte Datei nicht sperren fclose($lh); return false; } #------------------------------------------------------------------------------ function alter_format($dateiname,$_newfrm) { ## Quelldatei exclusiv sperren ## Formatdatei exclusiv sperren ## Altes Format einlesen ## Zieldatei temporär anlegen ## bis Dateiende >> ## Satz nach altem Format einlesen ## Satz nach neuem Format nach Temp schreiben ## << Dateiende ## Quelldatei umbenennen in .YmdHis.bak ## Quelldatei mit Temp übrschreiben ## } #------------------------------------------------------------------------------ # Daten aus der Datei holen function get_data( $lockfile_name, ## Qualifizierter Dateiname $recsize, ## Datensatzgröße &$recno, ## Physische Satznummer beginnt bei 1 &$error_no ## durchgeschleifte Fehlernummer ) { if ($error_no > 0) return false; if ($recno < -1) { $error_no = 23; ## Satznummer zu klein return false; } if ($recno == 0) { $recno = 1; ## erten Satz anzeigen } $fh = softlock($lockfile_name,'R',$lastmodified,$error_no); if ($error_no > 0) { return false; } ### hier Kopf beschaffen und Länge des Kopfes bestimmen $offset = 0; $len = filesize($lockfile_name); if (($len-$offset) == 0) { fclose($fh); $recno = 1; ## der erste Satz ist fällig $error_no = 4; ## File enthält keine Daten return false; } if (($len-$offset) % $recsize > 0) ## Satzformat passt nicht { fclose($fh); $error_no = 22; ## Fehler beim Satzformat return false; } if ($recno == -1) ## Letzter Satz angefordert { $recno = ($len-$offset)/$recsize; } $recpos = ($recno-1)*$recsize+$offset; ## Satzbeginn berechnen if ($recpos >= $len) ## eof erreicht { $error_no = 21; ## Satznummer zu groß $recno = ($len-$offset)/$recsize + 1; ## neue Datensatznummer ausrechnen fclose($fh); return false; } $seek_ok = fseek($fh,$recpos,SEEK_SET); ## Satzanfang einstellen $_record['timestamp'] = $lastmodified; $_record['buffer'] = fread($fh,$recsize); if (strlen($_record['buffer']) < $recsize) { $error_no = 31; ## Fehler beim Lesen fclose($fh); return false; } fclose($fh); ## Datei schließen return $_record; ## Daten zurückliefern } #------------------------------------------------------------------------------ # Funktion put_data() #------------------------------------------------------------------------------ # Die Funktion übernimmt einen Satzpuffer und versucht die Daten in einer # Datei abzuspeichern. dabei wird beachtet, ob das letzte Speicherdatum # nicht neuer ist, als das Holdatum der veränderten Daten. # Im Fehlerfall werden die Daten nicht gespeichert, sondern stattdessen die # aktuellen Daten im Subarray ['get'] zurückgeliefert. # Ist die Satznummer -1, wird der Satz angefügt. In $recno steht dann # anschließend die neue Satznummer # # $_record['put']['buffer'] ## abzuspeichernde Daten # ['timestamp'] ## Timestamp vom Lesen # $_record['get']['buffer'] ## in der Datei vorhande Daten # ['timestamp'] ## aktueller Timestamp # Der Datenoffset der Datei muss noch berücksichtigt werden # Der Datenbereich beginnt in der esten Zeile nach dem letzten # am Zeilenanfang function put_data( $lockfile_name, ## Qualifizierter Dateiname $recsize, ## Datensatzgröße &$_record, ## Datensatzbuffer zum Abspeichern &$recno, ## Physische Satznummer beginnt bei 1 &$error_no ## durchgeschleifte Fehlernummer ) { if ($error_no > 0) return false; if (!isset($_record['put']['buffer'])) { $error_no = 100; ## falsche Funktionsbenutzung return false; } $fh = softlock($lockfile_name,'C',$_record['get']['timestamp'],$error_no); if (($error_no != 8) and ($error_no > 0)) ## Touch() ist erlaubt { return false; } # hier Offsetberechnung $offset = 0; if ($recsize != strlen($_record['put']['buffer'])) ## Länge des Record { $error = 11; ## Datenformat ist falsch fclose($fh); return false; } $len = filesize($lockfile_name); ## Dateigröße besorgen $recpos = ($recno-1)*$recsize + $offset;## Satzbeginn berechnen if ((($len-$offset) % $recsize) > 0) ## Satzlänge passt nicht zur Datei { fclose($fh); $error_no = 22; return $_record; } # $recpos = ($recno-1)*$recsize; ## Satzbeginn berechnen if ($recpos > $len) { fclose($fh); $error_no = 21; ## Satznummer zu groß return false; } if (($recno === 0) or ($recpos == $len))## Insert-Modus { $seek_ok = fseek($fh,0,SEEK_END); ## Dateiende einstellen $recno = (ftell($fh)-$offset)/$recsize + 1; ## Datensatznummer ausrechnen $write_len = fwrite($fh,$_record['put']['buffer'],$recsize); if (strlen($_record['put']['buffer']) < $write_len) { $error_no = 32; ## Fehler beim Schreiben fclose($fh); return false; } unset($_record['put']); } else { $seek_ok = fseek($fh,$recpos,SEEK_SET); ## Satzanfang einstellen if (!isset($_record['put']['timestamp']) or ($_record['get']['timestamp'] != $_record['put']['timestamp'])) { $_record['get']['buffer'] = fread($fh,$recsize); $error_no = 33; ## Write Conflict Error fclose($fh); return false; } $write_len = fwrite($fh,$_record['put']['buffer'],$recsize); if (strlen($_record['put']['buffer']) < $write_len) { $error_no = 32; ## Fehler beim Schreiben fclose($fh); return false; } } fclose($fh); ## Datei schließen $_record=array(); ## bei Erfolg Leeres Array zurückgeben return true; ## Alle Daten verarbeitet } #------------------------------------------------------------------------------ function make_out_table($_data,$_format,$disabled='disabled') { $out_table ="\n"; $out_table .= " \n"; $out_table .= " \n"; $out_table .= " \n"; $out_table .= " \n"; $_color = array('#AAFFEE','#AAEEFF'); $count=0; ## Zähler für Farbe if (is_array($_format)) { if (!is_array($_data)) { $_data = array(); } foreach ($_format['fields']['name'] as $key => $val) { if (!isset($_data[$val])) { $_data[$val] = ''; } $count++; $out_table .= " \n"; if(isset($_format['fields']['caption'][$key])) { $caption = htmlentities($_format['fields']['caption'][$key]); } else { $caption = htmlentities($val); } $name = $_format['fields']['name'][$key]; switch (strtolower($_format['fields']['type'][$key])) { case 'int': $out_table .= " \n"; $out_table .= " \n"; break; case 'string': $out_table .= " \n"; $out_table .= " \n"; break; case 'memo': $out_table .= " \n"; $out_table .= " \n"; break; case 'email': $out_table .= " \n"; $out_table .= " \n"; break; case 'url': $out_table .= " \n"; $out_table .= " \n"; break; default: $out_table .= " \n"; $out_table .= " \n"; } # switch type $out_table .= " \n"; } } else { $out_table .= " \n"; $out_table .= " \n"; $out_table .= " \n"; $out_table .= " \n"; } $out_table .="
FeldnameDaten
$caption$caption$caption
\n(maximal
\n". $_format['fields']['len'][$key]." Zeichen)
$caption$caption$caption
keine (weiteren) Daten
\n"; return $out_table; } #------------------------------------------------------------------------------ function make_buttons($mode,$_userdata) { $btn = ''; $btn .= "\n"; $btn .= "\n"; $btn .= "\n"; $btn .= "\n"; $btn .= "\n"; $btn .= "\n"; $btn .= "\n"; return $btn; } #------------------------------------------------------------------------------ function strip($_data) { if (!get_magic_quotes_gpc()) { return $_data; } if (is_array($_data)) { foreach($_data as $key => $val) { $_data[$key] = strip($val); } } else { $_data = stripslashes($_data); } return $_data; } #------------------------------------------------------------------------------ function get_rec($stream,$_format) { $_values = array(); if (strlen($stream) != get_recsize($_format)) return false; $start = 0; foreach($_format['fields']['len'] as $key => $val) { $_values[$_format['fields']['name'][$key]] = trim(substr($stream,$start,$val)); $start += $val; } return $_values; } #------------------------------------------------------------------------------ function get_recsize($_record) { if (!is_array($_record['fields']['len'])) return false; $len = array_sum($_record['fields']['len']); return $len; } #------------------------------------------------------------------------------ function get_stream($_record,$recsize,$_format) { $stream = ''; foreach ($_format['fields']['name'] as $key => $val) { if (!isset($_record[$val])) { $_record[$val] = ""; } $val = str_pad(substr(trim($_record[$val]),0,$_format['fields']['len'][$key]),$_format['fields']['len'][$key],chr(0)); $stream .= $val; } if (strlen($stream) != $recsize) return false; return $stream; } #------------------------------------------------------------------------------ # main - Berechnung der Ausgaben #------------------------------------------------------------------------------ if (isset($_POST['data'])) { $_POST['data'] = strip($_POST['data']); if (isset($_POST['ctrl']['recno'])) { $recno = intval($_POST['ctrl']['recno']); } } if (isset($_POST['btn']['prev'])) { $recno--; if ($recno < 1) $recno = 1; $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); } elseif (isset($_POST['btn']['bof'])) { $recno = 1; $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); } elseif (isset($_POST['btn']['eof'])) { $recno = -1; $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); } elseif (isset($_POST['btn']['next'])) { $recno++; $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); } elseif (isset($_POST['btn']['insert'])) { $recno = 0; $_data['put']['buffer'] = get_stream($_POST['data'],$recsize,$_format); put_data( $dateiname, ## Qualifizierter Dateiname $recsize, ## Datensatzgröße $_data, ## Datensatzbuffer zum Abspeichern $recno, ## Physische Satznummer beginnt bei 1 $error_no ## durchgeschleifte Fehlernummer ); } elseif (isset($_POST['btn']['update'])) { if (isset($_POST['ctrl']['timestamp'])) { $_data['put']['timestamp'] = $_POST['ctrl']['timestamp']; } else { $_data['put']['timestamp'] = 0; } $_data['put']['buffer'] = get_stream($_POST['data'],$recsize,$_format); put_data( $dateiname, ## Qualifizierter Dateiname $recsize, ## Datensatzgröße $_data, ## Datensatzbuffer zum Abspeichern $recno, ## Physische Satznummer beginnt bei 1 $error_no ## durchgeschleifte Fehlernummer ); } else { $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); } if (isset($_GET['debug'])) { $debug = "debug: $error_no
"; $debug .= nl2br(var_export($_data,true)); } switch ($error_no) { case 0: $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); $out = make_out_table(get_rec($_data['get']['buffer'],$_format),$_format,''); $btn = make_buttons(1,1); $info = "Satznummer: $recno | Stand ".date('d.m.Y H:i:s',$_data['get']['timestamp']); break; case 8: $_data['get'] = get_data($dateiname,$recsize,$recno,$error_no); #$out = make_out_table(get_rec($_data['get']['buffer'],$_format),$_format,''); #$_data['get']['timestamp']=0; $out = make_out_table($_POST['data'],$_format,''); $btn = make_buttons(1,1); $info = "Datei wurde mit touch() angelegt, bitte nochmals speichern: neu/$recno"; break; case 21: $out = make_out_table(false,$_format,''); $info = "Dateiende erreicht neu/$recno"; $btn = make_buttons(1,1); break; case 2: case 4: $out = make_out_table(false,$_format,''); #$recno = 0; $btn = make_buttons(1,1); $msg = "Noch keine Daten vorhanden"; break; case 33: $your = make_out_table(get_rec($_data['put']['buffer'],$_format),$_format,'disabled'); $out = make_out_table(get_rec($_data['get']['buffer'],$_format),$_format,''); $btn = make_buttons(1,1); $msg = "Die Datei wurde zwischenzeitlich geändert"; $info = "Satznummer: $recno | Stand ".date('d.m.Y H:i:s',$_data['get']['timestamp']); break; default: $msg = "Dateien konnten nicht angelegt werden. Es ist Fehler $error_no aufgetreten!"; $btn = make_buttons(1,1); $out = $out = make_out_table(false,$_format,''); #$out .= "
\n".print_r($_data,true);
           #$out .= "Satznummer: $recno
\n"; } ## hier fehlt Funktion make_controls() $controls = ""; $controls .= ""; ############################################################################### # HTML output ############################################################################### ?> Adressverwaltung
aktuelle Daten aus der Datei
 
0) { echo "

$info

"; } echo $controls; if (strlen($msg)>0) { echo "

$msg

"; } if (isset($debug)) { echo "

$debug

"; } ?>

Valid HTML 4.01! Valid CSS!