Generische Datenbank Klasse
-
Hmm, ich designe gerade eine generische Datenbank-Klasse für mein Projekt um darin gewisse Dinge wie Shader oder auch Scripts zu speichern und auch später komplexere Dinge.
Nun habe ich einige konzeptionelle Schwierigkeiten.
Generell läuft das Erzeugen einer Datenbank so:NLSqlite db; db.openDatabase("database/test.db"); NLSQLTableDescriptor::TTableList lst; lst.push_back(NLSQLTableDescriptor("name", NLTT_TEXT|NLTT_UNIQUE|NLTT_PRIMARY)); lst.push_back(NLSQLTableDescriptor("fragment", NLTT_TEXT)); lst.push_back(NLSQLTableDescriptor("vertex", NLTT_TEXT)); db.createTable("shader", lst);In createTable werden die Parameter geprüft und dann entsprechend der SQL-String generiert.
So weit ganz gut.
Nun kommt aber das Problem bei einer Insert-Funktion.
Bei Insert schaut der String so aus:INSERT INTO tablename(field1, field2, fieldn) VALUES(value1, value2, valuen);
Jetzt brauche ich also eine Möglichkeit obiges um den Wert zu erweitern.
Erst ist mir boost::any eingefallen. Aber halt, da sind ja noch die Blobs. boost::any kann mit reinen "rohdaten" (unsigned byte) denke ich nicht umgehen.
Man könnte natürlich zur Klasse noch einen Zeiger auf ein u8 hinzufügen.
Als Beispiel so:class NLSQLTableDescriptor { public: typedef std::list<NLSQLTableDescriptor> TTableList; public: /// \brief Constructor NLEXPORT NLSQLTableDescriptor() {} /** * \brief Constructor with options * \param name The name of the field. * \param type The type of the field. * \see NLSQLFieldType for a description of the possible field-types. */ NLEXPORT NLSQLTableDescriptor(const std::string& name, long type) : m_name(name), m_type(type), m_hasValue(false) {} /** * \brief Constructor with options * \param name The name of the field. * \param type The type of the field. * \param value The value for the entry. * \see NLSQLFieldType for a description of the possible fields. */ NLEXPORT NLSQLTableDescriptor(const std::string& name, boost::any value, long type) : m_name(name), m_type(type), m_value(value), m_hasValue(true) {} /// \brief Returns the name of the field. NLEXPORT const std::string& getName() const { return m_name; } /// \brief Returns the type of the field. NLEXPORT const long getType() const { return m_type; } /// \brief Returns the value of the field. NLEXPORT const boost::any& getValue() const { return m_value; } /// \brief Returns if the object was created with a value or not. NLEXPORT const bool hasValue() const { return m_hasValue; } private: std::string m_name; long m_type; boost::any m_value; bool m_hasValue; u8* m_blob; };Ich hoffe man versteht was ich erreichen will. Das gleiche Problem trifft mich ja auch wieder, wenn ich Daten abhole aus der db.
-
Hm, hast du eine konkrete Frage? Also geht es darum, wie sich die Blobs mit boost::any realisieren lassen?