[GORM] Fehler mit BIT-Feldern

Das Forum ist für das Melden von Bugs gedacht. // This forum is intended to report bugs with the APF.
Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

[GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 09.11.2009, 13:13:30

Moin!

Ich arbeite gerade an einem Verwaltungs-Script für mein Projekt, bei dem eine Tabelle mit einem BIT(7)-Feld gefüllt werden muss. Hierbei kommt es dann zu einem Fehler, wenn ich über GORM den Datensatz speichern will:

Code: Alles auswählen

Error! 

Error-ID: e624d7ee5693d722b4b0e0aa188cca1b 
Message: [MySQLxHandler->executeTextStatement()] (1406) Data too long for column 'Weekdays' at row 1 (Statement: INSERT INTO ent_capacity (Holiday, Weekdays, StartDate, StartTime, StopTime) VALUES ('TRUE', '1111100', '2010-02-01', '00:00:00', '02:30:00');) 
Number: 1024 
File: C:\WAMP\data\httpd\__apf_dyndns\Apf\core\database\MySQLxHandler.php 
Line: 332 
Grund hierfür ist ein fehlendes "b" vor dem '1111100', da es sich hierbei um eine Binärzahl handelt. Gibt es hier einen funktionsfähigen Workaround? Wenn nein: Bitte irgendwann korrigieren!
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 09.11.2009, 13:46:52

Hallo Lutz,

kannst du in deiner Applikation kein "b" vorne anhängen (z.B. in der Business-Komponente)?
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 09.11.2009, 21:05:37

Ich hatte noch keine Zeit mich näher mit dem Problem zu befassen. Ich nutze halt den GORM, um den Datenbaum aufzubauen und habe daher keine eigene Schnittstelle programmiert. Deshalb kann ich zu deiner Idee noch nichts genaues sagen. Aber wäre es nicht besser von vornherein im GORM die Unterstützung für BIT-Felder zu implementieren? Ich meine ich werde wohl kaum der Einzige sein, der das nutzt!?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.


Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 09.11.2009, 22:43:27

Ich nutze sie zum Beispiel (im aktuell betroffenen Ansatz) zur Speicherung von Tagen. Sprich ich habe Datensätze, bei denen ich angeben will, an welchen Wochentagen diese verfügbar sind. Hierfür arbeite ich mit BIT-Feldern, damit ich auf der einen Seite eine einfache Möglichkeit der Filterung habe (über BIT-Funktionen) und auf der anderen Seite eine einfache Darstellung für PMA bieten kann. Außerdem ergibt sich mit einem einzigen Byte (weil nur 7 Bit benötigt werden) die "kostengünstigste" Variante.

Dennoch sollte es grundsätzlich egal sein, wofür man ein BIT-Feld benutzt. Es ist ein Feature, das vorhanden ist und wenn das APF damit nicht umgehen kann, ist es - zumindest aus meiner Sicht - ein Bug. Statt dann darauf zu drängen, andere Möglichkeiten zu benutzen, sollte man meiner Meinung nach die Unterstützung nachrüsten. Ich werde mich morgen auch mal daran versuchen eine Alternative zu erarbeiten, damit das APF in dieser Hinsicht eine größere Kompatibilität besitzt :)
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 10.11.2009, 10:28:57

Hallo Lutz,

ich halte die Art der Speicherung zwar für konzeptionell nicht ganz ideal, aber ich werde mir ansehen, wie man das dem GORM beibringen kann. Kannst du mir bitte dein Tabellen-Setup und einen Beispiel-Aufruf des GORM posten? Danke!
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 10.11.2009, 11:12:57

Sicher ließe sich über die Verwendung eines BIT-Felds für diesen Zweck streiten, aber funktionieren tut es. Außerdem finde ich, dass diese Methode genau das wiederspiegelt, wofür BIT-Felder da sind. Ich brauchte halt 7 Felder mit je 2 Zuständen und dafür ist ein BIT-Feld eigentlich ideal. Man kann zwar auch mit Zahlenwerten arbeiten, aber das ist von der Darstellung her meiner Meinung nach unsauberer. Aber mir ist durchaus bewusst, dass die Meinungen da auseinander gehen können.

Trotzdem geht es ja nicht um die verwendete Implementierung, sondern um den Fehler allgemein, den das APF im Zusammenhang mit BIT-Feldern liefert. Deshalb sollten Diskussionen um das Für und Wider der BIT-Feld-Verwendung in diesem Einzelfall bitte außen vor bleiben oder in einem gesonderten Thread abgehandelt werden.

Code: Alles auswählen

[Capacity]
Weekdays  = "BIT(7) NOT NULL DEFAULT b'0000000'"
Die unwichtigen Felder habe ich mal rausgenommen.

Code: Alles auswählen

    $objectCapacity = new GenericDomainObject ('Capacity');

    //$objectCapacity->setProperty ('Weekdays',                                        // Hier fehlt ein Workaround für das APF bzgl. BIT-Felder
    //                              $objectModelCapacity->getAttribute ('Weekdays')    // Hier fehlt ein Workaround für das APF bzgl. BIT-Felder
    //                              );                                                 // Hier fehlt ein Workaround für das APF bzgl. BIT-Felder

    // Save Capacity and return the ID
    return $objectKapaLogMapper->saveObject ($objectCapacity);
Im Model steht entsprechend ein String mit 7 Zeichen (0 bzw. 1). Zum Beispiel: '1111100'
Ich habe die Zeilen noch auskommentiert, da aktuell die Funktion noch nicht gegeben ist und somit das Speichern genau dieses Wertes nicht möglich ist.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 11.11.2009, 09:52:11

Ich habe eine Lösung für das Problem gefunden, allerding prüft diese nicht explizit die Werte des Feldes. Da das aber auch bei anderen Feld-Typen nicht der Fall ist, sollte das kein großes Problem sein!? Jedenfalls funktioniert die Nutzung von BIT-Feldern auf diese Weise. Vielleicht kannst du das ja in das aktuelle Release bereits mit einfließen lassen!?

Änderungen in der Daten modules/genericormapper/data/GenericORMapper.php:

Code ab Zeile 269:

Code: Alles auswählen

               if(!in_array($propertyName,$attrExceptions)){
                  $names[] = $propertyName;
                  $values[] = ((stripos($this->__MappingTable[$objectName][$propertyName],'BIT')!==FALSE) ? 'b' : '').'\''.$propertyValue.'\'';
                // end if
               }
Code ab Zeile 294:

Code: Alles auswählen

               if(!in_array($propertyName,$attrExceptions)){
                  $queryParams[] = '`'.$propertyName.'` = '.((stripos($this->__MappingTable[$objectName][$propertyName],'BIT')!==FALSE) ? 'b' : '').'\''.$propertyValue.'\'';
                // end if
               }
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 11.11.2009, 12:53:11

Hallo Lutz,

du warst wieder mal schneller. :D Meine Idee, war die Maskierung nicht allein an Hand des Vorkommens von "BIT" vorzunehmen, sondern einen eigenen Datentypen dafür einzuführen ("BIT" ähnlich wie "TEXT"), und daran die maskierung fest zu machen. Das bedingt allerdings, dass man definiert, wie BIT-Felder im Setup/Update übersetzt werden.

Ist die oben gezeigte Vorgehensweise allgemeingültig für dich? Sprich wirst du immer etwas in der Art

Code: Alles auswählen

BIT(7) NOT NULL DEFAULT b'0000000'
haben? Sofern ja, lässt sich das sehr leicht prüfen und mit deinem Code plus Anpassungen am Setup/Update beheben.

Lass mich kurz wissen, ob das für dich OK ist, dann fließt das noch in 1.11 ein.
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 11.11.2009, 14:15:53

Ähm, naja... Zumindest die Anzahl BITs variiert je nach Anwendungsfall. Ich kann ja jetzt nicht sagen, dass ich immer nur 7 BIT benötige!? Von daher müsste es in der Definition eigentlich IMMER ein (n) geben und da fand ich die Suche nach "BIT" am sinnvollsten...
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 11.11.2009, 18:41:12

Hallo Lutz,

eine variable Anzahl ist klar (ohne wäre das sicher sinnlos ;) ), mir ging es mehr um die "DEFAULT"-Geschichte. Sprich: macht es Sinn, ein BIT-Feld immer per Sefault-Setup mit 0-Werten zu initialisieren?
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 11.11.2009, 19:55:18

Nein, mit Null-Werten wird es so oder so gefüllt werden. Das habe ich nur der Vollständigkeithalber mit eingetragen.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 11.11.2009, 23:21:36

Hallo Lutz,

ich habe im SVN nun die neue Version eingecheckt. Neben der Unterstützung eines BIT-Feldes wurde auch das SETUP angepasst. Hier wird die Angabe von

Code: Alles auswählen

BIT(7)
in die entsprechende MySQL-Anweisung übersetzt.

Sag mir kurz Bescheid, ob das so für dich verwendbar ist.
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von MrNiceGuy » 12.11.2009, 06:59:41

Ich teste das spätestens am Wochenende, da ich heute nicht die Zeit habe den Abgleich zu machen, aber danke soweit schonmal!

EDIT: Ich habe es doch schon vor dem Wochenende geschafft einen Abgleich zu machen.

Es läuft soweit alles, allerdings solltest du vielleicht die DEFAULT-Anweisung rausnehmen, denn ich sagte hier ja schon, dass eine Null-Füllung ohnehin Standard ist in MySQL. Außerdem ist die Anzahl der Nullen ja nur im Falle BIT(7) korrekt... Lass es lieber weg und gut is' :)

Ansonsten: VIelen Dank!
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4552
Registriert: 04.11.2007, 16:13:53

Re: [GORM] Fehler mit BIT-Feldern

Beitrag von dr.e. » 12.11.2009, 12:21:10

Hallo Lutz,

die Standard-Zuweistung war auch nur ein Beispiel. Im Code wird das Pattern

Code: Alles auswählen

BIT([0-9]+)
in

Code: Alles auswählen

BIT($1) NOT NULL DEFAULT b'0000000'
übersetzt. Und wo ich das gerade so schreibe: hier muss ich noch einen Fehler beseitigen, denn die Initialisierung ist noch falsch hinsichtlich der Anzahl der Bit-Felder. Das liefer ich nach.
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast