From 5f4b3b776d030468879873d9849ac2c280374ef2 Mon Sep 17 00:00:00 2001 From: Duncan Mac-Vicar P Date: Fri, 13 Jan 2006 16:46:56 +0000 Subject: [PATCH] Implemented the generic interface and implemented the generic Resolvable store function. PersistentStorage backend; backend.storeObject(patch1); now, lets reimplement retrieve of objects, which is moving some code I have on test2.cc to the backend class. --- devel/devel.dmacvicar/Backend.h | 38 +++++++++++-- devel/devel.dmacvicar/PersistentStorage.cc | 31 +++++++++-- devel/devel.dmacvicar/PersistentStorage.h | 87 ++++++++++++++++++------------ devel/devel.dmacvicar/XMLFilesBackend.cc | 82 ++++++++++++++++------------ devel/devel.dmacvicar/XMLFilesBackend.h | 41 +++++++++++--- devel/devel.dmacvicar/serialize.cc | 40 +++++++++++--- devel/devel.dmacvicar/serialize.h | 15 ++++++ devel/devel.dmacvicar/test2.cc | 2 +- 8 files changed, 243 insertions(+), 93 deletions(-) diff --git a/devel/devel.dmacvicar/Backend.h b/devel/devel.dmacvicar/Backend.h index f6146a7..093d843 100644 --- a/devel/devel.dmacvicar/Backend.h +++ b/devel/devel.dmacvicar/Backend.h @@ -38,11 +38,39 @@ namespace zypp /** Dtor */ virtual ~Backend(); virtual void doTest() = 0; - virtual bool isDatabaseInitialized() = 0; - virtual void initDatabaseForFirstTime() = 0; - virtual void storePatch( Patch::Ptr p ) = 0; - virtual std::list installedPatches() = 0; - + + /** + * is the storage backend initialized + */ + virtual bool isBackendInitialized() = 0; + /** + * initialize the storage backend + */ + virtual void initBackend() = 0; + + /** + * Stores a Resolvable in the active backend. + */ + virtual void storeObject( Resolvable::Ptr resolvable ) = 0; + /** + * Deletes a Resolvable from the active backend. + */ + virtual void deleteObject( Resolvable::Ptr resolvable ) = 0; + + /** + * Query for installed Resolvables. + */ + virtual std::list storedObjects() = 0; + /** + * Query for installed Resolvables of a certain kind + */ + virtual std::list storedObjects(const Resolvable::Kind) = 0; + /** + * Query for installed Resolvables of a certain kind by name + * \a partial_match allows for text search. + */ + virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) = 0; + private: /** Pointer to implementation */ class Private; diff --git a/devel/devel.dmacvicar/PersistentStorage.cc b/devel/devel.dmacvicar/PersistentStorage.cc index 261f25c..6a53e02 100644 --- a/devel/devel.dmacvicar/PersistentStorage.cc +++ b/devel/devel.dmacvicar/PersistentStorage.cc @@ -73,15 +73,36 @@ void PersistentStorage::doTest() } void -PersistentStorage::storePatch( Patch::Ptr p ) +PersistentStorage::storeObject( Resolvable::Ptr resolvable ) { - d->backend->storePatch(p); + d->backend->storeObject(resolvable); } -std::list -PersistentStorage::installedPatches() +void +PersistentStorage::deleteObject( Resolvable::Ptr resolvable ) +{ + +} + + +std::list +PersistentStorage::storedObjects() +{ + return d->backend->storedObjects(); +} + +std::list +PersistentStorage::storedObjects(const Resolvable::Kind kind) +{ + //list::iterator it; + //it = find(nums.begin(), nums.end(), 3); // Search the list. + return d->backend->storedObjects(kind); +} + +std::list +PersistentStorage::storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match) { - return d->backend->installedPatches(); + return d->backend->storedObjects(kind, name, partial_match); } /****************************************************************** diff --git a/devel/devel.dmacvicar/PersistentStorage.h b/devel/devel.dmacvicar/PersistentStorage.h index 0973c6a..7865b80 100644 --- a/devel/devel.dmacvicar/PersistentStorage.h +++ b/devel/devel.dmacvicar/PersistentStorage.h @@ -22,40 +22,61 @@ /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - namespace storage - { ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - // - // CLASS NAME : PersistentStorage - // - /** */ - class PersistentStorage : public base::ReferenceCounted, private base::NonCopyable - { - friend std::ostream & operator<<( std::ostream & str, const PersistentStorage & obj ); - typedef intrusive_ptr Ptr; - typedef intrusive_ptr constPtr; - public: - /** Default ctor */ - PersistentStorage(); - /** Dtor */ - ~PersistentStorage(); - void doTest(); - void storePatch( Patch::Ptr p ); - std::list installedPatches(); - - private: - class Private; - Private *d; - }; - /////////////////////////////////////////////////////////////////// - /** \relates PersistentStorage Stream output */ - std::ostream & operator<<( std::ostream & str, const PersistentStorage & obj ); + /////////////////////////////////////////////////////////////////// + namespace storage + { ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + // + // CLASS NAME : PersistentStorage + // + /** */ + class PersistentStorage : public base::ReferenceCounted, private base::NonCopyable + { + friend std::ostream & operator<<( std::ostream & str, const PersistentStorage & obj ); + typedef intrusive_ptr Ptr; + typedef intrusive_ptr constPtr; + public: + /** Default ctor */ + PersistentStorage(); + /** Dtor */ + ~PersistentStorage(); + void doTest(); - ///////////////////////////////////////////////////////////////// - } // namespace devel.dmacvicar - /////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////// + public: + /** + * Stores a Resolvable in the active backend. + */ + void storeObject( Resolvable::Ptr resolvable ); + /** + * Deletes a Resolvable from the active backend. + */ + void deleteObject( Resolvable::Ptr resolvable ); + /** + * Query for installed Resolvables. + */ + std::list storedObjects(); + /** + * Query for installed Resolvables of a certain kind. + */ + std::list storedObjects(const Resolvable::Kind kind); + /** + * Query for installed Resolvables of a certain kind by name + * \a partial_match allows for text search. + */ + std::list storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match = false); + + private: + class Private; + Private *d; + }; + /////////////////////////////////////////////////////////////////// + /** \relates PersistentStorage Stream output */ + std::ostream & operator<<( std::ostream & str, const PersistentStorage & obj ); + + ///////////////////////////////////////////////////////////////// + } // namespace devel.dmacvicar + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// } // namespace devel /////////////////////////////////////////////////////////////////// #endif // DEVEL_DEVEL_DMACVICAR_PERSISTENTSTORAGE_H diff --git a/devel/devel.dmacvicar/XMLFilesBackend.cc b/devel/devel.dmacvicar/XMLFilesBackend.cc index fb7e6ad..b824f6b 100644 --- a/devel/devel.dmacvicar/XMLFilesBackend.cc +++ b/devel/devel.dmacvicar/XMLFilesBackend.cc @@ -61,11 +61,12 @@ class XMLFilesBackend::Private XMLFilesBackend::XMLFilesBackend() { // check if the db exists - if (!isDatabaseInitialized()) + if (!isBackendInitialized()) { DBG << "Database not initialized" << std::endl; - initDatabaseForFirstTime(); - if (!isDatabaseInitialized()) + initBackend(); + // should be initialized now... + if (!isBackendInitialized()) DBG << "Error, cant init database" << std::endl; else DBG << "Database initialized" << std::endl; @@ -76,14 +77,15 @@ XMLFilesBackend::XMLFilesBackend() } } + bool -XMLFilesBackend::isDatabaseInitialized() +XMLFilesBackend::isBackendInitialized() { return exists( ZYPP_DB_DIR ); } void -XMLFilesBackend::initDatabaseForFirstTime() +XMLFilesBackend::initBackend() { // FIXME duncan * handle exceptions DBG << "Creating directory structure..." << std::endl; @@ -93,48 +95,60 @@ XMLFilesBackend::initDatabaseForFirstTime() create_directory( path(ZYPP_DB_DIR) / path("products") ); } -std::string -XMLFilesBackend::randomFileName() const +void +XMLFilesBackend::storeObject( Resolvable::Ptr resolvable ) { - FILE *fp; - char puffer[49]; - if ( (fp = popen("openssl rand -base64 48", "r")) == 0) - { - DBG << "mierda!" << std::endl; - //ZYPP_THROW("put some message here"); - } - fscanf(fp, "%s", &puffer); - pclose(fp); - return "blah"; + std::string xml = castedToXML(resolvable); + std::string filename; + DBG << std::endl << xml << std::endl; + std::ofstream file; + // FIXME replace with path class of boost + filename += std::string(ZYPP_DB_DIR); + filename += "/"; + filename += typeToString(resolvable, true); + filename += "/"; + filename += resolvable->name(); + DBG << filename << std::endl; + file.open(filename.c_str()); + file << xml; + file.close(); } -std::string XMLFilesBackend::fileNameForPatch( Patch::Ptr patch ) const +void +XMLFilesBackend::deleteObject( Resolvable::Ptr resolvable ) +{} + +std::list +XMLFilesBackend::storedObjects() { - return patch->id(); + return std::list(); } -std::list -XMLFilesBackend::installedPatches() +std::list +XMLFilesBackend::storedObjects(const Resolvable::Kind) { - return std::list(); + return storedObjects(); } -void -XMLFilesBackend::storePatch( Patch::Ptr p ) +std::list +XMLFilesBackend::storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match) { - std::string xml = toXML(p); - DBG << std::endl << xml << std::endl; - std::ofstream file; - // FIXME replace with path class of boost - file.open( (std::string(ZYPP_DB_DIR) + std::string("/patches/") + fileNameForPatch(p)).c_str() ); - file << xml; - file.close(); + return storedObjects(); } -void -XMLFilesBackend::insertTest() +std::string +XMLFilesBackend::randomFileName() const { - + FILE *fp; + char puffer[49]; + if ( (fp = popen("openssl rand -base64 48", "r")) == 0) + { + DBG << "mierda!" << std::endl; + //ZYPP_THROW("put some message here"); + } + fscanf(fp, "%s", &puffer); + pclose(fp); + return "blah"; } /////////////////////////////////////////////////////////////////// diff --git a/devel/devel.dmacvicar/XMLFilesBackend.h b/devel/devel.dmacvicar/XMLFilesBackend.h index 2e63ea0..bc84ad5 100644 --- a/devel/devel.dmacvicar/XMLFilesBackend.h +++ b/devel/devel.dmacvicar/XMLFilesBackend.h @@ -40,15 +40,42 @@ public: XMLFilesBackend(); /** Dtor */ ~XMLFilesBackend(); - void doTest(); - bool isDatabaseInitialized(); - void initDatabaseForFirstTime(); + virtual void doTest(); - void insertTest(); + /** + * is the storage backend initialized + */ + virtual bool isBackendInitialized(); + /** + * initialize the storage backend + */ + virtual void initBackend(); + + /** + * Stores a Resolvable in the active backend. + */ + virtual void storeObject( Resolvable::Ptr resolvable ) ; + /** + * Deletes a Resolvable from the active backend. + */ + virtual void deleteObject( Resolvable::Ptr resolvable ); + /** + * Deletes a Resolvable from the active backend. + */ + virtual std::list storedObjects(); + /** + * Query for installed Resolvables of a certain kind + */ + virtual std::list storedObjects(const Resolvable::Kind); + /** + * Query for installed Resolvables of a certain kind by name + * \a partial_match allows for text search. + */ + virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false); + + protected: std::string randomFileName() const; - std::string fileNameForPatch( Patch::Ptr patch ) const; - void storePatch( Patch::Ptr p ); - std::list installedPatches(); + private: class Private; Private *d; diff --git a/devel/devel.dmacvicar/serialize.cc b/devel/devel.dmacvicar/serialize.cc index 32ab3b8..16ca46d 100644 --- a/devel/devel.dmacvicar/serialize.cc +++ b/devel/devel.dmacvicar/serialize.cc @@ -162,6 +162,8 @@ std::string toXML( Script::Ptr obj ) return out.str(); } + + template<> // or constPtr? std::string toXML( Message::Ptr obj ) { @@ -174,6 +176,35 @@ std::string toXML( Message::Ptr obj ) return out.str(); } +// or constPtr? +std::string castedToXML( Resolvable::Ptr resolvable ) +{ + stringstream out; + if ( isKind(resolvable) ) + out << toXML(asKind(resolvable)) << std::endl; + if ( isKind(resolvable) ) + out << toXML(asKind(resolvable)) << std::endl; + if ( isKind(resolvable) ) + out << toXML(asKind(resolvable)) << std::endl; + if ( isKind