Wann wird con_sequence weitergezählt?

Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Wann wird con_sequence weitergezählt?

Beitrag von Oldperl »

Ich habe einen Mandanten mit dem Script mandant_copy.php kopiert und hatte dabei folgendes Problem. Nach dem Kopieren wollte ich ein neues Modul anlegen und bekam dabei die Fehlermeldung das ein Eintrag mit dieser idmod bereits in con_mod existiere.

Also habe ich mir das Datenbankmodell geschnappt und dort gesehen, das die Tabellenindizes in der Tabelle con_sequence hochgezählt werden.

Nun wüßt ich schon gerne ob das irgendwo automatisch geschieht oder ob ich das selber machen muß :?:

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Unter contenido\tools gibt es eine updateseq usw.-Datei. Einfach über den Browser aufrufen und die con_sequence ist up to date.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Sobald du die Funktion nextid der Klasse DB_Contenido verwendest, wird die Sequence hochgezählt. Machst du in der Datenbank manuell updates, mußt du das Script updateseqruntime.php ausführen.
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

hmm, nun hab ich ja nix von Hand gemacht, sondern mit dem Copy-Script. Das heißt also ich muß beim Eintragen in die Datenbank über ein Script

Code: Alles auswählen

$db-->nextid()
sagen und dann sollte aufwärts gezählt werden.

Na dann schau ich mir das mal im Script an.

thx erst mal euch Beiden :)
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

nein. Immer wenn ein neuer Eintrag in eine Tabelle eingetragen werden soll, muß dieser über $db->nextid($tabellenname) erfragt werden. Siehe auch http://www.sanisoft.com/phplib/manual/DB_SqlMethods.php
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

Aha :idea:

das heißt man sollte diese mandant_copy.php mal an diese internen Funktionen anpassen. Dort wird eine selbstgebaute Funktion verwenden.

Code: Alles auswählen

// simple function to update con_sequence
function updateSequence($table=false) {

    global $db, $cfg;
    if (!$table) {
        $sql = "SHOW TABLES";
        $db->query($sql);
        while ($db->next_record())
        {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
        }
    } else {
        dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);
    }
}
und bei jeder Datenbankfunktion aufgerufen.

wenn ich das jetzt richtig verstanden habe sollte dann ein Query so aussehen

Code: Alles auswählen

$sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." (idcatart, idcat, idart, is_start) VALUES ('".$db->nextid($cfg["tab"]["cat_art"])."', '$idcat', '$new_idart', '0')";
und $db->nextid wird hier anstelle des autoincrement von MySQL verwendet?
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

genau.
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

einen hab ich noch :roll:

die Contenido-Version steht in $cfg['version']?
Ist das Format in allen Versionen das gleiche, also z.B. "4.5.3 Beta", mit der Versionsnummer direkt am Anfang vom String?
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

die Version ist einfach ein String - sollte daher nicht für Prüfungen verwendet werden
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

Oldperl hat geschrieben:das heißt man sollte diese mandant_copy.php mal an diese internen Funktionen anpassen. Dort wird eine selbstgebaute Funktion verwenden....
ähm ist leider falsch...

die routine verwendet an sich die interne contenido funktion aus includes/functions.database.php -> dbUpdateSequence
*** make your own tools (wishlist :: thx)
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

@timo

Wie könnte ich dann auf die Contenido-Version prüfen? Gibts da noch eine Variable wo die Version drin steht?

@emergence
Hmm, ist das dann als Sicherung eingebaut falls die Funktion nicht da ist oder ist diese Funktion kopiert aus functions.database.php?
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

Oldperl hat geschrieben:@emergence
Hmm, ist das dann als Sicherung eingebaut falls die Funktion nicht da ist oder ist diese Funktion kopiert aus functions.database.php?
sie ist nicht als sicherung eingebaut...
und sie ist keine kopie der funktion aus functions.database.php

sie ist eine abgewandelte version dessen was in updateseqruntime.php zu finden ist.
mit dem unterschied eine tabelle dezitiert angeben zu können...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ich hab da noch ne anmerkung zum mandanten kopieren script...
und zwar warum dort nicht $db->nextid(XXX) verwendet wird

in den einzelnen schleifen in dem mehre sql inserts erzeugt werden wird einfach der ursprüngliche ausgelesene id wert um eins erhöht...
am ende der schleife wird erst der wert in der con_sequence korrigiert...

zb:

Code: Alles auswählen

$sql = "SELECT * FROM ".$cfg["tab"]["mod"]." where idclient=".$old_idclient;
...
$db->query($sql);
...
$MyModSeq = getSequenceId($cfg["tab"]["mod"]);
while($db->next_record())
{
...
    $MyModSeq++; /* erhöhe um 1 */
}
...

updateSequence($cfg["tab"]["mod"]);
die getSequenceId macht nichts anderes wie den gespeicherten wert in der con_sequence auszulesen. der gespeicherte wert ändert sich dadurch nicht... (zumindestens war es in der 4.4.5 nicht nötig den wert zu erhöhen
die dbUpdateSequence speicherte den um eins erhöhten wert in der con_sequence)

erst am ende der schleife wird der con_sequence eintrag upgedatet...

ich schätze einfach mal das $db->nextid() deshalb nicht innerhalb der schleifen verwendet wird, da ansonsten die while schleife abgebrochen werden würde, bzw/oder man müsste eine eigene db instanz verwenden damit dies nicht passiert...

das script ist in dieser jetzigen form aber sicher schneller in der ausführung...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

jetzt hab ich endlich des rätsels lösung

das ganze hängt eigentlich mit einem bug in der 4.4.x serie zusammen...
der nicht ganz korrekt gelöst wurde...

da muss ich jetzt etwas ausholen... der name der spalte nextid in der con_sequence in der momentan verwendung ist leider nicht korrekt...

die con_sequence sollte auf alle fälle den wirklichen nextid wert speichern...
in der 4.4.x serie hat das die function dbUpdateSequence auch korrekt gehandhabt...

der fehler hätte somit in der db_mysql.inc gefixt werden müssen...

die function nextid müsste den ausgelesen wert zurückliefern und den um eins erhöhten wert in der con_sequence updaten... (nicht umgekehrt)

da in der 4.4.x serie beides der fall war wurde zb beim mandanten nicht die id 2 verwendet sondern 3...

an der funktionsweise ändert sich durch die vertauschte logik in weiterer folge aber nichts...

das mandanten script ging somit immer davon aus das die nextid wirklich die nextid ist... (was in der 4.5.x serie aber nicht stimmt)

da müsste timo noch etwas dazu sagen, ob das auf die richtige logik korrigiert werden sollte...

auf der anderen seite kann man natürlich auch sagen die nextid ist der letzte verwendete wert(ab der 4.5.x), ließt man in direkt aus und möchte diesen wert weiter verwenden(für ein insert) muss man die nextid um eins erhöhen...
*** make your own tools (wishlist :: thx)
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

naja all das ist ja unnötig, da man immer die Funktion nextid verwenden sollte...sprich: Die Funktion nextid definiert, wie der Eintrag bei nextid auszusehen hat....mehr kann ich dazu aber auch nicht sagen
Gesperrt