Datenhaltung
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Datenhaltung
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?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Datenhaltung
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,...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.
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.
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Datenhaltung
Das ist ja kein Problem.fat-lobyte hat geschrieben: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,...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.
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.
Momentan startet noch niemand eigene Threads.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?
Hashs sind unabhängig, FileSearch ist unabhängig, GUI ist unabhängig.
Was noch fehlt ist main.cpp, dass von allem Abhängig ist.
Ich habe das so verstanden, dass Sqlite die Bibleothek ist, die wir verwenden werden.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?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- 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
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:
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.
Falsch. Das Filesearchmodul startet in der aktuellen Form immer einen eigenen Thread, der so lange läuft, wie die Objektinstanz vorhanden ist.Xin hat geschrieben: Momentan startet noch niemand eigene Threads.
Sqlite stellt eine eigene Bibliothek zur Verfügung. Siehe hier: http://www.proggen.org/doku.php?id=dbs: ... e3:installfat-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?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
- 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
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!
- 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
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.
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!
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Datenhaltung
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.Bebu hat geschrieben:Also, nachdem sich hier gerade überhaupt nichts rührt, schreibe ich mal wieder einen Kommentar
Abends versuche ich dann meinen Computer wieder ans Laufen zu bekommen. Alles z. K. z. Z.
Darf ich in den Branch rein und Dinge verändern?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.
Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.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?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- 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
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: 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.
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: Darf ich in den Branch rein und Dinge verändern?
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: Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.
Kuck mal in den Branch und dann freue ich mich über Vorschläge.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.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Datenhaltung
Vermutlich.Bebu hat geschrieben: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: 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.
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*
Ok.Bebu hat geschrieben: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: Darf ich in den Branch rein und Dinge verändern?
Was hast Du denn überhaupt für Daten, die da so schwer zu extrahieren sind?Bebu hat geschrieben: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:Schreib eine abstrakte Methode Data gibDieDatenWiederHer() = 0.
Wie gesagt... mein Arbeitsrechner läuft noch nicht.Bebu hat geschrieben:Kuck mal in den Branch und dann freue ich mich über Vorschläge.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.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- 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
Ich setzte dir mal den betreffenden Header hier rein, dann ist es auch ohne Rechner möglich, ihn mal anzukucken.
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:
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.
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
Code: Alles auswählen
typedef Dedupe::Dataholding::Variant::Data * Value;
typedef std::map<std::string,Value> Row;
typedef std::vector<Row> Result;
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!