86 std::string::size_type c1=coolstr.find(
':');
87 if (c1!=std::string::npos) {
88 std::string_view techno,server,schema;
89 techno=coolstr.substr(0,c1);
90 std::string::size_type c2;
92 if (c2==std::string::npos) c2=coolstr.size();
93 server=coolstr.substr(c1+3,c2-c1-3);
94 c1=coolstr.find(
"schema=");
95 if (c1!=std::string::npos) {
96 c2=coolstr.find(
';',c1+7);
97 if (c2==std::string::npos) c2=coolstr.size();
98 schema=coolstr.substr(c1+7,c2-c1-7);
100 c1=coolstr.find(
"dbname=");
101 if (c1!=std::string::npos) {
102 c2=coolstr.find(
';',c1+7);
103 if (c2==std::string::npos) c2=coolstr.size();
104 m_dbname=std::string(coolstr.substr(c1+7,c2-c1-7));
107 if (techno==
"oracle" || techno==
"mysql" || techno==
"frontier") {
108 if (!server.empty() && !schema.empty()) {
116 }
else if (techno==
"sqlite") {
117 if (!schema.empty()) {
124 c1=coolstr.find(
'/');
125 if (c1!=std::string::npos) {
126 m_dbconn=std::string(coolstr.substr(0,c1));
127 m_dbname=std::string(coolstr.substr(c1+1));
132 m_log << coral::Debug <<
"Extracted CORAL connection string: " <<
m_dbconn
133 <<
" and database name: " <<
m_dbname <<
" with status " << dbok <<
134 coral::MessageStream::endmsg;
153 const std::string& spec) {
154 m_log << coral::Debug <<
"Store AttrList specification for table " <<
155 tablename <<
" : " << spec <<coral::MessageStream::endmsg;
157 const std::string attrtable=
m_dbname+
"_CORACOOLATTR";
158 coral::ITable* table;
160 table=&(
m_proxy->nominalSchema().tableHandle(attrtable));
162 catch (coral::SchemaException& e) {
163 m_log << coral::Debug <<
"Creating table " << attrtable << coral::MessageStream::endmsg;
164 coral::TableDescription tdesc(attrtable);
165 tdesc.setName(attrtable);
166 tdesc.insertColumn(
"NAME",
"string",31,
false);
167 tdesc.insertColumn(
"ATTRSPEC",
"string",4000,
false);
168 tdesc.setPrimaryKey(
"NAME");
169 table=&(
m_proxy->nominalSchema().createTable(tdesc));
171 m_proxy->transaction().commit();
173 m_proxy->transaction().start(
false);
174 table=&(
m_proxy->nominalSchema().tableHandle(attrtable));
177 m_log << coral::Error <<
"No pointer to " << attrtable << coral::MessageStream::endmsg;
182 coral::AttributeList
data;
183 data.extend<std::string>(
"NAME");
184 data.extend<std::string>(
"ATTRSPEC");
185 data[0].data<std::string>()=tablename;
186 data[1].data<std::string>()=spec;
187 coral::ITableDataEditor& editor=table->dataEditor();
188 editor.insertRow(
data);
190 catch (coral::SchemaException&e) {
191 m_log << coral::Error <<
"Could not insert " << tablename <<
" into "
192 << attrtable <<
" exception: " << e.what() <<
193 coral::MessageStream::endmsg;
200 const std::string& coraltable,
201 const cool::IRecordSpecification& fkspec,
202 const cool::IRecordSpecification& payloadspec,
203 const std::string& coralfk,
204 const std::string& coralpk,
206 const cool::FolderVersioning::Mode mode,
207 const bool createParents) {
211 "CORAL tablename too long (max 18 chars)",
212 "CoraCoolDatabase::createFolder");
215 std::string::size_type p1,p2;
219 if (p1!=std::string::npos && p2!=std::string::npos) {
224 newdesc+=
"<coracool>";
227 newdesc+=fkspec[0].name();
232 newdesc+=
"</coracool>";
233 m_log << coral::Debug <<
"Created new description: " << newdesc <<
234 coral::MessageStream::endmsg;
239 m_proxy->transaction().start(
false);
241 if (coralfk!=coralpk)
248 "CoraCoolDatabase::createFolder");
252 m_log << coral::Debug <<
"Generate CORAL table:" << coraltable <<
253 coral::MessageStream::endmsg;
254 coral::TableDescription tdesc(
"CoraCoolPayload");
255 tdesc.setName(
m_dbname+
"_"+coraltable);
256 for (
unsigned int i=0;i<payloadspec.size();++i) {
257 const cool::IFieldSpecification& field=payloadspec[i];
258 int maxsize=field.storageType().maxSize();
259 if (field.storageType()==cool::StorageType::Blob64k) maxsize=0;
260 const std::string typen=coral::AttributeSpecification::typeNameForId(
261 field.storageType().cppType());
262 m_log << coral::Debug <<
"Insert column " << field.name() <<
263 " of type " << typen << std::endl;
264 tdesc.insertColumn(field.name(),typen,maxsize,
false);
267 tdesc.setPrimaryKey(coralpk);
269 if (coralfk!=coralpk)
270 tdesc.createIndex(
m_dbname+
"_"+coraltable+
"F",coralfk,
false);
272 m_proxy->nominalSchema().createTable(tdesc);
273 m_proxy->transaction().commit();
274 m_log << coral::Debug <<
"Created coral table " << coral::MessageStream::endmsg;
281 catch (std::exception& e) {
291 m_log << coral::Debug <<
"Disconnect/reconnect COOL connection" <<
292 coral::MessageStream::endmsg;
295 m_log << coral::Debug <<
"Create COOL folder" << coolpath << coral::MessageStream::endmsg;
298 cool::FolderSpecification(mode,fkspec),newdesc,createParents);
299 m_log << coral::Debug <<
"Created COOL folder" << coral::MessageStream::endmsg;
318 if (!
m_cooldb->existsFolder(coolfolder)) {
323 cool::IFolderPtr folder=
m_cooldb->getFolder(coolfolder);
324 std::string tablename,keycolcool,fkeycolcoral,pkeycolcoral;
326 keycolcool,fkeycolcoral,pkeycolcoral);
331 std::string& tablename,
332 std::string& keycolcool,
333 std::string& fkeycolcoral,
334 std::string& pkeycolcoral) {
342 std::string::size_type p1,p2,c1,c2,c3;
343 p1=folderdesc.find(
"<coracool>");
344 p2=folderdesc.find(
"</coracool>");
345 if (p1==std::string::npos || p2==std::string::npos)
return false;
347 c1=folderdesc.find(
':',p1+10);
348 if (c1==std::string::npos)
return false;
349 c2=folderdesc.find(
':',c1+1);
350 if (c2==std::string::npos)
return false;
354 tablename.append(folderdesc,p1+10,c1-p1-10);
355 keycolcool=folderdesc.substr(c1+1,c2-c1-1);
356 fkeycolcoral=folderdesc.substr(c2+1,p2-c2-1);
358 c3=folderdesc.find(
':',c2+1);
359 if (c3!=std::string::npos) {
360 fkeycolcoral=folderdesc.substr(c2+1,c3-c2-1);
361 pkeycolcoral=folderdesc.substr(c3+1,p2-c3-1);
363 fkeycolcoral=folderdesc.substr(c2+1,p2-c2-1);
364 pkeycolcoral=fkeycolcoral;
370 m_log << coral::Debug <<
"Deleting folder " << coolfolder << coral::MessageStream::endmsg;
374 cool::IFolderPtr folder=
m_cooldb->getFolder(coolfolder);
375 desc=folder->description();
379 catch (cool::Exception& e) {
383 std::string tablename,keycolcool,fkeycolcoral,pkeycolcoral;
385 fkeycolcoral,pkeycolcoral)) {
386 m_log << coral::Debug <<
"Drop CORAL payload table " << tablename
387 << coral::MessageStream::endmsg;
390 m_proxy->transaction().start(
false);
391 m_proxy->nominalSchema().dropIfExistsTable(tablename);
395 if (fkeycolcoral!=pkeycolcoral) {
400 coral::AttributeList bindvar;
401 bindvar.extend<std::string>(
"SNAME");
402 bindvar[0].data<std::string>()=tablename;
403 coral::ITable& table=
m_proxy->nominalSchema().tableHandle(
405 long rows=table.dataEditor().deleteRows(
"NAME=:SNAME",bindvar);
406 if (rows!=1)
m_log << coral::Error <<
"Unexpected number of rows "
407 << rows <<
" with key " << tablename <<
408 " deleted from CORACOOLATTR table" << coral::MessageStream::endmsg;
409 m_proxy->transaction().commit();
CoraCoolFolderPtr createFolder(const std::string &coolpath, const std::string &coraltable, const cool::IRecordSpecification &fkspec, const cool::IRecordSpecification &payloadspec, const std::string &coralfk, const std::string &coralpk, const std::string &description="", const cool::FolderVersioning::Mode mode=cool::FolderVersioning::SINGLE_VERSION, const bool createParents=false)