Seite 1 von 1

Tabelle con_container_conf ist riesig groß

Verfasst: Mo 6. Dez 2004, 08:50
von greyman
Hallo,

warum ist die Tabelle "con_container_conf" so riesig groß (7600 Zeilen bei 4 Layots mit je 20 Containern, 1 Mandant, ca. 30 Module)?

Gibt es eine Möglichkeit diese Tabelle zu verschlanken oder wird alles in dieser Tabelle benötigt?

Ich verwende Contenido 4.4

greyman

Verfasst: Mo 6. Dez 2004, 09:32
von timo
ja, es wird vermutlich alles in der Tabelle benötigt. Warum möchtest du diese unbedingt verkleinern?

Verfasst: Mo 6. Dez 2004, 09:57
von greyman
Weil diese Tabelle con_container_conf die Hälfte des mysql-dump ausmacht und ich den gesamten dump nicht über phpmyadmin zurücksichern kann (Fehlermeldung wegen Zeitüberschreitung). Ich muß immer die Tabelle con_container_conf einzeln zurücksichern.

Aber wenn es nicht anders geht, kann ich damit leben. Ist eben ein bischen lästig.

greyman

Verfasst: Mo 6. Dez 2004, 10:00
von emergence
ja diese möglichkeit gibt es... ich hab da mal ein script geschrieben das die unnötigen einträge rausfiltert und entsprechend löscht...

ich muss es nur noch finden, dann poste ich es hier...
wäre auch möglich das es damals bei meinem hd crash ins nirvana verschwunden ist ;-)

Verfasst: Mo 6. Dez 2004, 10:20
von greyman
Suche sowirst du finden!

Verfasst: Mo 6. Dez 2004, 10:46
von emergence
am besten auszuführen via snippets...
für das script übernehme ich keine verantwortung, also backup nicht vergessen... wenn dann was nicht geht nicht mein problem...
das script ist nur private zwecke gedacht und für private zwecke frei verfügbar...

am beginn des scripts befindet sich der parameter das die queries ausgeführt werden... dieser ist standardmäßig deaktiviert

bei

Code: Alles auswählen

/* GLOBAL CONFIGURATION */
$execute_cleanup = true;
gesetzt, führt die aufräum aktion ohne rücksicht auf verluste aus...

Code: Alles auswählen

<div style="font-family: verdana, helvetica, arial, geneva, sans-serif; font-size:11; color:#000000;">
<p><b>TEMPLATE CONF STATUS CHECK v0.0.1</b></p>
<p>Warning: high risk operation -> make a mysql dump before you proceed.</p>
<?php

/* GLOBAL CONFIGURATION */
$execute_cleanup = false; // execute cleanup querys
$execute_query_msg = true; // show success messages

/* PARTS */
$template_cleanup_lost_idtplcfg = true; // search for unused template configuration
$template_missing_idtplcfg = true; // search for missing template configuration in template_conf

/* SAFE MODE */

if (!$execute_cleanup) {
  echo "SAFE MODE: no statements will be executed!<br>";
}

/* FUNCTIONS */
function get_used_idtplcfg ($include_con_tpl = true) {

  global $cfg,$db;

  $used_idtplcfg = array();
  $found = false;

  $sql = "SELECT idtplcfg FROM ".$cfg[tab][cat_lang]."";

  $db->query($sql);

  while ($db->next_record()) {
     $found = true;
     if (!in_array ($db->f("idtplcfg"), $used_idtplcfg))
     $used_idtplcfg[] = $db->f("idtplcfg");
  }

  $sql = "SELECT idtplcfg FROM ".$cfg[tab][art_lang]."";

  $db->query($sql);

  while ($db->next_record()) {
     if (!in_array ($db->f("idtplcfg"), $used_idtplcfg) && $db->f("idtplcfg") != 0) { // 0 means article uses category configuration
       $found = true;
       $used_idtplcfg[] = $db->f("idtplcfg");
     }
  }

  if ($include_con_tpl) {

  $sql = "SELECT idtplcfg FROM ".$cfg[tab][tpl]."";

  $db->query($sql);

  while ($db->next_record()) {
     $found = true;
     if (!in_array ($db->f("idtplcfg"), $used_idtplcfg))
     $used_idtplcfg[] = $db->f("idtplcfg");
  }

  }

  if ($found) {
    return $used_idtplcfg;
  } else {
    return false;
  }

}

function get_unused_container_cfg ($used_idtplcfg) {

  if (!is_array($used_idtplcfg)) return false;

  global $cfg,$db;

  $myfirst = true;
  $sqlpart = "";
  foreach ($used_idtplcfg as $used) {
    if ($myfirst) { $myfirst = false; } else { $sqlpart .= " AND "; }
      $sqlpart .= "idtplcfg != ".$used;
  }

  unset($used_idtplcfg);

  $unused_idtplcfg = array();

  $sql = "SELECT idtplcfg FROM ".$cfg[tab][container_conf]." WHERE ".$sqlpart."";

  $db->query($sql);

  $found = false;
  while ($db->next_record()) {
     $found = true;
     if (!in_array ($db->f("idtplcfg"), $unused_idtplcfg))
       $unused_idtplcfg[] = $db->f("idtplcfg");
  }

  if ($found) {
    return $unused_idtplcfg;
  } else {
    return false;
  }

}

function get_unused_template_cfg ($used_idtplcfg) {

  if (!is_array($used_idtplcfg)) return false;

  global $cfg,$db;

  $myfirst = true;
  $sqlpart = "";
  foreach ($used_idtplcfg as $used) {
    if ($myfirst) { $myfirst = false; } else { $sqlpart .= " AND "; }
      $sqlpart .= "idtplcfg != ".$used;
  }

  unset($used_idtplcfg);

  $unused_idtplcfg = array();

  $sql = "SELECT idtplcfg FROM ".$cfg[tab][tpl_conf]." WHERE ".$sqlpart."";

  $db->query($sql);

  $found = false;
  while ($db->next_record()) {
     $found = true;
     if (!in_array ($db->f("idtplcfg"), $unused_idtplcfg))
       $unused_idtplcfg[] = $db->f("idtplcfg");
  }

  if ($found) {
    return $unused_idtplcfg;
  } else {
    return false;
  }

}

function execute_query ($sql, $show=true) {

   global $db, $cfg, $execute_cleanup;

      if ($execute_cleanup) {
        if ($db->query($sql)) {
          if ($show)
            echo "<span style=\"color:green\">EXECUTED:</span> ".$sql."<br>";
        } else {
          if ($show)
            echo "<span style=\"color:red\">FAILED:</span>".$sql."<br>";
        }
      } else {
        echo $sql.";<br>\n";
      }

}

function get_missing_template_cfg ($include_con_tpl = false) {

  global $db, $cfg;

  if (!$include_con_tpl) {

  $sql = "SELECT idtplcfg,idtpl,created FROM ".$cfg[tab][tpl]."";

  $db->query($sql);

  $used_idtplcfg = array();

  while ($db->next_record()) {
     if (trim($db->f("idtplcfg"))!="")  { // no pre configurated parameters
       $used_idtplcfg[] = $db->f("idtplcfg").";".$db->f("idtpl").";".$db->f("created");
     }
  }

  }  else {

  $used_idtplcfg = $include_con_tpl; // we use this array if it is set

  }

  $found = false;
  foreach ($used_idtplcfg as $idtplcfg) {
  if (!$include_con_tpl) { $temp = explode (";" , $idtplcfg); } else $temp[0] = $idtplcfg;
     $sql = "SELECT idtpl FROM ".$cfg[tab][tpl_conf]." WHERE idtplcfg = '".$temp[0]."'";
     $db->query($sql);
     if (!$db->next_record()) {
        $found = true;
        $missing_idtplcfg[] = $idtplcfg;
     }
  }

  if ($found) {
    return $missing_idtplcfg;
  } else {
    return false;
  }

}

/* CHECK FOR UNUSED TEMPLATE CONFIGURATION DATA */
if ($template_cleanup_lost_idtplcfg) {

echo "<b>CHECKING FOR LOST TEMPLATE CONFIGURATION</b><br>";

$used_idtplcfg = get_used_idtplcfg(); // get all used idtplcfg

if ($used_idtplcfg) { // show nothing
  $useless_container_cfg = get_unused_container_cfg($used_idtplcfg);
  $useless_template_cfg = get_unused_template_cfg($used_idtplcfg);
} else {
  echo "?? no used idtplcfg found ??<br>checked ".$cfg[tab][cat_lang].",".$cfg[tab][art_lang]." and ".$cfg[tab][tpl].".<br>there should be no risk in truncate ".$cfg[tab][container_conf]." and ".$cfg[tab][tpl_conf]."<br>\n";
  $sql = "TRUNCATE ".$cfg[tab][container_conf]."";
  execute_query($sql,$execute_query_msg);

  $sql = "TRUNCATE ".$cfg[tab][tpl_conf]."";
  execute_query($sql,$execute_query_msg);
}

if ($useless_container_cfg) {
    echo "trash found in container_conf * Cleanup:<br>";
    foreach ($useless_container_cfg as $unused_idtplcfg) {
      $sql = "DELETE FROM ".$cfg[tab][container_conf]." WHERE idtplcfg='".$unused_idtplcfg."'";
      execute_query($sql,$execute_query_msg);
    }
} else {
    echo "".$cfg[tab][container_conf]." ok<br>";
}
if ($useless_template_cfg) {
    echo "trash found in template_conf * Cleanup:<br>";
    foreach ($useless_template_cfg as $unused_idtplcfg) {
      $sql = "DELETE FROM ".$cfg[tab][tpl_conf]." WHERE idtplcfg='".$unused_idtplcfg."'";
      execute_query($sql,$execute_query_msg);
    }
} else {
    echo "".$cfg[tab][tpl_conf]." ok<br>";
}

}
/* END UNUSED TEMPLATE CONFIGURATION DATA */


/* CHECK FOR MISSING TEMPLATE_CONF */
if ($template_missing_idtplcfg) {

echo "<b>CHECKING FOR MISSING TEMPLATE_CONF DATA</b><br>";

echo "STEP 1: checking information found in ".$cfg[tab][tpl]."<br>\n";
$missing_template_cfg = get_missing_template_cfg ();
if ($missing_template_cfg) {
  echo "template_conf entry missing<br>\n";
  echo count($missing_template_cfg)." missing object(s) found<br>\n";
    foreach ($missing_template_cfg as $missing_idtplcfg) {
      $temp = explode (";",$missing_idtplcfg);

      $execute_missing_element_query = false;

      $sql = "SELECT idtplcfg FROM ".$cfg[tab][cat_lang]." WHERE idtplcfg = '".$temp[0]."'";
      $db->query($sql);
      if (!$db->next_record()) {
        echo "notice: ".$cfg[tab][cat_lang]." - idtplcfg value ".$temp[0]." not found!<br>\n";
      } else {
        echo "info: some elements in ".$cfg[tab][cat_lang]." use this idtplcfg<br>\n";
        $execute_missing_element_query = true;
      }

      $sql = "SELECT idtplcfg FROM ".$cfg[tab][art_lang]." WHERE idtplcfg = '".$temp[0]."'";
      $db->query($sql);
      if (!$db->next_record()) {
        echo "notice: ".$cfg[tab][art_lang]." - idtplcfg value ".$temp[0]." not found!<br>\n";
      } else {
        echo "info: some elements in ".$cfg[tab][art_lang]." use this idtplcfg<br>\n";
        $execute_missing_element_query = true;
      }

      if ($execute_missing_element_query) { // then this statement is needed

        $sql = "INSERT INTO ".$cfg[tab][tpl_conf]." (idtplcfg,idtpl,`status`,created,lastmodified) VALUES ('".$temp[0]."','".$temp[1]."','0','".$temp[2]."','')";
        execute_query($sql,$execute_query_msg);

      } else {
        echo "no need to insert ".$cfg[tab][tpl_conf]." value: ".$temp[0]."<br>\n";
      }

      unset($execute_missing_element_query);

    }

} else {
  echo "".$cfg[tab][tpl]." entries are correct insert in ".$cfg[tab][tpl_conf]."<br>\n";
}

echo "STEP 2: checking information found in ".$cfg[tab][art_lang]." and ".$cfg[tab][cat_lang]."<br>\n";

$used_idtplcfg = get_used_idtplcfg(false); // get all used idtplcfg in art_lang and cat_lang
$missing_template_cfg = get_missing_template_cfg ($used_idtplcfg);
if($missing_template_cfg) {
  echo "error: this is bad, missing configuration found"; // should never happen... this should have been corrected in STEP 1
} else {
  echo "".$cfg[tab][art_lang]." and ".$cfg[tab][cat_lang]." entries are correct insert in ".$cfg[tab][tpl_conf]."<br>\n";

}

}

?>
<p>Copyright 2004 Dayside.net</p>
</div><br>
lauffähig sollte es sein ab version 4.4.x aufwärts...

Verfasst: Mo 6. Dez 2004, 12:53
von greyman
Erst mal Danke für das Script!
Von wo aus starte ich dieses Script (Snippets sagt mir jetzt nichts) und in welches Verzeichnis lege ich es auf den Server?

greyman

Verfasst: Mo 6. Dez 2004, 13:09
von emergence
such im forum nach snippets...
das script kannst du dort einsetzen...
zweite möglichkeit in einem modul outputbereich...

Verfasst: Di 7. Dez 2004, 06:16
von greyman
Tolles Script! Mein SQL-Dump ist nicht mal mehr halb sogroß wie vorher und alles funktioniert noch.

Nochmals vielen Dank!

greyman

Verfasst: Sa 26. Feb 2005, 14:10
von m.wohlers
Hallo emergence, hallo timo!
emergence hat geschrieben:am besten auszuführen via snippets...
für das script übernehme ich keine verantwortung, also backup nicht vergessen... wenn dann was nicht geht nicht mein problem...
das script ist nur private zwecke gedacht und für private zwecke frei verfügbar...

am beginn des scripts befindet sich der parameter das die queries ausgeführt werden... dieser ist standardmäßig deaktiviert

lauffähig sollte es sein ab version 4.4.x aufwärts...
Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?

Und evtl. auch, wie es zu diesen vielen (unnötigen) Einträgen kommt?

Vielleicht wäre es in diesem Kontext generell mal eine Idee, eine "Validate/Repair Database"-Funktionalität zur Verfügung zu stellen, um verwaiste Einträge und sonstige Unstimmigkeiten zu entdecken und zu eliminieren. Ist zwar bei weitem nicht trivial doch sicherlich eine gute Sache...

Verfasst: Sa 26. Feb 2005, 14:26
von emergence
m.wohlers hat geschrieben:Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?
ich hab das script mal für private zwecke geschrieben um besser debuggen zu können bzw um das system besser zu verstehen... einen teil der probleme wurde bereits im cvs head behoben... es bleiben aber intressanter weise noch immer genügen einträge zurück... warum auch immer... das komplett zu bereinigen nimmt sicher ne menge zeit in anspruch die ich einfach nicht habe...
m.wohlers hat geschrieben:Und evtl. auch, wie es zu diesen vielen (unnötigen) Einträgen kommt?
nicht wirklich...
m.wohlers hat geschrieben:Vielleicht wäre es in diesem Kontext generell mal eine Idee, eine "Validate/Repair Database"-Funktionalität zur Verfügung zu stellen, um verwaiste Einträge und sonstige Unstimmigkeiten zu entdecken und zu eliminieren. Ist zwar bei weitem nicht trivial doch sicherlich eine gute Sache...
ich bin eher der meinung das diese fehler im core code behoben werden sollten, damit es gar nicht zu den unnötigen einträgen kommt...
man müsste das ganze system umbauen damit mal ne vereinheitlichung zustande kommt...
die ganzen template und container sql queries sind in knapp 20-30 funktionen quer über das ganze system verteilt... (ziemlich ähnlich wie es bei den rechten war...)

Verfasst: Sa 26. Feb 2005, 15:00
von m.wohlers
Hallo emergence!

Danke für die schnelle Antwort und Dein Engagement... das sollt man mal irgendwie würdigen... zum Denkmal bauen fehlt mir aber das Talent :)
emergence hat geschrieben:
m.wohlers hat geschrieben:Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?
ich hab das script mal für private zwecke geschrieben um besser debuggen zu können bzw um das system besser zu verstehen... einen teil der probleme wurde bereits im cvs head behoben... es bleiben aber intressanter weise noch immer genügen einträge zurück... warum auch immer... das komplett zu bereinigen nimmt sicher ne menge zeit in anspruch die ich einfach nicht habe...
m.wohlers hat geschrieben:Und evtl. auch, wie es zu diesen vielen (unnötigen) Einträgen kommt?
nicht wirklich...
m.wohlers hat geschrieben:Vielleicht wäre es in diesem Kontext generell mal eine Idee, eine "Validate/Repair Database"-Funktionalität zur Verfügung zu stellen, um verwaiste Einträge und sonstige Unstimmigkeiten zu entdecken und zu eliminieren. Ist zwar bei weitem nicht trivial doch sicherlich eine gute Sache...
ich bin eher der meinung das diese fehler im core code behoben werden sollten, damit es gar nicht zu den unnötigen einträgen kommt...
man müsste das ganze system umbauen damit mal ne vereinheitlichung zustande kommt...
die ganzen template und container sql queries sind in knapp 20-30 funktionen quer über das ganze system verteilt... (ziemlich ähnlich wie es bei den rechten war...)
Ja, klar... aber (wie man auch an den mannigfalten CVS-Commits Anfang diesen Jahres sieht) scheint man das bei 4FB auch erkannt zu haben... zumindest scheint eine gewisse Konsolidierung und Vereinheitlichung an Bedeutung zu gewinnen!

Ich hoffe dann mal (ganz eigennützig), daß das in absehbarer Zeit geschafft wird...

PS: Sofern meine Zeit ausreicht, werde ich mich auch aktiv daran beteiligen!

Verfasst: Sa 26. Feb 2005, 15:37
von Halchteranerin
m.wohlers hat geschrieben:zum Denkmal bauen fehlt mir aber das Talent :)
Reicht das erstmal? :lol: Denkmal fuer emergence

Verfasst: Sa 26. Feb 2005, 17:31
von emergence
:lol: 8)