Thomas: Apache-Logeinträge unterdrücken?

Hi there

Ich habe mit/bei meinen Perl-Skripts eine logische Sperre in der DB eingebaut: D.h. ich mache ein Insert in eine spezielle Tabelle - funktioniert er gibts ab jetzt (bis zum delete) ein lock, funktioniert er nicht (duplicate blabla) ist er schon gelockt.

soweit so gut, funktioniert alles einwandfrei, nur wird mir so das apache-error-logfile mit "...duplicate..." zugespammt. gibts eine möglichkeit wie man das verhindern kann, oder muss ich damit leben?

Gruss
Thomas

  1. Hallo Thomas,

    sehr dünne Information. Welche DB? Duplicate was? Eine unique ID, die du zweimal zu verwenden versuchst? (Warum benutzt du nich Datenbank eigene Methoden, um deine "logische Sperre" zu realisieren?)
    Welches Programm genau schreibt denn die unerwünschten Logeinträge? Da es im error_log von Apache landet würde ich an erster Stelle dein eigenes Perl Skript vermuten, dass eine Fehlermeldung von der Datenbank an den error_log weiter gibt. Ein Codeschnipsel wäre vielleicht hilfreich.

    Gruß,
    Cruz

  2. Hallo,

    ... nur wird mir so das apache-error-logfile mit "...duplicate..." zugespammt. gibts eine möglichkeit wie man das verhindern kann, oder muss ich damit leben?

    Wenn Du mit DBI arbeitest, dann solltest Du Dir die Attribute PrintError bzw. PrintWarn ansehen, die es u.a. beim Database-Handle gibt. Allenfalls ist auch RaiseError von Interesse.

    Aber da Du ja nicht genau sagst, wie Du das gemacht hast (Code-Schnipsel), ist das alles nur eine Herumraterei.

    Grüße
      Klaus

    1. Wenn Du mit DBI arbeitest, dann solltest Du Dir die Attribute PrintError bzw. PrintWarn ansehen, die es u.a. beim Database-Handle gibt. Allenfalls ist auch RaiseError von Interesse.

      RaiseError brauch ich schon, damit das script nicht abschmiert.
      hier der spameintrag:
      myscript.cgi: DBD::mysql::db do failed: Duplicate entry 'id-6' for key 1 at ../mymodule.pm line 597.

      das mit den attributen könnte hilfreich sein. wo finde ich da eine beschreibung? im dbi-modul wird nur von RaiseError geschrieben :(

      Aber da Du ja nicht genau sagst, wie Du das gemacht hast (Code-Schnipsel), ist das alles nur eine Herumraterei.

      #--------------------------------------------------------------------------------

      db_lock

      #--------------------------------------------------------------------------------
      sub db_lock
      {
          my $tabelle = shift;
          my $wert    = shift;
          my $check   = shift;

      local $dbh->{RaiseError};
          my $statement = "insert into lhb_lock
                           (tabelle,    wert,    id,  datneu)
                           values
                           ('$tabelle', '$wert', $id, SYSDATE())";

      my $rv = $dbh->do($statement);
          return $rv if $rv || defined($check);

      my $time1 = time() + 180;
          my $count = 0;
          until ($rv || ($time1 < time()))
              {
              $count++;
              sleep(0.1 * $count**1.5);
              $rv = $dbh->do($statement);
              }

      unless ($rv)
              {
              dblog("Fehler beim locken von $tabelle $wert", 1);
              get_tmpl('dummy');
              $html->param(text => 'Es ist ein schwerwiegender Fehler aufgetreten!');
              end_script;
              #stop_all(1, "Wegen technischen Problemen");
              }
      }

      #--------------------------------------------------------------------------------

      db_unlock

      #--------------------------------------------------------------------------------
      sub db_unlock
      {
          my $tabelle = shift;
          my $wert    = shift;

      $dbh->do("delete from lhb_lock where tabelle = '$tabelle' and wert = '$wert'");
      }