001
002
003
004
005
006
007 #include <iostream>
008
009 #include "DBManager/Result.hh"
010 #include "DBManager/Context.hh"
011 #include "DBManager/ConControl.hh"
012 #include "DBManager/Package.hh"
013 #include "DBManager/PackageManager.hh"
014 #include "DBManager/private/PackageMaster.hh"
015 #include "DBManager/private/Factory.hh"
016 #include "DBManager/private/Packages.hh"
017 #include "DBManager/TracerMacros.hh"
018 using namespace std;
019
020 namespace {
021
022 struct Defaults
023 {
024 static Defaults& instance();
025
026 string default_id;
027 string default_iomap_file;
028 };
029
030 Defaults& Defaults::instance() { static Defaults d; return d; }
031 }
032
033
034
035
036 void PackageManager::activityReport(std::ostream& ost) const
037 {
038 Packages::instance()->activityReport(ost);
039 }
040
041 void PackageManager::setIomapFile(const std::string& db)
042 {
043 Defaults::instance().default_iomap_file=db;
044 }
045
046 string PackageManager::defaultIomapFile()
047 {
048 Defaults& d = Defaults::instance();
049
050 if (d.default_iomap_file.empty()==true)
051 {
052 d.default_iomap_file = "NONE" ;
053 }
054 return d.default_iomap_file;
055 }
056
057 void PackageManager::setDefaultID(const std::string& db)
058 {
059 Defaults::instance().default_id=db;
060 }
061
062 string PackageManager::defaultID()
063 {
064 Defaults& d = Defaults::instance();
065
066 if(d.default_id.empty())
067 {
068 const IoEntry * e = ConControl::instance()->firstIOEntry();
069 if(e!=NULL)
070 return e->Id();
071 else
072 return "NONE";
073 }else
074 return d.default_id;
075 }
076
077 void PackageManager::makeAllPackages(const std::string& db)
078 {
079 DEBUG_MACRO("PackageManager::makeAllPackages:");
080 Package* pkg;
081 string fullid;
082 string curname;
083 const IoEntry* e = ConControl::instance()->find(db);
084 Packages* p = Packages::instance();
085 PackageFactory* fact = PackageFactory::instance();
086 PackageFactory::const_iterator fi = fact->begin();
087 string type = e->Type();
088
089 while(fi!=fact->end())
090 {
091 const RegistryNode* n = (*fi).second;
092 curname=n->name();
093 fullid = e->Id() + curname;
094 if(p->find(fullid)==0)
095 {
096
097
098
099
100 string::size_type sz = curname.size() - type.size();
101
102 if(curname.rfind(type) == sz)
103 {
104
105 string dname(curname,0,sz);
106
107 dbg_cerr << " dname= " << dname << " db=" << db << std::endl;
108
109
110 Context* c = new Context(e->Location(),type,curname,db,dname);
111
112
113
114
115
116
117
118
119
120
121 const IoEntry::ArgMap& dbargs = e->Arguments();
122 pair <IoEntry::ArgMap::const_iterator,
123 IoEntry::ArgMap::const_iterator> mp =
124 dbargs.equal_range("type");
125
126 for (IoEntry::ArgMap::const_iterator i = mp.first;
127 i != mp.second; ++i)
128 {
129 c->getTypeOptions().push_back(i->second);
130 }
131
132 mp = dbargs.equal_range("driver");
133
134 for (IoEntry::ArgMap::const_iterator i = mp.first;
135 i != mp.second; ++i)
136 c->getDriverOptions().push_back(i->second);
137
138 mp = dbargs.equal_range("mgr");
139
140 for (IoEntry::ArgMap::const_iterator i = mp.first;
141 i != mp.second; ++i)
142 c->getMgrOptions().push_back(i->second);
143
144 mp = dbargs.equal_range("user");
145
146 for (IoEntry::ArgMap::const_iterator i = mp.first;
147 i != mp.second; ++i)
148 c->getUserOptions().push_back(i->second);
149
150 dbg_cerr << " calling PackageFactory::make("
151 << n->name() << ",context)" << std::endl;
152
153 if((pkg=PackageFactory::make(n->name(),c)))
154 {
155 p->add(fullid,pkg);
156 p->addKeyed(pkg->notifyName(),pkg);
157 }
158 }
159 }
160
161 ++fi;
162 }
163 }
164
165 PackageManager::PackageManager() { }
166 PackageManager::~PackageManager() { }
167
168 void PackageManager::setCacheLength(int x)
169 {
170 Packages::instance()->setCacheLength(x);
171 }
172
173 void PackageManager::setCacheLength(const std::string& k, int x)
174 {
175 Packages::instance()->setCacheLength(k, x);
176 }
177
178 Result PackageManager::update(const std::string& k)
179 {
180 return Packages::instance()->update(k);
181 }
182
183 Result PackageManager::update(const std::string& db, const std::string& k)
184 {
185 return Packages::instance()->update(db,k);
186 }
187
188 void PackageManager::transfer(const std::string& from, const std::string& to)
189 {
190
191 Package* topkg;
192 Package* frompkg;
193 Packages* p = Packages::instance();
194 const IoEntry* efrom = ConControl::instance()->find(from);
195 const IoEntry* eto = ConControl::instance()->find(to);
196 string to_type = eto->Type();
197 string from_type = efrom->Type();
198 string toname;
199 string fromname;
200
201
202
203
204
205
206 Packages::const_iterator i = p->begin();
207 while(i!=p->end())
208 {
209 frompkg=(*i).second;
210 const Context& con_from = frompkg->getContext();
211 fromname = from + con_from.getName();
212
213
214
215
216
217 if(con_from.getID()==from && con_from.getType()==from_type)
218 {
219 toname = to + con_from.getCalibName() + to_type;
220
221 if((topkg=p->find(toname)))
222 {
223 topkg->transfer(frompkg);
224
225 }
226 }
227
228 ++i;
229 }
230 }
231
232 void PackageManager::noDeferredIO(const std::string& db) { }
233 void PackageManager::noDeferredIO() { }
234 void PackageManager::setCachePutReplace() { }
235 void PackageManager::setCachePutInvalidate() { }
236
237
238
Send problems or questions to cdfcode@fnal.gov