Datenhaltung

Proggen.org - Lernprojekt: Duplikatefinder
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenhaltung

Beitrag von Xin » Sa Aug 14, 2010 12:58 pm

Ich bin derzeit mit der NCurses-GUI beschäftigt und wenn sich hier sonst niemand mehr meldet, dann muss dieses Thema warten, bis die NCurses GUI fertig ist (aktueller Stand ca. 20%)

Ich bin eben mal durch FileSearch durchgesteppt und finde da keine Verbindung zu den Hashs.

Ich möchte gerne eine FileInfo haben, der ich sagen kann "Serialisiere Dich mal auf diesen Stream", bzw. "Erstelle eine FileInfo aus diesem Stream" - inkl. der bekannten Hash-Werte.
Wie stehen die Möglichkeiten hier?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Datenhaltung

Beitrag von fat-lobyte » Sa Aug 14, 2010 5:50 pm

Xin hat geschrieben:Ich bin derzeit mit der NCurses-GUI beschäftigt und wenn sich hier sonst niemand mehr meldet, dann muss dieses Thema warten, bis die NCurses GUI fertig ist (aktueller Stand ca. 20%)

Ich bin eben mal durch FileSearch durchgesteppt und finde da keine Verbindung zu den Hashs.
Also das ist mir irgendwie auch schon aufgefallen. Wir haben eine Hash"bibliothek", ein Filesearch Modul das nur mit dem Scanner Funktioniert, eine einsame GUI,...

Wie soll das ganze eigentlich zusammenpassen? Wie sieht das mit den abhängigkeiten aus, wie mit den interfaces? Wer ruft was auf? Was darf eigene Threads starten, was nicht?

Ich habe es so verstanden, dass wir Sqlite verwenden wollen. Wie siehts da mit bibliotheken aus? Keine bibltiotheken und alles selbst coden? Oder Bibliotheken verwenden? Wenn ja, welche?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenhaltung

Beitrag von Xin » Sa Aug 14, 2010 7:04 pm

fat-lobyte hat geschrieben:
Xin hat geschrieben:Ich bin derzeit mit der NCurses-GUI beschäftigt und wenn sich hier sonst niemand mehr meldet, dann muss dieses Thema warten, bis die NCurses GUI fertig ist (aktueller Stand ca. 20%)

Ich bin eben mal durch FileSearch durchgesteppt und finde da keine Verbindung zu den Hashs.
Also das ist mir irgendwie auch schon aufgefallen. Wir haben eine Hash"bibliothek", ein Filesearch Modul das nur mit dem Scanner Funktioniert, eine einsame GUI,...
Das ist ja kein Problem.

Das FileSearch-Modul soll beim durchlaufen der Directories eine Callback-Funktion pro File aufrufen, das ist so wie ich das sehe nicht implementiert, aber wohl kaum ein nennenswertes Problem.
Hier wird das File um den Hashwert erweitert.
fat-lobyte hat geschrieben:Wie soll das ganze eigentlich zusammenpassen? Wie sieht das mit den abhängigkeiten aus, wie mit den interfaces? Wer ruft was auf? Was darf eigene Threads starten, was nicht?
Momentan startet noch niemand eigene Threads.

Hashs sind unabhängig, FileSearch ist unabhängig, GUI ist unabhängig.
Was noch fehlt ist main.cpp, dass von allem Abhängig ist.
fat-lobyte hat geschrieben:Ich habe es so verstanden, dass wir Sqlite verwenden wollen. Wie siehts da mit bibliotheken aus? Keine bibltiotheken und alles selbst coden? Oder Bibliotheken verwenden? Wenn ja, welche?
Ich habe das so verstanden, dass Sqlite die Bibleothek ist, die wir verwenden werden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Datenhaltung

Beitrag von Bebu » Sa Aug 14, 2010 8:04 pm

Xin hat geschrieben:
Das FileSearch-Modul soll beim durchlaufen der Directories eine Callback-Funktion pro File aufrufen, das ist so wie ich das sehe nicht implementiert, aber wohl kaum ein nennenswertes Problem.
Hier wird das File um den Hashwert erweitert.
Macht das so überhaupt Sinn? Gehen wir mal von dem Fall aus, dass sich eine Datei vom letzten Indizierungsvorgang her bereits in der Datenbank befindet, samt Hashwert. Es würde wohl keinen Sinn machen, jedes Mal den Hash neu zu berechnen, ohne vorher z. B. zu überprüfen, ob sich das Änderungsdatum oder die Größe der Datei verändert hat. Wäre es nicht sinnvoller, jedes Modul in einer Kommandoklasse unterzubringen, die je nach dem, was bereits an Informationen über eine Datei vorhanden ist, die entsprechenden Module dafür aufruft? Das wäre insofern sinnvoll, weil das Indizieren relativ schnell geht, während das Hashen vergleichsweise lange dauert. Wenn ich jetzt was ganz falsch verstanden habe, dann klärt mich auf...
Xin hat geschrieben: Momentan startet noch niemand eigene Threads.
Falsch. Das Filesearchmodul startet in der aktuellen Form immer einen eigenen Thread, der so lange läuft, wie die Objektinstanz vorhanden ist.
fat-lobyte hat geschrieben:Ich habe es so verstanden, dass wir Sqlite verwenden wollen. Wie siehts da mit bibliotheken aus? Keine bibltiotheken und alles selbst coden? Oder Bibliotheken verwenden? Wenn ja, welche?
Sqlite stellt eine eigene Bibliothek zur Verfügung. Siehe hier: http://www.proggen.org/doku.php?id=dbs: ... e3:install
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Datenhaltung

Beitrag von Bebu » So Aug 15, 2010 8:03 pm

Ich werfe mal den vorhanden SQLite Wrapper in einen eigenen Branch für die Datenhaltung. Ich werde daraus mal versuchen eine Basisklasse zu erstellen, die ohne Boost auskommt. Daraus kann man dann eine spezialierte Klasse für unser Datenhaltung ableiten. Ich sage jetzt aber noch nicht zu, die zu erstellen, meine Zeit ist ziemlich knapp und die Dateisuche braucht auch noch eine Menge Feinschliff.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Datenhaltung

Beitrag von Bebu » Do Aug 19, 2010 8:30 am

Also, nachdem sich hier gerade überhaupt nichts rührt, schreibe ich mal wieder einen Kommentar ;)

Ich habe ja mal einen entsprechenden Branch hochgeladen, in dem der alte Sqlitewrapper aus dem Tutorial für Sqlite drinnen ist. Der setzt allerdings Elemente aus Boost ein. Um das auszugleichen, habe ich eine abstrakte Klasse Data erstellt und davon die Templateklasse Datavariant abgeleitet, um verschiedene Datentypen in einem STL-Container speichern zu können. Es gibt jetzt aber zwei Probleme: Erstens ist das mein erster Ausflug in die polymorphe Programmierung und ich bitte die Profis da mal drüber zu kucken und mich auf Fehler hinzuweisen. Zweitens muss ich auf einen dynamic_cast zurückgreifen, um meine Daten wieder herauszubekommen. Das ist unschön, aber mir fällt dafür auch keine andere Lösung ein. Hat jemand Vorschläge?

Wenn das DataVariant fertig ist, kann ich anfangen den Wrapper ernsthaft zu überarbeiten.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenhaltung

Beitrag von Xin » Do Aug 19, 2010 9:29 am

Bebu hat geschrieben:Also, nachdem sich hier gerade überhaupt nichts rührt, schreibe ich mal wieder einen Kommentar ;)
Joah, da ich wohl die #2 in Datenhaltung bin, hatte ich keine Neuigkeiten weil ich von Sonntag an krank war, aber trotzdem arbeiten ging. Ich bin zwar nicht im Stande klar zu denken, aber derzeit produziere ich - glaube ich - langsamen Fortschritt statt Fehler und das ist ja besser als gar kein Fortschritt.
Abends versuche ich dann meinen Computer wieder ans Laufen zu bekommen. Alles z. K. z. Z.
Bebu hat geschrieben:Ich habe ja mal einen entsprechenden Branch hochgeladen, in dem der alte Sqlitewrapper aus dem Tutorial für Sqlite drinnen ist. Der setzt allerdings Elemente aus Boost ein. Um das auszugleichen, habe ich eine abstrakte Klasse Data erstellt und davon die Templateklasse Datavariant abgeleitet, um verschiedene Datentypen in einem STL-Container speichern zu können.
Darf ich in den Branch rein und Dinge verändern?
Bebu hat geschrieben:Es gibt jetzt aber zwei Probleme: Erstens ist das mein erster Ausflug in die polymorphe Programmierung und ich bitte die Profis da mal drüber zu kucken und mich auf Fehler hinzuweisen. Zweitens muss ich auf einen dynamic_cast zurückgreifen, um meine Daten wieder herauszubekommen. Das ist unschön, aber mir fällt dafür auch keine andere Lösung ein. Hat jemand Vorschläge?
Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.

Dynamic_Cast ist unschön, wie jeder Cast unschön ist und lässt sich meist auch vermeiden. Allerdings ist er - sofern das Ergebnis auf NULL überprüft wird - soweit eigentlich sehr sicher.

Sobald ich wieder einen Entwicklungsrechner habe, komme ich dazu.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Datenhaltung

Beitrag von Bebu » Do Aug 19, 2010 9:58 am

Xin hat geschrieben: Joah, da ich wohl die #2 in Datenhaltung bin, hatte ich keine Neuigkeiten weil ich von Sonntag an krank war, aber trotzdem arbeiten ging. Ich bin zwar nicht im Stande klar zu denken, aber derzeit produziere ich - glaube ich - langsamen Fortschritt statt Fehler und das ist ja besser als gar kein Fortschritt.
Abends versuche ich dann meinen Computer wieder ans Laufen zu bekommen. Alles z. K. z. Z.
Du solltest dich lieber richtig auskurieren, statt in die Arbeit zu laufen und andere anzustecken. Das ist wesentlich sinnvoller und effizienter ;) Gute Besserung.
Xin hat geschrieben: Darf ich in den Branch rein und Dinge verändern?
Ja und nein. Am Wrapper kannst du gerne mit rumschrauben, Data und Datavariant lieber nicht. Das ist für mich eine ganz gute Übung und absolutes Neuland, das würde ich gerne selber hinkriegen. Über Tipps bin ich aber dankbar.
Xin hat geschrieben: Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.
Das habe ich versucht. Gibt es eine Möglichkeit, den Rückgabetypen einer solchen Methode mit zu überschreiben? Das Problem ist ja, das der Datentyp einfach alles sein kann.
Xin hat geschrieben: Dynamic_Cast ist unschön, wie jeder Cast unschön ist und lässt sich meist auch vermeiden. Allerdings ist er - sofern das Ergebnis auf NULL überprüft wird - soweit eigentlich sehr sicher.
Kuck mal in den Branch und dann freue ich mich über Vorschläge. ;)
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenhaltung

Beitrag von Xin » Do Aug 19, 2010 10:24 am

Bebu hat geschrieben:
Xin hat geschrieben: Joah, da ich wohl die #2 in Datenhaltung bin, hatte ich keine Neuigkeiten weil ich von Sonntag an krank war, aber trotzdem arbeiten ging. Ich bin zwar nicht im Stande klar zu denken, aber derzeit produziere ich - glaube ich - langsamen Fortschritt statt Fehler und das ist ja besser als gar kein Fortschritt.
Abends versuche ich dann meinen Computer wieder ans Laufen zu bekommen. Alles z. K. z. Z.
Du solltest dich lieber richtig auskurieren, statt in die Arbeit zu laufen und andere anzustecken. Das ist wesentlich sinnvoller und effizienter ;) Gute Besserung.
Vermutlich.
Aber das Produkt muss Ende September stehen und wenn das klappen soll, dann muss ich meine Krankheit auf Oktober verschieben. ;-)

Ich habe mir damals ausgesucht nicht am Fließband zu arbeiten - heißt, wenn ich krankmache, setzt sich keiner auf meinen Stuhl, die Arbeit bleibt liegen und wenn ich wieder gesund bin, kann ich mich dann im Oktober wegen Burnout behandeln lassen ;-)
Also lieber langsamer Fortschritt als Stillstand, bzw. ich mache halt Sachen, die jetzt nicht meine höchste Konzentration erfordern. "Fließbandarbeit" quasi ;-)
Hauptsache, es geht voran und wenn das Produkt raus ist, habe ich für dieses Jahr noch Urlaub... *freu*hüpf*yeah*
Bebu hat geschrieben:
Xin hat geschrieben: Darf ich in den Branch rein und Dinge verändern?
Ja und nein. Am Wrapper kannst du gerne mit rumschrauben, Data und Datavariant lieber nicht. Das ist für mich eine ganz gute Übung und absolutes Neuland, das würde ich gerne selber hinkriegen. Über Tipps bin ich aber dankbar.
Ok.
Bebu hat geschrieben:
Xin hat geschrieben:Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.
Das habe ich versucht. Gibt es eine Möglichkeit, den Rückgabetypen einer solchen Methode mit zu überschreiben? Das Problem ist ja, das der Datentyp einfach alles sein kann.
Was hast Du denn überhaupt für Daten, die da so schwer zu extrahieren sind?
Bebu hat geschrieben:
Xin hat geschrieben:Dynamic_Cast ist unschön, wie jeder Cast unschön ist und lässt sich meist auch vermeiden. Allerdings ist er - sofern das Ergebnis auf NULL überprüft wird - soweit eigentlich sehr sicher.
Kuck mal in den Branch und dann freue ich mich über Vorschläge. ;)
Wie gesagt... mein Arbeitsrechner läuft noch nicht.

Gestern, das eigentlich heute war, so gegen 4 Uhr habe ich den Spaß abgebrochen. Debian Squeeze läuft - aber nur wenn der DVI-Monitor nicht angeschlossen ist - und der eigene Kernel will noch nicht starten. Keine Ahnung weshalb, aber solange die Kiste nicht zuverlässig rennt, habe ich ein Problem.

Heute abend gehe ich erstmal joggen und sitze dann hoffentlich nicht mehr bis zum frühen morgen an der Kiste, sondern gehe wie ich es mir gestern eigentlich vorgenommen habe, mal früh ins Bett - also diesmal früh am Abend, nicht früh am Morgen ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Datenhaltung

Beitrag von Bebu » Do Aug 19, 2010 11:20 am

Ich setzte dir mal den betreffenden Header hier rein, dann ist es auch ohne Rechner möglich, ihn mal anzukucken.

Code: Alles auswählen

/*!
 * @file datavariant.h
 * @brief defines a class that can hold every datatype
 * @details
 * @author Bernhard Buchwinkler
 * @date august 2010
 */
#ifndef ORG_PROGGEN_DEDUPE_DATAVARIANT_H
#define ORG_PROGGEN_DEDUPE_DATAVARIANT_H

#include <typeinfo>
#include <string>

namespace Dedupe
{
  namespace Dataholding
  {
    namespace Variant
    {




      class Data
      {
        public:
        virtual const std::type_info & GetType() const = 0;
      };


      template<class T> class DataVariant : public Data
      {
        T HoldedData;

        public:
        DataVariant( T data ) : HoldedData( data ) {};


        virtual const std::type_info & GetType() const
        {
          const std::type_info &ti = typeid( HoldedData );

          return ti;
        }

        T GetData() const
        {
          return HoldedData;
        }
      };

      template<class T>
      T CastDataVariant( Data *incoming, T &returning )
      {
        //TODO include checks for incoming type and errors from the cast!

        DataVariant<T> *ptr = NULL;

        ptr = dynamic_cast<Dedupe::Dataholding::Variant::DataVariant<T> *>(incoming);

        returning = ptr->GetData();

        return returning;
      }
    }
  }
}
#endif
Das ganze ist für folgende Situation gedacht: Ich stelle eine SELECT Anfrage an SQLite und durchlaufe dann mit dem Wrapper die zurückgegebenen Werte. An dieser Stelle kann ich herausfinden, welchen SQLitedatentyp der Wert hat. Jetzt instanziere ich mit dem Template "Datavariant" die dazu passenden Klasse, die diesen Datentyp aufnehmen kann. Dann wird das ganze in diese Typen verfüllt:

Code: Alles auswählen

    typedef Dedupe::Dataholding::Variant::Data * Value;
    typedef std::map<std::string,Value> Row;
    typedef std::vector<Row> Result;
Weil ich ja vorher nicht wissen kann, was in der Datenbank ist, muss ich das ganze dynamisch erzeugen und kann überhaupt nicht vorhersagen, welcher Datentyp durch T im Template DataVariant gehalten wird. Daher die Frage, ob man den Datentyp in einer abstrakten Methode in einer Ableitung überschreiben kann.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten