// SqlTable.cxx #include "dataset_sql/SqlTable.h" #include "dataset_sql/SqlQuery.h" using std::string; using std::map; using std::find; using std::vector; using dset::SqlQuery; using dset::SqlTable; //********************************************************************** // Local definitions. //********************************************************************** typedef SqlTable::Creator Creator; typedef map CreatorMap; typedef SqlTable::CreatorList CreatorList; typedef SqlTable::Callback Callback; typedef vector CallbackList; namespace { // Map of functions indexed by technology name. CreatorMap& creator_map() { static CreatorMap cmap; return cmap; } // List of known creators. CreatorList& creator_list() { static CreatorList clist; return clist; } // List of callbacks. CallbackList& callbacks() { static CallbackList val; return val; } } // end unnamed namespace //********************************************************************** // Static member functions. //********************************************************************** // Register a creator. int SqlTable::register_creator(string name, Creator pfun) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(name); if ( icre != cres.end() ) { if ( icre->second == pfun ) return 0; return 1; } if ( pfun == 0 ) return 2; cres[name] = pfun; creator_list().push_back(name); for ( CallbackList::const_iterator icb=callbacks().begin(); icb!=callbacks().end(); ++icb ) { (*icb)(name); } return 0; } //********************************************************************** // Create an SqlTable. SqlTable* SqlTable::create(string tech, string name) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(tech); if ( icre == cres.end() ) { return 0; } Creator cre = icre->second; SqlTable* ptable = cre(tech,name); return ptable; } //********************************************************************** // Return registered names. const CreatorList& SqlTable::creators() { return creator_list(); } //********************************************************************** // Return if a name is registered. bool SqlTable::has_creator(string tech) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(tech); return icre != cres.end(); } //********************************************************************** // Register a callback. int SqlTable::register_creator_callback(Callback pfun) { callbacks().push_back(pfun); return 0; } //********************************************************************** // Public members. //********************************************************************** // Constructor. SqlTable::SqlTable() { } //********************************************************************** // Destructor. SqlTable::~SqlTable() { }