Datenbankzugriffskomponenten | BVA-System

Posts Tagged ‘Datenbankzugriffskomponenten’

Auf der Zielgeraden!

Freitag, März 27th, 2015

So langsam macht sich bei mir die Erleichterung breit, da ich gerade eben das komplette alte Modul, welches für die Worker-Datenbankfunktionen genutzt wurde, aus dem Projekt entfernt habe. Es sind nun also alle Datenbankfunktionen auf die generalisierten Datenbankkomponenten umgestellt. Die letzten beiden Tasks, der Bildimport und das Löschen von Bildern, waren allerdings noch zwei schwierige Baustellen. Beide Tasks bestehen aus einer Vielzahl von einzelnen SQL-Befehlen. Beim Bildimport kamen neben der Speicherung der ganzen Daten noch die automatischen Zuordnungen mit Hilfe des Entscheidungsbaumes dazu. Beim Löschen der Bilder liegt die Komplexität in der Aktualisierung der Schlagworte. Mit jedem gelöschten Bild muss die Schlagwortmatrix angepasst werden, damit die häufig zusammengenutzten Schlagworte auch weiterhin richtig ermittelt werden können.

BVASystem Version 2.2.1.97-dev

BVASystem Version 2.2.1.97-dev

Ausblick

In den nächsten Tagen werde ich versuchen, hier auf der Homepage eine BVASystem-Testdatenbank zu installieren. Außerdem möchte ich testen, ob die Datenbank korrekt angesprochen werden kann. Ich hoffe, das ich die zum Teil bisher ungetesteten WebDB-Funktionen korrekt umgesetzt habe. Sofern dem so ist, befinde ich mich jetzt auf der Zielgeraden und kann mich bald wieder anderen Dingen widmen. Und eins weiß ich jetzt schon, nach den umfangreichen internen Änderungen möchte ich jetzt unbedingt wieder etwas machen, wo man die Änderungen sofort erkennen kann.

Internas extrem … (Teil 2)

Donnerstag, März 5th, 2015

Durch die Konzentration auf die internen Umstellungen geht es echt viel schneller voran. Gestern Abend habe ich die Umstellung aller Schlagwort-Worker-Tasks auf die neuen Datenbankkomponenten fertiggestellt. Damit habe ich ein weiteres Zwischenziel erreicht. Es war also wieder einmal an der Zeit, eine neue Entwicklerversion zusammenzustellen. Übrig bleiben jetzt „nur“ noch die beiden komplexesten Tasks. Der Datenbankimport von Fotos und das Löschen von Bildern aus der Datenbank warten noch auf ihre Umsetzung. Und damit verbunden ist noch die Umstellung der automatischen Zuordnungen, welche direkt beim Bildimport mit ausgeführt wird.

Ich möchte heute hier den Versuch starten, euch zahlenmäßig näher zu bringen, wie groß die interne Umstellarbeit eigentlich gewesen ist und wie groß sie aktuell noch ist. Ich bin mir bewusst, das die folgenden Zahlen nicht sehr viel aussagen. Aber ich denke, das sie einem Laien doch helfen können, um sich die Umstellarbeiten besser vorzustellen. Bisher hatte ich alle Worker-Tasks in einem zentralen Datenmodul zusammengefasst, in dem die notwendigen Datenbankkomponenten integriert waren. Die dazugehörige Quelltextdatei war rund 120 kb groß und umfasste rund 2800 Quellcodezeilen. Nach der Umstellung befinden sich die Funktionen zwar immer noch an einer zentralen Stelle, aber da ich die Datenbankkomponenten nun bei Bedarf dynamisch erzeuge, brauche ich nun kein Datenmodul mehr. Es reicht eine einfache Klasse aus. Diese ist nun aktuell 24 kb groß und umfasst 800 Quellcodezeilen. Während das alte Datenmodul auf 60 kb und rund 1400 Quellcodezeilen zusammengeschmolzen ist. Ich habe also knapp die Hälfte geschafft und bisher meinen Quelltext um rund 600 Zeilen vereinfacht.

Internas extrem …

Montag, Februar 16th, 2015

Über die neue BVASystem Version, die ich heute online gestellt habe, gibt es eigentlich wenig zu berichten. Denn ich habe mich entschlossen, ausschließlich an den internen Änderungen zu arbeiten. Zum einen macht es mir aktuell richtig Spaß, die Worker-Tasks nach und nach auf die generalisierten Datenbankkomponenten umzustellen und zum zweiten bringt mich diese Vorgehensweise nun schneller zum eigentlichen Ziel. Sehr schön finde ich es, das ich bei der Umstellung einige Fehler finden konnte. Diese kamen zwar nur zum Tragen, wenn die Ausführung eines Tasks scheitert, aber sie führten dazu, das der Anwender unter Umständen gar nicht über den fehlgeschlagenen Task informiert werden würde.

Am meisten erfreut mich allerdings, das die neuen Implementationen viel kürzer und übersichtlicher sind. Bisher war für jede Ausführung eines SQL-Befehls folgende Befehlsfolge notwendig:

if QSelectData.Active then QSelectData.Close;

QSelectData.SQL.Clear;
QSelectData.SQL.Add(Format(CSELECT_KEYWORDS,[AImageID]));
QSelectData.Open;

Nun kann ich es bei einfachen Abfragen mit einer einzigen Zeile errreichen:
FCon.SelectList(ResultList,Format(CSELECT_KEYWORDS,[AImageID]),'CAPTION');

Brauche ich bei komplexeren Abfragen dann SQL-Parameter, werden es einige Zeilen mehr. Aber auch im alten Quelltextbeispiel sind die Parameter nicht enthalten.

Ausblick

Ich denke, das ich mit der Strategie, möglichst viele interne Änderungen abzuarbeiten, weitermachen werde. So langsam aber sicher möchte ich euch endlich die Demo-Datenbank zur Verfügung stellen können. Daher möchte ich den Zeitplan bis dorthin nicht noch unnötig mit vielen neuen Filtern aufblähen. Bisher habe ich alle Worker-Tasks der Fotoalben und der Schlagwortkategorien umgestellt. Weitermachen werde ich gleich mit den Tasks, die für die Speicherung von Metadaten benötigt werden. Anschließend werde ich mich daran setzen, die Schlagwort-Tasks umzustellen. Zum Schluss sind dann noch die wichtigsten Tasks zum Bildimport übrig.

Ansichtseinschränkung: Brennweite

Donnerstag, Oktober 9th, 2014

Für  die letzte Version des BVASystems hatte ich ja extra eine Komponente geschrieben, mit der ein Brennweiten-Bereich ausgewählt werden kann. Daher lag es nahe, diese Komponente nun ein zweites Mal einzusetzen. Nun findet sie bei der Definition der Ansichtseinschränkung nach der Brennweite ebenfalls Verwendung.

Ansichtseinschränkung Brennweite

Ansichtseinschränkung Brennweite

Die Festlegung der Einschränkung funktioniert genauso, wie bei den anderen Einschränkungen auch. Allerdings stehen diesmal andere Bedingungen zur Auswahl, denn ein „ist gleich“ und „ist ungleich“ macht keinen Sinn, wenn man einen Brennweitenbereich auswählen muss. Daher heißen die beiden Bedingungen, die zur Auswahl stehen, nun „zwischen“ und „nicht zwischen“.

Außerdem habe ich natürlich wieder viel Zeit in interne Umstellungen investiert, die man leider nicht direkt sehen kann. Der größte Brocken war dabei sicherlich die Umstellung der Bildlisten-Abfragen auf die generalisierten Datenbankkomponenten. Schwierig dabei war, das sich das Modul Ansichtseinschränkung, welches sich ja auf die Bildlisten auswirkt, nicht direkt in das neue Konzept integrieren ließ. Erst nach einigen Versuchen fand ich einen Weg, mit dem ich zufrieden bin.

Des weiteren habe ich Änderungen am Administrationstool vorgenommen. Dort habe ich die, zur Herstellung einer Datenbank notwendigen, Verbindungsbefehle erweitert. Es ist nun möglich, für das BVASystem die MySQL ODBC-Treiber in der Version 5.3.x zu benutzen. Auch habe ich gleich einen Verbindungsbefehl für meine selbst entwickelte WebDB eingepflegt. Bei der WebDB wird es allerdings nicht möglich sein, die Datenbankstruktur mit dem Administrationstool zu erstellen. Die notwendigen Scripte werden später Teil des WebDB-Paketes werden.

Für die nächste Version habe ich mir vorgenommen, die Umstellung auf die generalisierten Datenbankverbindungen soweit fertig zu stellen, das alle lesenden Zugriffe auf die Datenbank darüber durchgeführt werden. Damit Ihr dies dann auch möglichst zeitnah testen könnt, habe ich mir überlegt, einen Modus zu schaffen, in dem der Worker gezielt deaktiviert wird bzw. er keine Anfragen mehr annimmt die Änderungen an der Datenbank zum Ziel haben. Sobald ich dies fertig habe und gleichzeitig die Weiterentwicklung der WebDB noch ein Stückchen vorangetrieben habe, sollte es mir endlich möglich sein, euch eine Testdatenbank zur Verfügung zu stellen. Es wird dann also nicht mehr nötig sein, das ihr ein DBMS installieren müsst, um das BVASystem zu testen.

Unsichtbare Änderungen Teil 2

Montag, August 18th, 2014

Auch beim heutigen Versionsupdate spielt sich wieder ein Großteil der Änderungen im Hintergrund ab. Nachdem ich beim letzten mal die einfachsten Datenbankabfragen auf die neue Datenbankzugriffsschicht umgestellt wurden, habe ich mir dieses mal alle Datenbankabfragen, die zur Erstellung des Baumes auf der linken Seite der Anwendung benötigt werden, vorgenommen. Es werden nun also die Fotoalben, die Schlagwortkategorien und der Aufnahmedatumsbereich über die neue Datenbankzugriffsschicht abgefragt. Damit muss ich nun nur noch 3 Programmmodule umstellen: die Abfrage der Bildlisten, die Abfrage der Einzelbilder und alle Änderungsabfragen, die vom Worker durchgeführt werden. Gerade der letzte Teil bereitet mir noch einiges an Kopfzerbrechen, da meine selbst geschriebene Datenbankzugriffsschicht noch nicht in der Lage ist, Parameter in SQL-Befehlen zu benutzen.

Weiterhin habe ich vor einigen Tagen damit begonnen, etwas umzusetzen, was ich „WebDB“ getauft habe. Dies soll ein Webmodul, welches ich in PHP entwickele, werden. Es wird  zwischen der eigentlichen Datenbank und dem BVASystem geschaltet. Damit möchte ich erreichen, das die BVASystem Datenbank auch auf einem Webserver installiert werden kann, auf dem man das Administrator Kennwort zur MySQL Datenbank nicht hat. Generell stelle ich es mir so vor, das das BVASystem über eine Http-Anfrage Daten bei der WebDB anfordert. Diese führt die eigentliche SQL-Abfrage durch und liefert die Ergebnisse in Form einer XML-Datei an das BVASystem. Die Datenbank stellt die Daten dann so dar, als wenn eine direkte Verbindung zur Datenbank bestanden hätte. Ein weiterer schöner Nebeneffekt wird es sein, das ich euch damit eine Demo-Datenbank zur Verfügung stellen kann. Ich erhoffe mir, das es dadurch viel einfacher wird, das BVASystem zu testen. Eine lokale Installation eines Datenbankmanagementsystems würde für den Test nämlich entfallen.

Zu guter letzt habe ich natürlich auch wieder etwas sichtbares am System verändert. Es können nun Ansichtseinschränkungen nach der automatischen Bildbewertung gesetzt werden. Außerdem befindet sich nun oben rechts ein Informationsbild, welches darauf hinweist, das eine Ansichtseinschränkung aktiv ist. Damit ist nun auch bei der eingeklappten Ordneransicht erkennbar, ob eine Ansichtseinschränkung aktiv ist.

Hinweis auf aktive Ansichtseinschränkung

Hinweis auf aktive Ansichtseinschränkung

Unsichtbare Änderungen Teil 1

Donnerstag, Juli 31st, 2014

Mal wieder habe ich mit Änderungen an der Bilddatenbank begonnen, die man über einen längeren Zeitraum kaum bemerken wird. Dieses mal geht es um die Datenbankzugriffskomponenten. Bisher habe ich dort immer ADO-Komponenten eingesetzt, die per ODBC eine Datenbankverbindung ermöglichten. Wie ich damit begonnen habe SQLite im BVASystem zu integrieren bemerkte ich schnell, das ich dafür andere Komponenten benötige. Da ich allerdings nicht alles doppelt programmieren möchte, habe ich mir überlegt eine eigene Datenbankschnittstelle zu entwickeln, die auf beide Datenbanksysteme zugreifen kann.

Mittlerweile ist der lesende Datenbankzugriff über die neue Datenbankschnittstelle möglich und ich habe bereits einen kleinen Teil der Funktionen des BVASystems umgestellt. Die einfachen Abfragen, mit denen zum Beispiel die Auswahllisten gefüllt werden, werden jetzt über die die neue Datenbankschnittstelle durchgeführt. Eigentlich ist es etwas schade, das die SQLite Datenbank noch leer ist. Denn die umgestellten Abfragen könnten nun ohne weiteren Programmieraufwand auch über SQLite ausgeführt werden.

Ein weiteres Problem versuche ich bei der Umstellung gleich mitzulösen. Beim BVASystem ist es so, das jedes eigenständige Programmmodul eine eigene Datenbankverbindung besitzt, da die ADO-Komponenten sicht Thread-Safe sind. Nutzt man über mehrere Threads hinweg eine einzelne Datenbankverbindung kommt es zu unkontrollierbaren Programmabstürzen. Mein Problem dabei ist, das in unterschiedlichen Modulen teilweise gleiche Abfragen durchgeführt werden. Da die Module nichts voneinander wissen, habe ich die gleiche Funktionalität doppelt programmiert. Dies ist sehr unschön und soll daher nun durch eine zentralere Lösung ersetzt werden.

Ich habe damit begonnen, alle Datenbankfunktionen in nur einem Objekt zusammenzufassen. Die jeweiligen Programmmodule erhalten jeweils eine Instanz von diesem Objekt und sind somit in der Lage, alle Datenbankfunktionen auszuführen. Auch diese Zentralisierung habe ich in den letzten beiden Wochen für das erste Programmmodul umgesetzt. Die weiteren werden in den nächsten Versionen folgen.

Da ich allerdings überhaupt kein Freund davon bin, nur unsichtbare Programmänderungen umzusetzen, habe ich in den letzten Tagen noch eine schöne neue Funktion implementiert. Es ist nun möglich, die Ansicht auf die Datenbank nach der manuellen Bildbewertung auszuführen. Ab jetzt wird es nicht mehr so langwierig/langweilig, wenn man Freunden Urlaubsbilder zeigen möchte. Einfach die Einschränkung auf die am besten bewerteten Fotos setzen und schon sind die ganzen, nicht so schönen Bilder, nicht mehr sichtbar. Die neue Funktion kann, wie immer, natürlich mit der neuen Entwicklerversion getestet werden.

Ansichtseinschränkung Manuelle Bildbewertung

Ansichtseinschränkung Manuelle Bildbewertung