Tabelle con_container_conf ist riesig groß

Gesperrt
greyman
Beiträge: 44
Registriert: Do 16. Sep 2004, 06:16
Kontaktdaten:

Tabelle con_container_conf ist riesig groß

Beitrag 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
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

ja, es wird vermutlich alles in der Tabelle benötigt. Warum möchtest du diese unbedingt verkleinern?
greyman
Beiträge: 44
Registriert: Do 16. Sep 2004, 06:16
Kontaktdaten:

Beitrag 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
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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 ;-)
*** make your own tools (wishlist :: thx)
greyman
Beiträge: 44
Registriert: Do 16. Sep 2004, 06:16
Kontaktdaten:

Beitrag von greyman »

Suche sowirst du finden!
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
greyman
Beiträge: 44
Registriert: Do 16. Sep 2004, 06:16
Kontaktdaten:

Beitrag 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
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

such im forum nach snippets...
das script kannst du dort einsetzen...
zweite möglichkeit in einem modul outputbereich...
*** make your own tools (wishlist :: thx)
greyman
Beiträge: 44
Registriert: Do 16. Sep 2004, 06:16
Kontaktdaten:

Beitrag von greyman »

Tolles Script! Mein SQL-Dump ist nicht mal mehr halb sogroß wie vorher und alles funktioniert noch.

Nochmals vielen Dank!

greyman
m.wohlers
Beiträge: 93
Registriert: Di 25. Mai 2004, 16:11
Wohnort: Bad Aibling
Kontaktdaten:

Beitrag 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...
Michael Wohlers
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...)
*** make your own tools (wishlist :: thx)
m.wohlers
Beiträge: 93
Registriert: Di 25. Mai 2004, 16:11
Wohnort: Bad Aibling
Kontaktdaten:

Beitrag 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!
Michael Wohlers
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

m.wohlers hat geschrieben:zum Denkmal bauen fehlt mir aber das Talent :)
Reicht das erstmal? :lol: Denkmal fuer emergence
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

:lol: 8)
*** make your own tools (wishlist :: thx)
Gesperrt