Tabelle con_container_conf ist riesig groß
Tabelle con_container_conf ist riesig groß
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
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
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
Aber wenn es nicht anders geht, kann ich damit leben. Ist eben ein bischen lästig.
greyman
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
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)
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
gesetzt, führt die aufräum aktion ohne rücksicht auf verluste aus...
lauffähig sollte es sein ab version 4.4.x aufwärts...
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;
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>
*** make your own tools (wishlist :: thx)
such im forum nach snippets...
das script kannst du dort einsetzen...
zweite möglichkeit in einem modul outputbereich...
das script kannst du dort einsetzen...
zweite möglichkeit in einem modul outputbereich...
*** make your own tools (wishlist :: thx)
Hallo emergence, hallo timo!
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...
Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?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...
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
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:Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?
nicht wirklich...m.wohlers hat geschrieben:Und evtl. auch, wie es zu diesen vielen (unnötigen) Einträgen kommt?
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...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...
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)
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
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!
Danke für die schnelle Antwort und Dein Engagement... das sollt man mal irgendwie würdigen... zum Denkmal bauen fehlt mir aber das Talent

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!emergence hat geschrieben: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:Gibt es inzwischen weitere Erkenntnisse, ob das Skript einwandfrei funktioniert?
nicht wirklich...m.wohlers hat geschrieben:Und evtl. auch, wie es zu diesen vielen (unnötigen) Einträgen kommt?
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...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...
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...)
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
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
Reicht das erstmal?m.wohlers hat geschrieben:zum Denkmal bauen fehlt mir aber das Talent
