A platform for high-performance distributed tool and library development written in C++. It can be deployed in two different cluster modes: standalone or distributed. API for v0.5.0, released on June 13, 2018.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
PDBCatalog.cc
Go to the documentation of this file.
1 /*****************************************************************************
2  * *
3  * Copyright 2018 Rice University *
4  * *
5  * Licensed under the Apache License, Version 2.0 (the "License"); *
6  * you may not use this file except in compliance with the License. *
7  * You may obtain a copy of the License at *
8  * *
9  * http://www.apache.org/licenses/LICENSE-2.0 *
10  * *
11  * Unless required by applicable law or agreed to in writing, software *
12  * distributed under the License is distributed on an "AS IS" BASIS, *
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14  * See the License for the specific language governing permissions and *
15  * limitations under the License. *
16  * *
17  *****************************************************************************/
18 #include "PDBCatalog.h"
19 
20 /* Specialization for adding Database metadata */
21 template <>
23  registeredDatabasesMetadata->push_back(*item);
24  registeredDatabases.insert(make_pair(item->getItemKey().c_str(), *item));
25  return true;
26 }
27 
28 /* Specialization for adding Node metadata */
29 template <>
31  registeredNodesMetadata->push_back(*item);
32  registeredNodes.insert(make_pair(item->getItemKey().c_str(), *item));
33  return true;
34 }
35 
36 /* Specialization for adding Set metadata */
37 template <>
39  registeredSetsMetadata->push_back(*item);
40  registeredSets.insert(make_pair(item->getItemKey().c_str(), *item));
41  return true;
42 }
43 
44 /* Specialization for adding User-defined type metadata */
45 template <>
47  int &key) {
48  registeredUserDefinedTypesMetadata->push_back(*item);
50  make_pair(item->getItemName().c_str(), *item));
51  mapTypeNameToTypeID.insert(make_pair(item->getItemName().c_str(),
52  atoi(item->getObjectID().c_str())));
53  mapTypeIdToTypeName.insert(make_pair(atoi(item->getObjectID().c_str()),
54  item->getItemName().c_str()));
55  return true;
56 }
57 
58 /* Specialization for updating Database metadata */
59 template <>
62  (*registeredDatabasesMetadata).assign(index, *item);
63  registeredDatabases[(*item).getItemKey().c_str()] = (*item);
64  return true;
65 }
66 
67 /* Specialization for updating Set metadata */
68 template <>
71  (*registeredSetsMetadata).assign(index, *item);
72  return true;
73 }
74 
75 /* Specialization for updating Node metadata */
76 template <>
79  (*registeredNodesMetadata).assign(index, *item);
80  return true;
81 }
82 
83 /* Specialization for updating User-defined type metadata */
84 template <>
87  (*registeredUserDefinedTypesMetadata).assign(index, *item);
88  return true;
89 }
90 
91 /* Specialization for deleting Set metadata */
92 template <>
95  Handle<Vector<CatalogSetMetadata>> tempContainter =
96  makeObject<Vector<CatalogSetMetadata>>();
97  for (int i = 0; i < (*registeredSetsMetadata).size(); i++) {
98  if ((*item).getItemKey() != (*registeredSetsMetadata)[i].getItemKey()) {
99  tempContainter->push_back((*registeredSetsMetadata)[i]);
100  }
101  }
102  (*registeredSetsMetadata).clear();
103  (*registeredSetsMetadata) = (*tempContainter);
104  registeredSets.erase((*item).getItemKey().c_str());
105  return true;
106 }
107 
108 /* Specialization for deleting Node metadata */
109 template <>
112  Handle<Vector<CatalogNodeMetadata>> tempContainter =
113  makeObject<Vector<CatalogNodeMetadata>>();
114  for (int i = 0; i < (*registeredNodesMetadata).size(); i++) {
115  if ((*item).getItemKey() != (*registeredNodesMetadata)[i].getItemKey()) {
116  tempContainter->push_back((*registeredNodesMetadata)[i]);
117  }
118  }
119  (*registeredNodesMetadata).clear();
120  (*registeredNodesMetadata) = (*tempContainter);
121  registeredNodes.erase((*item).getItemKey().c_str());
122  return true;
123 }
124 
125 /* Specialization for deleting Database metadata */
126 template <>
127 bool PDBCatalog::deleteItemInVector<CatalogDatabaseMetadata>(
128  int &index, Handle<CatalogDatabaseMetadata> &item) {
130  makeObject<Vector<CatalogDatabaseMetadata>>();
131  for (int i = 0; i < (*registeredDatabasesMetadata).size(); i++) {
132  if ((*item).getItemKey() !=
133  (*registeredDatabasesMetadata)[i].getItemKey()) {
134  tempContainter->push_back((*registeredDatabasesMetadata)[i]);
135  }
136  }
137  (*registeredDatabasesMetadata).clear();
138  (*registeredDatabasesMetadata) = (*tempContainter);
139  registeredDatabases.erase((*item).getItemKey().c_str());
140  return true;
141 }
142 
143 /* Specialization for deleting User-defined type metadata */
144 template <>
148  makeObject<Vector<CatalogUserTypeMetadata>>();
149  for (int i = 0; i < (*registeredUserDefinedTypesMetadata).size(); i++) {
150  if ((*item).getItemKey() !=
151  (*registeredUserDefinedTypesMetadata)[i].getItemKey()) {
152  tempContainter->push_back((*registeredUserDefinedTypesMetadata)[i]);
153  }
154  }
155  (*registeredUserDefinedTypesMetadata).clear();
156  (*registeredUserDefinedTypesMetadata) = (*tempContainter);
157  registeredUserDefinedTypes.erase((*item).getItemKey().c_str());
158  return true;
159 }
160 
161 void errorLogCallback(void *pArg, int iErrCode, const char *zMsg) {
162  fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
163 }
164 
165 PDBCatalog::PDBCatalog(PDBLoggerPtr logger, string location) {
166 
167  pdb::UseTemporaryAllocationBlock(1024 * 1024 * 128);
168 
169  sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, NULL);
170  pthread_mutex_init(&(registerMetadataMutex), NULL);
171  this->logger = logger;
172 
173  // sets the paths for the location of the catalog files
174  catalogRootPath = location + "/";
175  string catalogPath = catalogRootPath + "pdbCatalog/";
176  catalogFilename = catalogPath + "plinyCatalog.db";
177  setUriPath("file:" + catalogFilename);
178  tempPath = catalogRootPath + "tmp_so_files";
179 
180  // Creates the parent folder for the catalog
181  // If location exists, only opens it.
182  if (mkdir(catalogRootPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) ==
183  -1) {
184  PDB_COUT << "Parent catalog folder " << catalogRootPath
185  << " was not created, it already exists." << std::endl;
186  } else {
187  PDB_COUT << "Parent catalog folder " << catalogRootPath
188  << " was created/opened." << std::endl;
189  }
190 
191  // Creates a location folder for storing the sqlite file containing metadata
192  // for this PDB instance.
193  // If location exists, only opens it.
194  if (mkdir(catalogPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
195  PDB_COUT << "Catalog folder " << catalogPath
196  << " was not created, it already exists." << std::endl;
197  } else {
198  PDB_COUT << "Catalog folder " << catalogPath << " was created/opened."
199  << std::endl;
200  }
201 
202  // creates temp folder for extracting so_files (only if folder doesn't exist)
203  const int folder =
204  mkdir(tempPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
205  if (folder == -1) {
206  PDB_COUT << "Folder " << tempPath << " was not created, it already exists."
207  << std::endl;
208  } else {
209  PDB_COUT << "Folder " << tempPath
210  << " for temporary shared libraries was created/opened."
211  << std::endl;
212  }
213 
214  listUsersInCluster = makeObject<Vector<Handle<CatalogUserTypeMetadata>>>();
215  registeredNodesMetadata = makeObject<Vector<CatalogNodeMetadata>>();
216  registeredSetsMetadata = makeObject<Vector<CatalogSetMetadata>>();
217  registeredDatabasesMetadata = makeObject<Vector<CatalogDatabaseMetadata>>();
219  makeObject<Vector<CatalogUserTypeMetadata>>();
220 
221  catalogContents = makeObject<Map<String, Handle<Vector<Object>>>>();
222 
223  // Populates a map to convert strings from PDBObject names to SQLite table
224  // names in order to create query strings
226  make_pair(PDBCatalogMsgType::CatalogPDBNode, "pdb_node"));
228  make_pair(PDBCatalogMsgType::CatalogPDBDatabase, "pdb_database"));
230  make_pair(PDBCatalogMsgType::CatalogPDBSet, "pdb_set"));
232  make_pair(PDBCatalogMsgType::CatalogPDBUser, "pdb_user"));
233  mapsPDBOjbect2SQLiteTable.insert(make_pair(
234  PDBCatalogMsgType::CatalogPDBPermissions, "pdb_user_permission"));
236  make_pair(PDBCatalogMsgType::CatalogPDBRegisteredObject, "data_types"));
237 
238  // Populates a map to convert strings from Vector<PDBOjbect> names to SQLite
239  // table names in order to create query strings
241  make_pair(PDBCatalogMsgType::CatalogPDBNode, "pdb_node"));
243  make_pair(PDBCatalogMsgType::CatalogPDBDatabase, "pdb_database"));
245  make_pair(PDBCatalogMsgType::CatalogPDBSet, "pdb_set"));
247  make_pair(PDBCatalogMsgType::CatalogPDBUser, "pdb_user"));
248  mapsPDBArrayOjbect2SQLiteTable.insert(make_pair(
249  PDBCatalogMsgType::CatalogPDBPermissions, "pdb_user_permission"));
251  make_pair(PDBCatalogMsgType::CatalogPDBRegisteredObject, "data_types"));
252 
253 }
254 
256  this->logger->debug("Catalog destructor called!!!");
257  int deletedFiles = remove(tempPath.c_str());
258  if (deletedFiles == -1) {
259  PDB_COUT << " Error trying to remove temporary folder: " << tempPath
260  << endl;
261  } else {
262  PDB_COUT << " Temporary folder: " << tempPath << " has been removed."
263  << endl;
264  }
265  sqlite3_close_v2(sqliteDBHandler);
266  pthread_mutex_destroy(&(registerMetadataMutex));
267 }
268 
270 
272  this->logger->debug("Closing SQLite Handler!!!");
273  sqlite3_close_v2(sqliteDBHandler);
274 }
275 
276 void PDBCatalog::setCatalogVersion(string version) {
277  catalogVersion = version;
278 }
279 
281  return catalogVersion;
282 }
283 
285  string fileName,
286  string version,
287  string &returnedBytes,
288  string &errorMessage) {
289 
290  errorMessage = "";
291 
292  string fullName = catalogRootPath + "plinyCatalog.db";
293 
294  fstream file(fullName.c_str(), ios::in | ios::binary);
295  if (!file) {
296  errorMessage = "The file " + fullName + " was not found\n";
297  }
298 
299  file.seekp(0, fstream::end);
300  streampos numBytes = file.tellp();
301  file.seekp(0, fstream::beg);
302 
303  char *buffer = new char[numBytes];
304  file.read(buffer, numBytes);
305  returnedBytes = string(buffer, numBytes);
306  return true;
307 }
308 
310  sqliteDBHandler = NULL;
311  int ret = 0;
312  // If database doesn't exist creates database along with tables, otherwise,
313  // opens database without creating a database/tables.
314  if ((ret = sqlite3_open_v2(uriPath.c_str(), &sqliteDBHandler,
315  SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
316  SQLITE_OPEN_URI | SQLITE_OPEN_FULLMUTEX,
317  NULL)) == SQLITE_OK) {
318 
319  // These two SQLite flags optimize insertions/deletions/updates to the
320  // tables by buffering data prior to writing to disk
321  sqlite3_exec(sqliteDBHandler, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
322  sqlite3_exec(sqliteDBHandler, "PRAGMA journal_mode=memory", NULL, NULL,
323  NULL);
324 
325  // Create tables if they don't exist, they are created with primary key to
326  // prevent duplicates
328  "CREATE TABLE IF NOT EXISTS data_types (itemID TEXT PRIMARY KEY, "
329  "itemInfo BLOB, soBytes BLOB, timeStamp INTEGER);");
331  "CREATE TABLE IF NOT EXISTS metrics (itemID TEXT PRIMARY KEY, "
332  "itemInfo BLOB, soBytes BLOB, timeStamp INTEGER);");
334  "CREATE TABLE IF NOT EXISTS pdb_node (itemID TEXT PRIMARY KEY, "
335  "itemInfo BLOB, timeStamp INTEGER);");
337  "CREATE TABLE IF NOT EXISTS pdb_database (itemID TEXT PRIMARY KEY, "
338  "itemInfo BLOB, timeStamp INTEGER);");
340  "CREATE TABLE IF NOT EXISTS pdb_set (itemID TEXT PRIMARY KEY, "
341  "itemInfo BLOB, timeStamp INTEGER);");
343  "CREATE TABLE IF NOT EXISTS pdb_user (itemID TEXT PRIMARY KEY, "
344  "itemInfo BLOB, timeStamp INTEGER);");
345  catalogSqlQuery("CREATE TABLE IF NOT EXISTS pdb_user_permission (itemID "
346  "TEXT PRIMARY KEY, "
347  "itemInfo BLOB, timeStamp INTEGER);");
348 
349  // Loads into memory all metadata so the CatalogServer can access them
351 
352  PDB_COUT << "Catalog database successfully open." << endl;
353 
354  } else {
355  PDB_COUT << "Error opening catalog database." << endl;
356  }
357 }
358 
360  string errorMessage;
361 
362  // an empty string lists all entries in a given category
363  string emptyString("");
364 
365  // retrieves metadata from the SQLite DB and populates containers
366  if (getMetadataFromCatalog(false,
367  emptyString,
369  errorMessage,
371 
372  this->logger->debug(errorMessage);
373 
374  (*catalogContents)[String("nodes")] =
375  unsafeCast<Vector<Object>>(registeredNodesMetadata);
376 
377  if (getMetadataFromCatalog(false,
378  emptyString,
380  errorMessage,
382 
383  this->logger->debug(errorMessage);
384 
385  (*catalogContents)[String("sets")] =
386  unsafeCast<Vector<Object>>(registeredSetsMetadata);
387 
388  if (getMetadataFromCatalog(false,
389  emptyString,
391  errorMessage,
393 
394  this->logger->debug(errorMessage);
395 
396  (*catalogContents)[String("dbs")] =
397  unsafeCast<Vector<Object>>(registeredDatabasesMetadata);
398 
399  if (getMetadataFromCatalog(false,
400  emptyString,
402  errorMessage,
404 
405  (*catalogContents)[String("udfs")] =
406  unsafeCast<Vector<Object>>(registeredUserDefinedTypesMetadata);
407 
408  // populates maps
409  // retrieves databases metadata
410  for (int i = 0; i < (*registeredDatabasesMetadata).size(); i++) {
411  PDB_COUT << "Retrieving db "
412  << string((*registeredDatabasesMetadata)[i].getItemKey())
413  << " | "
414  << string((*registeredDatabasesMetadata)[i].getItemName())
415  << endl;
416 
417  registeredDatabases.insert(
418  make_pair((*registeredDatabasesMetadata)[i].getItemName().c_str(),
420  }
421 
422  // retrieves sets metadata
423  for (int i = 0; i < (*registeredSetsMetadata).size(); i++) {
424  PDB_COUT << "Retrieving set "
425  << string((*registeredSetsMetadata)[i].getItemKey())
426  << " | "
427  << string((*registeredSetsMetadata)[i].getItemName())
428  << endl;
429 
430  registeredSets.insert(
431  make_pair((*registeredSetsMetadata)[i].getItemKey().c_str(),
432  (*registeredSetsMetadata)[i]));
433  }
434 
435  // retrieves nodes metadata
436  for (int i = 0; i < (*registeredNodesMetadata).size(); i++) {
437  PDB_COUT << "Retrieving node "
438  << string((*registeredNodesMetadata)[i].getItemKey())
439  << " | "
440  << string((*registeredNodesMetadata)[i].getNodeIP())
441  << endl;
442 
443  registeredNodes.insert(
444  make_pair((*registeredNodesMetadata)[i].getItemKey().c_str(),
445  (*registeredNodesMetadata)[i]));
446  }
447 
448  // retrieves user-defined types metadata
449  for (int i = 0; i < (*registeredUserDefinedTypesMetadata).size(); i++) {
450  PDB_COUT << "Retrieving node "
451  << string((*registeredUserDefinedTypesMetadata)[i].getObjectID())
452  << " | "
453  << string((*registeredUserDefinedTypesMetadata)[i].getItemName())
454  << endl;
455 
456  registeredUserDefinedTypes.insert(make_pair(
457  (*registeredUserDefinedTypesMetadata)[i].getItemName().c_str(),
459  }
460 
461  } else {
462  PDB_COUT << errorMessage << endl;
463  }
464 
465  cout << "=========================================" << endl;
466  cout << "Metadata Registered in the PDB Catalog " << endl;
467  cout << "-----------------------------------------" << endl;
468 
469  string metadataToPrint;
470  printsAllCatalogMetadata(metadataToPrint, errorMessage);
471  cout << metadataToPrint.c_str() << endl;
472 
473  cout << "\nAll Metadata retrieved and loaded." << endl;
474  cout << "=========================================" << endl;
475 }
476 
478  Handle<CatalogPrintMetadata> &itemMetadata) {
479 
480  string errorMessage;
481  string dateAsString = itemMetadata->getTimeStamp().c_str();
482 
483  Handle<Vector<CatalogNodeMetadata>> _registeredNodesMetadata =
484  makeObject<Vector<CatalogNodeMetadata>>();
485  Handle<Vector<CatalogSetMetadata>> _registeredSetsMetadata =
486  makeObject<Vector<CatalogSetMetadata>>();
487  Handle<Vector<CatalogDatabaseMetadata>> _registeredDatabasesMetadata =
488  makeObject<Vector<CatalogDatabaseMetadata>>();
489  Handle<Vector<CatalogUserTypeMetadata>> _registeredUserDefinedTypesMetadata =
490  makeObject<Vector<CatalogUserTypeMetadata>>();
491 
492  // retrieves metadata from the sqlite DB and populates containers
493  if (getMetadataFromCatalog(true, dateAsString, _registeredNodesMetadata,
494  errorMessage,
496  this->logger->debug(errorMessage);
497 
498  if (getMetadataFromCatalog(true, dateAsString, _registeredSetsMetadata,
499  errorMessage,
501  this->logger->debug(errorMessage);
502 
503  if (getMetadataFromCatalog(true, dateAsString, _registeredDatabasesMetadata,
504  errorMessage,
506  this->logger->debug(errorMessage);
507 
509  true, dateAsString, _registeredUserDefinedTypesMetadata, errorMessage,
511 
512  for (int i = 0; i < (*_registeredUserDefinedTypesMetadata).size(); i++) {
513  PDB_COUT
514  << "RETRIEVING TYPE "
515  << string((*_registeredUserDefinedTypesMetadata)[i].getItemName())
516  << " | "
517  << string((*_registeredUserDefinedTypesMetadata)[i].getObjectID())
518  << endl;
519 
520  registeredUserDefinedTypes.insert(make_pair(
521  (*_registeredUserDefinedTypesMetadata)[i].getItemName().c_str(),
522  (*_registeredUserDefinedTypesMetadata)[i]));
523  }
524 
525  } else {
526  PDB_COUT << errorMessage << endl;
527  }
528 
529  cout << "=========================================" << endl;
530  cout << "PDB Metadata Registered in the Catalog " << endl;
531 
532  cout << "\nNodes in cluster: " +
533  std::to_string((int)(*_registeredNodesMetadata).size())
534  << endl;
535  cout << "----------------------------" << endl;
536 
537  for (int i = 0; i < (*_registeredNodesMetadata).size(); i++) {
538  cout << (*_registeredNodesMetadata)[i].printShort() << endl;
539  }
540 
541  cout << "\nDatabases: " +
542  std::to_string((int)(*_registeredDatabasesMetadata).size())
543  << endl;
544  cout << "----------------------------" << endl;
545 
546  for (int i = 0; i < (*_registeredDatabasesMetadata).size(); i++) {
547  cout << (*_registeredDatabasesMetadata)[i].printShort() << endl;
548  }
549  cout << "\nSets: " + std::to_string((int)(*_registeredSetsMetadata).size())
550  << endl;
551  cout << "----------------------------" << endl;
552 
553  for (int i = 0; i < (*_registeredSetsMetadata).size(); i++) {
554  cout << (*_registeredSetsMetadata)[i].printShort() << endl;
555  }
556  cout << "\nUser-defined types: " +
557  std::to_string((int)(*_registeredUserDefinedTypesMetadata).size())
558  << endl;
559  cout << "----------------------------" << endl;
560 
561  for (int i = 0; i < (*_registeredUserDefinedTypesMetadata).size(); i++) {
562  cout << (*_registeredUserDefinedTypesMetadata)[i].printShort() << endl;
563  }
564  cout << "\nAll Metadata properly retrieved and\n"
565  "loaded into memory!"
566  << endl;
567  cout << "--------------------------------------" << endl;
568 }
569 
570 void PDBCatalog::printsAllCatalogMetadata(std::string &outputString, std::string &errMsg) {
571 
572  listNodesInCluster(outputString, errMsg);
573  listRegisteredDatabases(outputString, errMsg);
574  listUserDefinedTypes(outputString, errMsg);
575 
576 }
577 
578 /* Lists the Nodes registered in the catalog. */
579 void PDBCatalog::listNodesInCluster(std::string &outputString,
580  std::string &errMsg) {
581 
582  outputString += "\nI. Nodes in Cluster ("
583  + std::to_string((int)(*registeredNodesMetadata).size())
584  + ")\n";
585 
586  for (int i = 0; i < (*registeredNodesMetadata).size(); i++) {
587  outputString += (*registeredNodesMetadata)[i].printShort() + "\n";
588  }
589 
590 }
591 
592 /* Lists the Databases registered in the catalog. */
593 void PDBCatalog::listRegisteredDatabases(std::string &outputString,
594  std::string &errMsg) {
595 
596  outputString += "\nII. Databases ("
597  + std::to_string((int)(*registeredDatabasesMetadata).size())
598  + ")\n";
599 
600  for (int i = 0; i < (*registeredDatabasesMetadata).size(); i++) {
601  outputString += (*registeredDatabasesMetadata)[i].printShort() + "\n";
602  }
603 
604 }
605 
606 /* Lists the Sets for a given database registered in the catalog. */
607 void PDBCatalog::listRegisteredSetsForADatabase(std::string databaseName,
608  std::string &outputString,
609  std::string &errMsg) {
610 
611  outputString += "\nSets ("
612  + std::to_string((int)(*registeredSetsMetadata).size())
613  + ")\n";
614 
615  for (int i = 0; i < (*registeredSetsMetadata).size(); i++) {
616  outputString += (*registeredSetsMetadata)[i].printShort() + "\n";
617  }
618 
619 }
620 
621 /* Lists the user-defined types registered in the catalog. */
622 void PDBCatalog::listUserDefinedTypes(std::string &outputString,
623  std::string &errMsg) {
624 
625  outputString += "\nIII. User-defined types ("
626  + std::to_string((int)(*registeredUserDefinedTypesMetadata).size())
627  + ")\n";
628 
629  for (int i = 0; i < (*registeredUserDefinedTypesMetadata).size(); i++) {
630  outputString +=
631  (*registeredUserDefinedTypesMetadata)[i].printShort() + "\n";
632  }
633 
634 }
635 
636 template <class CatalogMetadataType>
638  bool onlyModified, string key,
640  string &errorMessage, int metadataCategory) {
641 
642  pdb::String emptyString("");
643 
644  pthread_mutex_lock(&(registerMetadataMutex));
645 
646  sqlite3_stmt *statement = NULL;
647 
648  string queryString = "SELECT itemID, itemInfo, timeStamp from " +
649  mapsPDBArrayOjbect2SQLiteTable[metadataCategory];
650 
651  // if empty string then retrieves all items in the table, otherwise only the
652  // item with the given key
653  if (onlyModified == true)
654  queryString.append(" where timeStamp > ").append(key).append("");
655  else if (key != "")
656  queryString.append(" where itemID = '").append(key).append("'");
657 
658  PDB_COUT << queryString << endl;
659 
660  this->logger->debug(queryString);
661  if (sqlite3_prepare_v2(sqliteDBHandler, queryString.c_str(), -1, &statement,
662  NULL) == SQLITE_OK) {
663 
664  int res = 0;
665  while (1) {
666  res = sqlite3_step(statement);
667 
668  if (res == SQLITE_ROW) {
669  // retrieves the serialized record
670  int numBytes = sqlite3_column_bytes(statement, 1);
671 
672  PDB_COUT << "entry " << sqlite3_column_text(statement, 0)
673  << " timestamp " << sqlite3_column_int(statement, 2) << endl;
674 
675  Record<CatalogMetadataType> *recordBytes =
676  (Record<CatalogMetadataType> *)malloc(numBytes);
677 
678  memcpy(recordBytes, sqlite3_column_blob(statement, 1), numBytes);
679 
680  // get the object
681  Handle<CatalogMetadataType> returnedObject =
682  recordBytes->getRootObject();
683 
684  string itemId = returnedObject->getItemKey().c_str();
685  this->logger->debug("itemId=" + itemId);
686  returnedItems->push_back(*returnedObject);
687  free(recordBytes);
688 
689  } else if (res == SQLITE_DONE) {
690  break;
691  }
692  }
693  sqlite3_finalize(statement);
694  pthread_mutex_unlock(&(registerMetadataMutex));
695 
696  return true;
697  } else {
698 
699  string error = sqlite3_errmsg(sqliteDBHandler);
700 
701  if (error != "not an error") {
702  this->logger->writeLn((string)queryString + " " + error);
703  }
704 
705  sqlite3_finalize(statement);
706 
707  pthread_mutex_unlock(&(registerMetadataMutex));
708  return false;
709  }
710 }
711 
713  int16_t typeCode,
714  pdb::Handle<CatalogUserTypeMetadata> &objectToRegister,
715  const string &objectBytes,
716  const string &typeName,
717  const string &fileName,
718  const string &tableName,
719  string &errorMessage) {
720 
721  bool isSuccess = false;
722 
723  pthread_mutex_lock(&(registerMetadataMutex));
724  PDB_COUT << "inside registerUserDefinedObject\nobjectBytes "
725  << std::to_string(objectBytes.size()) << endl;
726  PDB_COUT << "typeName " << typeName << endl;
727  PDB_COUT << "fileName " << fileName << endl;
728  PDB_COUT << "tableName " << tableName << endl;
729 
730  bool success = false;
731  errorMessage = "";
732 
733  sqlite3_stmt *stmt = NULL;
734  uint8_t *serializedBytes = NULL;
735 
736  string queryString("");
737  queryString = "INSERT INTO " + tableName +
738  " (itemID, itemInfo, soBytes, timeStamp) "
739  "VALUES(?, ?, ?, strftime('%s', 'now', 'localtime'))";
740 
741  PDB_COUT << "QueryString = " << queryString << endl;
742 
743  int rc =
744  sqlite3_prepare_v2(sqliteDBHandler, queryString.c_str(), -1, &stmt, NULL);
745  if (rc != SQLITE_OK) {
746  errorMessage = "Prepared statement failed. " +
747  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
748  PDB_COUT << "errorMessage" << errorMessage << endl;
749 
750  success = false;
751  } else {
752  PDB_COUT << "Pass else" << endl;
753  // Gets the number of registered objects in the catalog
754  int totalRegisteredTypes = (int)registeredUserDefinedTypes.size();
755 
756  PDB_COUT << "ASSIGN TYPE_ID-> " << std::to_string(typeCode) << " for Type "
757  << typeName << endl;
758 
759  string newObjectId = std::to_string(typeCode);
760  String newObjectIndex = String(std::to_string(typeCode));
761 
762  PDB_COUT << " Object Id -----> " << newObjectId;
763  String idToRegister = String(newObjectId);
764  String tableToRegister = String(tableName);
765  String typeToRegister = String(typeName);
766 
767  // Sets object ID prior to serialization
768  objectToRegister->setItemId(newObjectIndex);
769  objectToRegister->setObjectId(idToRegister);
770  objectToRegister->setItemKey(typeToRegister);
771  objectToRegister->setItemName(typeToRegister);
772  String empty = String(" ");
773  objectToRegister->setLibraryBytes(empty);
774 
775  // gets the raw bytes of the object
776  Record<CatalogUserTypeMetadata> *metadataBytes =
777  getRecord<CatalogUserTypeMetadata>(objectToRegister);
778 
779  // TODO I might be able to directly save the bytes into sqlite without the
780  // memcpy
781  serializedBytes = (uint8_t *)malloc(metadataBytes->numBytes());
782  memcpy(serializedBytes, metadataBytes, metadataBytes->numBytes());
783  size_t soBytesSize = objectBytes.length();
784  this->logger->debug("size soBytesSize " + std::to_string(soBytesSize));
785 
786  rc = sqlite3_bind_text(stmt, 1, typeToRegister.c_str(), -1, SQLITE_STATIC);
787  rc = sqlite3_bind_blob(stmt, 2, serializedBytes, metadataBytes->numBytes(),
788  SQLITE_STATIC);
789  rc = sqlite3_bind_blob(stmt, 3, objectBytes.c_str(), soBytesSize,
790  SQLITE_STATIC);
791 
792  // Inserts newly added object into containers
793  addItemToVector(objectToRegister, totalRegisteredTypes);
794 
795  if (rc != SQLITE_OK) {
796  errorMessage = "Bind operation failed. " +
797  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
798  this->logger->debug(errorMessage);
799  success = false;
800  } else {
801  rc = sqlite3_step(stmt);
802  if (rc != SQLITE_DONE) {
803  if (sqlite3_errcode(sqliteDBHandler) == SQLITE_CONSTRAINT) {
804  success = false;
805  errorMessage =
806  fileName + " is already registered in the catalog!" + "\n";
807  } else
808  errorMessage = "Query execution failed. " +
809  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
810  } else {
812  make_pair(typeName, *objectToRegister));
813 
814  success = true;
815  this->logger->writeLn(
816  "Dynamic library successfully stored in catalog!");
817  }
818  }
819  sqlite3_finalize(stmt);
820  free(serializedBytes);
821  }
822  PDB_COUT << errorMessage << std::endl;
823 
824  pthread_mutex_unlock(&(registerMetadataMutex));
825  return isSuccess;
826 }
827 
828 map<string, CatalogUserTypeMetadata> PDBCatalog::getUserDefinedTypesList() {
830 }
831 
832 // Retrieves a Shared Library file stored as BLOB in SQLite
833 // and writes it into a temporary folder/file so it can be loaded using
834 // dlopen.
836  string itemId, string tableName,
837  Handle<CatalogUserTypeMetadata> &returnedItem, string &returnedSoLibrary,
838  string &errorMessage) {
839 
840  pthread_mutex_lock(&(registerMetadataMutex));
841 
842  sqlite3_blob *pBlob = NULL;
843  sqlite3_stmt *pStmt = NULL;
844 
845  errorMessage = "";
846 
847  string query = "SELECT itemID, itemInfo, soBytes FROM " + tableName +
848  " where itemID = ?;";
849  PDB_COUT << "query: " << query << " " << itemId << endl;
850  if (sqlite3_prepare_v2(sqliteDBHandler, query.c_str(), -1, &pStmt, NULL) !=
851  SQLITE_OK) {
852  errorMessage = "Error query not well formed: " +
853  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
854 
855  sqlite3_reset(pStmt);
856  PDB_COUT << errorMessage << endl;
857  pthread_mutex_unlock(&registerMetadataMutex);
858  return false;
859  }
860 
861  sqlite3_bind_text(pStmt, 1, itemId.c_str(), -1, SQLITE_STATIC);
862 
863  if (sqlite3_step(pStmt) != SQLITE_ROW) {
864  errorMessage = "Error item not found in database: " +
865  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
866  sqlite3_reset(pStmt);
867  PDB_COUT << errorMessage << endl;
868 
869  pthread_mutex_unlock(&registerMetadataMutex);
870  return false;
871  }
872 
873  // retrieves metadata stored as serialized pdb :: Object
874  int numBytes = sqlite3_column_bytes(pStmt, 1);
875  Record<CatalogUserTypeMetadata> *recordBytes =
876  (Record<CatalogUserTypeMetadata> *)malloc(numBytes);
877 
878  if (recordBytes == nullptr) {
879  PDB_COUT << "FATAL ERROR: Out of memory!" << std::endl;
880 
881  pthread_mutex_unlock(&registerMetadataMutex);
882  exit(-1);
883  }
884 
885  memcpy(recordBytes, sqlite3_column_blob(pStmt, 1), numBytes);
886  Handle<CatalogUserTypeMetadata> returnedObject = recordBytes->getRootObject();
887  returnedItem =
888  deepCopyToCurrentAllocationBlock<CatalogUserTypeMetadata>(returnedObject);
889 
890  if (returnedItem == nullptr) {
891  PDB_COUT << "FATAL ERROR: Corrupted CatalogUserTypeMetadata!" << std::endl;
892 
893  pthread_mutex_unlock(&registerMetadataMutex);
894  free(recordBytes);
895  return false;
896  }
897 
898  PDB_COUT << "Metadata created for item " << string(returnedItem->getItemId())
899  << endl;
900  PDB_COUT << "Metadata created for item " << string(returnedItem->getItemKey())
901  << endl;
902  PDB_COUT << "file size= " + std::to_string(numBytes) << endl;
903 
904  // retrieves the bytes for the .so library
905  numBytes = sqlite3_column_bytes(pStmt, 2);
906 
907  char *buffer = new char[numBytes];
908  memcpy(buffer, sqlite3_column_blob(pStmt, 2), numBytes);
909  returnedSoLibrary = string(buffer, numBytes);
910  delete[] buffer;
911 
912  PDB_COUT << "buffer bytes size " + std::to_string(returnedSoLibrary.size())
913  << endl;
914 
915  sqlite3_reset(pStmt);
916  sqlite3_blob_close(pBlob);
917 
918  pthread_mutex_unlock(&(registerMetadataMutex));
919  free(recordBytes);
920  return true;
921 }
922 
923 void PDBCatalog::deleteTempSoFiles(string filePath) {
924  struct dirent *next_file = NULL;
925  DIR *theFolder = NULL;
926 
927  theFolder = opendir(filePath.c_str());
928  if (theFolder != NULL) {
929  while ((next_file = readdir(theFolder))) {
930  if (strcmp(next_file->d_name, ".") == 0 ||
931  strcmp(next_file->d_name, "..") == 0) {
932  continue;
933  }
934  string fullName = filePath + "/" + next_file->d_name;
935  remove(fullName.c_str());
936  }
937  }
938 }
939 
940 template <class CatalogMetadataType>
942  pdb::Handle<CatalogMetadataType> &metadataValue,
943  int &metadataCategory,
944  string &errorMessage) {
945 
946  pthread_mutex_lock(&(registerMetadataMutex));
947 
948  Handle<CatalogMetadataType> metadataObject =
949  makeObject<CatalogMetadataType>();
950 
951  bool isSuccess = false;
952  sqlite3_stmt *stmt = NULL;
953 
954  string sqlStatement = "INSERT INTO " +
955  mapsPDBOjbect2SQLiteTable[metadataCategory] +
956  " (itemID, itemInfo, timeStamp) VALUES (?, ?, "
957  "strftime('%s', 'now', 'localtime'))";
958 
959  // gets the size of the container for a given type of metadata and
960  // uses it to assign the index of a metadata item in its container
961  int newId = getLastId(metadataCategory);
962  pdb::String newKeyValue = String(std::to_string(newId));
963  string metadataKey = metadataValue->getItemKey().c_str();
964  metadataValue->setItemId(newKeyValue);
965 
966  auto metadataBytes = getRecord<CatalogMetadataType>(metadataValue);
967  size_t numberOfBytes = metadataBytes->numBytes();
968 
969  this->logger->debug(sqlStatement + " with key= " + metadataKey);
970  // Prepares statement
971  if ((sqlite3_prepare_v2(sqliteDBHandler, sqlStatement.c_str(), -1, &stmt,
972  NULL)) != SQLITE_OK) {
973 
974  errorMessage =
975  "Prepared statement failed. " + (string)sqlite3_errmsg(sqliteDBHandler);
976  this->logger->writeLn(errorMessage);
977  isSuccess = false;
978  }
979 
980  // Binds key for this piece of metadata
981  if ((sqlite3_bind_text(stmt, 1, metadataKey.c_str(), -1, SQLITE_STATIC)) !=
982  SQLITE_OK) {
983  errorMessage = "Bind operation failed. " +
984  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
985  isSuccess = false;
986  }
987 
988  // Binds value for this piece of metadata (as a pdb serialized set of bytes)
989  if ((sqlite3_bind_blob(stmt, 2, metadataBytes, numberOfBytes,
990  SQLITE_STATIC)) != SQLITE_OK) {
991  errorMessage = "Bind operation failed. " +
992  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
993  isSuccess = false;
994  }
995 
996  // Runs the insert statement
997  if (catalogSqlStep(stmt, errorMessage)) {
998  // Metadata item inserted in sqlite then add to pdb :: Vector in memory
999  addItemToVector(metadataValue, metadataCategory);
1000  isSuccess = true;
1001 
1002  } else {
1003  errorMessage = "Cannot add new item to Catalog";
1004  this->logger->writeLn(errorMessage);
1005  }
1006 
1007  sqlite3_finalize(stmt);
1008 
1009  pthread_mutex_unlock(&(registerMetadataMutex));
1010 
1011  if (isSuccess == true) {
1012  this->logger->debug("The following item metadata was stored in SQLite and "
1013  "loaded into Catalog memory:");
1014  this->logger->debug(metadataValue->printShort());
1015  }
1016  this->logger->writeLn(errorMessage);
1017  return isSuccess;
1018 }
1019 
1020 template <class CatalogMetadataType>
1022  pdb::Handle<CatalogMetadataType> &metadataValue, int &metadataCategory,
1023  string &errorMessage) {
1024 
1025  pthread_mutex_lock(&(registerMetadataMutex));
1026 
1027  // gets the key and index for this item in order to update the sqlite table
1028  // and
1029  // update the container in memory
1030  String metadataKey = metadataValue->getItemKey();
1031  int metadataIndex = std::atoi(metadataValue->getItemId().c_str());
1032 
1033  bool isSuccess = false;
1034  sqlite3_stmt *stmt = NULL;
1035  string sqlStatement = "UPDATE " +
1036  mapsPDBOjbect2SQLiteTable[metadataCategory] +
1037  " set itemInfo = ?, timeStamp = strftime('%s', 'now', "
1038  "'localtime') where itemId = ?";
1039 
1040  this->logger->debug(sqlStatement + " id: " + metadataKey.c_str());
1041 
1042  auto metadataBytes = getRecord<CatalogMetadataType>(metadataValue);
1043 
1044  size_t numberOfBytes = metadataBytes->numBytes();
1045 
1046  // Prepares statement
1047  if ((sqlite3_prepare_v2(sqliteDBHandler, sqlStatement.c_str(), -1, &stmt,
1048  NULL)) != SQLITE_OK) {
1049  errorMessage =
1050  "Prepared statement failed. " + (string)sqlite3_errmsg(sqliteDBHandler);
1051  this->logger->writeLn(errorMessage);
1052  isSuccess = false;
1053  }
1054 
1055  // Binds value for this piece of metadata (as a pdb serialized set of bytes)
1056  if ((sqlite3_bind_blob(stmt, 1, metadataBytes, numberOfBytes,
1057  SQLITE_STATIC)) != SQLITE_OK) {
1058 
1059  errorMessage = "Bind operation failed. " +
1060  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
1061  isSuccess = false;
1062  }
1063 
1064  // Binds key for this piece of metadata
1065  if ((sqlite3_bind_text(stmt, 2, metadataKey.c_str(), -1, SQLITE_STATIC)) !=
1066  SQLITE_OK) {
1067  errorMessage = "Bind operation failed. " +
1068  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
1069  isSuccess = false;
1070  }
1071 
1072  PDB_COUT << errorMessage << endl;
1073 
1074  // Runs the update statement
1075  if (catalogSqlStep(stmt, errorMessage)) {
1076  // if sqlite update goes well, updates container
1077  updateItemInVector(metadataIndex, metadataValue);
1078  isSuccess = true;
1079 
1080  PDB_COUT << "Metadata for the following item has been updated:"
1081  << metadataValue->printShort() << endl;
1082  } else {
1083  errorMessage = "Cannot update item in Catalog";
1084  }
1085  PDB_COUT << errorMessage << endl;
1086 
1087  sqlite3_finalize(stmt);
1088 
1089  pthread_mutex_unlock(&(registerMetadataMutex));
1090  return isSuccess;
1091 }
1092 
1093 template <class CatalogMetadataType>
1095  pdb::Handle<CatalogMetadataType> metadataValue, int &metadataCategory,
1096  string &errorMessage) {
1097 
1098  pthread_mutex_lock(&(registerMetadataMutex));
1099  // gets the key and index for this item in order to update the sqlite table
1100  // and update the container in memory
1101  String metadataKey = metadataValue->getItemKey();
1102  int metadataIndex = std::atoi(metadataValue->getItemId().c_str());
1103 
1104  bool isSuccess = false;
1105  sqlite3_stmt *stmt = NULL;
1106  string sqlStatement = "DELETE from " +
1107  mapsPDBOjbect2SQLiteTable[metadataCategory] +
1108  " where itemId = ?";
1109 
1110  PDB_COUT << sqlStatement << " id: " << metadataKey.c_str() << endl;
1111 
1112  // Prepares statement
1113  if ((sqlite3_prepare_v2(sqliteDBHandler, sqlStatement.c_str(), -1, &stmt,
1114  NULL)) != SQLITE_OK) {
1115  errorMessage =
1116  "Prepared statement failed. " + (string)sqlite3_errmsg(sqliteDBHandler);
1117  PDB_COUT << errorMessage << endl;
1118  isSuccess = false;
1119  }
1120 
1121  // Binds key for this piece of metadata
1122  if ((sqlite3_bind_text(stmt, 1, metadataKey.c_str(), -1, SQLITE_STATIC)) !=
1123  SQLITE_OK) {
1124  errorMessage = "Bind operation failed. " +
1125  (string)sqlite3_errmsg(sqliteDBHandler) + "\n";
1126  isSuccess = false;
1127  }
1128 
1129  PDB_COUT << errorMessage << endl;
1130 
1131  // Runs the update statement
1132  if (catalogSqlStep(stmt, errorMessage)) {
1133  // if sqlite update goes well, updates container
1134  deleteItemInVector(metadataIndex, metadataValue);
1135  isSuccess = true;
1136  } else {
1137  errorMessage = "Cannot delete item in Catalog";
1138  }
1139  PDB_COUT << errorMessage << endl;
1140 
1141  sqlite3_finalize(stmt);
1142 
1143  PDB_COUT << "Updating " << (*metadataValue).printShort() << endl;
1144 
1145  pthread_mutex_unlock(&(registerMetadataMutex));
1146  return isSuccess;
1147 }
1148 
1149 map<string, CatalogNodeMetadata> PDBCatalog::getListOfNodesInCluster() {
1150  return registeredNodes;
1151 }
1152 
1154  return mapsPDBOjbect2SQLiteTable[typeOfObject];
1155 }
1156 
1157 int PDBCatalog::getLastId(int &metadataCategory) {
1158  int lastId = 0;
1159  switch (metadataCategory) {
1160 
1162  lastId = registeredNodesMetadata->size();
1163  break;
1164  }
1165 
1167  lastId = registeredDatabasesMetadata->size();
1168  break;
1169  }
1170 
1172  lastId = registeredSetsMetadata->size();
1173  break;
1174  }
1175  }
1176  return lastId;
1177 }
1178 
1179 std::ostream &operator<<(std::ostream &out, PDBCatalog &catalog) {
1180  out << "--------------------------" << endl;
1181  out << "PDB Metadata Registered in the Catalog: " << endl;
1182 
1183  out << "\n Number of cluster nodes registered: " +
1184  std::to_string((int)catalog.registeredNodesMetadata->size())
1185  << endl;
1186  for (int i = 0; i < catalog.registeredNodesMetadata->size(); i++) {
1187  out << " Id: "
1188  << (*catalog.registeredNodesMetadata)[i].getItemId().c_str()
1189  << " | Node name: "
1190  << (*catalog.registeredNodesMetadata)[i].getItemName().c_str()
1191  << " | Node Address: "
1192  << (*catalog.registeredNodesMetadata)[i].getItemKey().c_str() << ":"
1193  << (*catalog.registeredNodesMetadata)[i].getNodePort() << endl;
1194  }
1195 
1196  out << "\n Number of databases registered: " +
1197  std::to_string((int)catalog.registeredDatabasesMetadata->size())
1198  << endl;
1199  for (int i = 0; i < catalog.registeredDatabasesMetadata->size(); i++) {
1200  out << " Id: "
1201  << (*catalog.registeredDatabasesMetadata)[i].getItemId().c_str()
1202  << " | Database: "
1203  << (*catalog.registeredDatabasesMetadata)[i].getItemName().c_str()
1204  << endl;
1205  }
1206 
1207  out << "\n Number of sets registered: " +
1208  std::to_string((int)catalog.registeredSetsMetadata->size())
1209  << endl;
1210  for (int i = 0; i < catalog.registeredSetsMetadata->size(); i++) {
1211  out << " Id: "
1212  << (*catalog.registeredSetsMetadata)[i].getItemId().c_str()
1213  << " | Key: "
1214  << (*catalog.registeredSetsMetadata)[i].getItemKey().c_str()
1215  << " | Database: "
1216  << (*catalog.registeredSetsMetadata)[i].getDBName().c_str()
1217  << " | Set: "
1218  << (*catalog.registeredSetsMetadata)[i].getItemName().c_str() << endl;
1219  }
1220 
1221  out << "\n Number of users registered: " +
1222  std::to_string((int)catalog.listUsersInCluster->size())
1223  << endl;
1224  for (int i = 0; i < catalog.listUsersInCluster->size(); i++) {
1225  out << (*catalog.listUsersInCluster)[i]->getItemName() << endl;
1226  }
1227 
1228  out << "\n Number of user-defined types registered: " +
1229  std::to_string(
1230  (int)catalog.registeredUserDefinedTypesMetadata->size())
1231  << endl;
1232  for (int i = 0; i < catalog.registeredUserDefinedTypesMetadata->size(); i++) {
1233  out << " Id: "
1234  << (*catalog.registeredUserDefinedTypesMetadata)[i].getItemId().c_str()
1235  << " | Type Name: "
1236  << (*catalog.registeredUserDefinedTypesMetadata)[i]
1237  .getItemName()
1238  .c_str()
1239  << endl;
1240  }
1241  out << "--------------------------" << endl;
1242  return out;
1243 }
1244 
1245 string PDBCatalog::itemName2ItemId(int &metadataCategory, string &key) {
1246  switch (metadataCategory) {
1248  return registeredNodes[key].getItemKey().c_str();
1249  break;
1250  }
1251 
1253  return registeredDatabases[key].getItemId().c_str();
1254  break;
1255  }
1256 
1258  return registeredSets[key].getItemKey().c_str();
1259  break;
1260  }
1261 
1263  // User-defined types are stored in a different type of map
1264  return registeredUserDefinedTypes[key].getObjectID().c_str();
1265  break;
1266  }
1267 
1268  default: {
1269  return "Unknown request!";
1270  break;
1271  }
1272  }
1273 }
1274 
1275 bool PDBCatalog::keyIsFound(int &metadataCategory, string &key, string &value) {
1276  value = "";
1277 
1278  switch (metadataCategory) {
1280  auto p = registeredNodes.find(key);
1281  if (p != registeredNodes.end()) {
1282  value = p->second.getItemKey().c_str();
1283  return true;
1284  }
1285  break;
1286  }
1287 
1289  auto p = registeredDatabases.find(key);
1290  if (p != registeredDatabases.end()) {
1291  value = p->second.getItemKey().c_str();
1292  return true;
1293  }
1294  break;
1295  }
1296 
1298  auto p = registeredSets.find(key);
1299  if (p != registeredSets.end()) {
1300  value = p->second.getItemKey().c_str();
1301  return true;
1302  }
1303  break;
1304  }
1305 
1307  auto p = registeredUserDefinedTypes.find(key);
1308  if (p != registeredUserDefinedTypes.end()) {
1309  value = p->second.getItemKey().c_str();
1310  return true;
1311  }
1312  break;
1313  }
1314 
1315  default: {
1316  return false;
1317  break;
1318  }
1319  }
1320 
1321  return false;
1322 }
1323 
1324 // Executes a sqlite3 query on the catalog database given by a query string.
1325 bool PDBCatalog::catalogSqlQuery(string queryString) {
1326 
1327  sqlite3_stmt *statement = NULL;
1328 
1329  if (sqlite3_prepare_v2(sqliteDBHandler, queryString.c_str(), -1, &statement,
1330  NULL) == SQLITE_OK) {
1331  int result = 0;
1332  result = sqlite3_step(statement);
1333  sqlite3_finalize(statement);
1334  return true;
1335  } else {
1336  string error = sqlite3_errmsg(sqliteDBHandler);
1337  if (error != "not an error") {
1338  this->logger->writeLn((string)queryString + " " + error);
1339  return true;
1340  } else {
1341  return false;
1342  }
1343  }
1344 }
1345 
1346 // Executes a sqlite3 statement query on the catalog database given by a query
1347 // string
1348 // works for inserts, updates and deletes
1349 bool PDBCatalog::catalogSqlStep(sqlite3_stmt *stmt, string &errorMsg) {
1350 
1351  int rc = 0;
1352  if ((rc = sqlite3_step(stmt)) == SQLITE_DONE) {
1353  return true;
1354  } else {
1355  errorMsg = sqlite3_errmsg(sqliteDBHandler);
1356  if (errorMsg != "not an error") {
1357  this->logger->writeLn("Problem running sqlite statement: " + errorMsg);
1358  return true;
1359  } else {
1360  return false;
1361  }
1362  }
1363 }
1364 
1366  Handle<Vector<CatalogDatabaseMetadata>> &databasesInCatalog,
1367  const string &keyToSearch) {
1368 
1369  String searchForKey(keyToSearch);
1370  this->logger->debug("keyToSearch=" + keyToSearch);
1371  this->logger->debug("searchForKey=" + string(searchForKey));
1372  if (keyToSearch == "")
1373  databasesInCatalog = registeredDatabasesMetadata;
1374  else {
1375  for (int i = 0; i < (*registeredDatabasesMetadata).size(); i++) {
1376  this->logger->debug("i=" + std::to_string(i));
1377  this->logger->debug((*registeredDatabasesMetadata)[i].getItemKey());
1378  if (searchForKey == (*registeredDatabasesMetadata)[i].getItemKey()) {
1379  databasesInCatalog->push_back((*registeredDatabasesMetadata)[i]);
1380  }
1381  }
1382  }
1383 }
1384 
1386  Handle<Vector<CatalogSetMetadata>> &setsInCatalog,
1387  const string &keyToSearch) {
1388  String searchForKey(keyToSearch);
1389  if (keyToSearch == "")
1390  setsInCatalog = registeredSetsMetadata;
1391  else {
1392  for (int i = 0; i < (*registeredSetsMetadata).size(); i++) {
1393  if (searchForKey == (*registeredSetsMetadata)[i].getItemKey()) {
1394  setsInCatalog->push_back((*registeredSetsMetadata)[i]);
1395  }
1396  }
1397  }
1398 }
1399 
1401  Handle<Vector<CatalogNodeMetadata>> &nodesInCatalog,
1402  const string &keyToSearch) {
1403  String searchForKey(keyToSearch);
1404  if (keyToSearch == "")
1405  nodesInCatalog = registeredNodesMetadata;
1406  else {
1407  for (int i = 0; i < (*registeredNodesMetadata).size(); i++) {
1408  if (searchForKey == (*registeredNodesMetadata)[i].getItemKey()) {
1409  nodesInCatalog->push_back((*registeredNodesMetadata)[i]);
1410  }
1411  }
1412  }
1413 }
1414 
1415 /* Explicit instantiation for adding Node Metadata to the catalog */
1416 template bool PDBCatalog::addMetadataToCatalog(
1417  pdb::Handle<CatalogNodeMetadata> &metadataValue,
1418  int &catalogType,
1419  string &errorMessage);
1420 
1421 /* Explicit instantiation for adding Set Metadata to the catalog */
1422 template bool
1424  pdb::Handle<CatalogSetMetadata> &metadataValue,
1425  int &catalogType,
1426  string &errorMessage);
1427 
1428 /* Explicit instantiation for adding Database Metadata to the catalog */
1429 template bool PDBCatalog::addMetadataToCatalog(
1430  pdb::Handle<CatalogDatabaseMetadata> &metadataValue,
1431  int &catalogType,
1432  string &errorMessage);
1433 
1434 /* Explicit instantiation for updating Node Metadata in the catalog */
1436  pdb::Handle<CatalogNodeMetadata> &metadataValue, int &catalogType,
1437  string &errorMessage);
1438 
1439 /* Explicit instantiation for updating Set Metadata in the catalog */
1441  pdb::Handle<CatalogSetMetadata> &metadataValue, int &catalogType,
1442  string &errorMessage);
1443 
1444 /* Explicit instantiation for updating Database Metadata in the catalog */
1446  pdb::Handle<CatalogDatabaseMetadata> &metadataValue, int &catalogType,
1447  string &errorMessage);
1448 
1449 /* Explicit instantiation for updating User-defined Type Metadata in the
1450  * catalog
1451  */
1453  pdb::Handle<CatalogUserTypeMetadata> &metadataValue, int &catalogType,
1454  string &errorMessage);
1455 
1456 /* Explicit instantiation for deleting Node Metadata from the catalog */
1458  pdb::Handle<CatalogNodeMetadata> metadataValue, int &catalogType,
1459  string &errorMessage);
1460 
1461 /* Explicit instantiation for deleting Set Metadata from the catalog */
1463  pdb::Handle<CatalogSetMetadata> metadataValue, int &catalogType,
1464  string &errorMessage);
1465 
1466 /* Explicit instantiation for deleting Database Metadata from the catalog */
1468  pdb::Handle<CatalogDatabaseMetadata> metadataValue, int &catalogType,
1469  string &errorMessage);
1470 
1471 /* Explicit instantiation for deleting User-defined Type Metadata from the
1472  * catalog */
1474  pdb::Handle<CatalogUserTypeMetadata> metadataValue, int &catalogType,
1475  string &errorMessage);
string catalogRootPath
Definition: PDBCatalog.h:529
string catalogFilename
Definition: PDBCatalog.h:535
Handle< Vector< CatalogSetMetadata > > registeredSetsMetadata
Definition: PDBCatalog.h:489
Handle< ObjType > getRootObject()
Definition: Record.cc:46
void listRegisteredDatabases(std::string &outputString, std::string &errMsg)
Definition: PDBCatalog.cc:593
PDBCatalog(PDBLoggerPtr logger, string location)
Definition: PDBCatalog.cc:165
Handle< Vector< CatalogUserTypeMetadata > > registeredUserDefinedTypesMetadata
Definition: PDBCatalog.h:511
bool deleteMetadataInCatalog(pdb::Handle< CatalogMetadataType > metadataValue, int &metadataCategory, string &errorMessage)
Definition: PDBCatalog.cc:1094
void listUserDefinedTypes(std::string &outputString, std::string &errMsg)
Definition: PDBCatalog.cc:622
Handle< pdb::Vector< Handle< CatalogUserTypeMetadata > > > listUsersInCluster
Definition: PDBCatalog.h:449
void errorLogCallback(void *pArg, int iErrCode, const char *zMsg)
Definition: PDBCatalog.cc:161
map< string, CatalogUserTypeMetadata > registeredUserDefinedTypes
Definition: PDBCatalog.h:505
bool getSerializedCatalog(string fileName, string version, string &returnedBytes, string &errorMessage)
Definition: PDBCatalog.cc:284
Handle< Vector< CatalogDatabaseMetadata > > registeredDatabasesMetadata
Definition: PDBCatalog.h:500
void listNodesInCluster(std::string &outputString, std::string &errMsg)
Definition: PDBCatalog.cc:579
void open()
Definition: PDBCatalog.cc:309
map< string, CatalogSetMetadata > registeredSets
Definition: PDBCatalog.h:483
void setUriPath(string thePath)
Definition: PDBCatalog.h:563
map< string, CatalogUserTypeMetadata > getUserDefinedTypesList()
Definition: PDBCatalog.cc:828
void loadsMetadataIntoMemory()
Definition: PDBCatalog.cc:359
string catalogVersion
Definition: PDBCatalog.h:428
map< int16_t, string > mapTypeIdToTypeName
Definition: PDBCatalog.h:467
void deleteTempSoFiles(string filePath)
Definition: PDBCatalog.cc:923
map< string, CatalogNodeMetadata > registeredNodes
Definition: PDBCatalog.h:472
void closeSQLiteHandler()
Definition: PDBCatalog.cc:271
int getLastId(int &metadataCategory)
Definition: PDBCatalog.cc:1157
string getMapsPDBOjbect2SQLiteTable(int typeOfObject)
Definition: PDBCatalog.cc:1153
bool retrievesDynamicLibrary(string fileName, string tableName, Handle< CatalogUserTypeMetadata > &returnedItem, string &returnedSoLibrary, string &errorName)
Definition: PDBCatalog.cc:835
string itemName2ItemId(int &metadataCategory, string &key)
Definition: PDBCatalog.cc:1245
Handle< Map< String, Handle< Vector< Object > > > > catalogContents
Definition: PDBCatalog.h:518
Handle< Vector< CatalogNodeMetadata > > registeredNodesMetadata
Definition: PDBCatalog.h:478
PDBLoggerPtr getLogger()
Definition: PDBCatalog.cc:269
bool getMetadataFromCatalog(bool onlyModified, string key, Handle< pdb::Vector< CatalogMetadataType >> &returnedEntries, string &errorMessage, int metadataCategory)
Definition: PDBCatalog.cc:637
bool addMetadataToCatalog(Handle< CatalogMetadataType > &metadataValue, int &metadataCategory, string &errorMessage)
Definition: PDBCatalog.cc:941
pthread_mutex_t registerMetadataMutex
Definition: PDBCatalog.h:423
size_t numBytes()
Definition: Record.cc:36
void listRegisteredSetsForADatabase(std::string databaseName, std::string &outputString, std::string &errMsg)
Definition: PDBCatalog.cc:607
#define PDB_COUT
Definition: PDBDebug.h:31
bool registerUserDefinedObject(int16_t typeCode, pdb::Handle< CatalogUserTypeMetadata > &objectToRegister, const string &objectBytes, const string &typeName, const string &fileName, const string &tableName, string &errorMessage)
Definition: PDBCatalog.cc:712
map< string, CatalogDatabaseMetadata > registeredDatabases
Definition: PDBCatalog.h:494
struct _stritem item
bool catalogSqlStep(sqlite3_stmt *stmt, string &errorMsg)
Definition: PDBCatalog.cc:1349
std::ostream & operator<<(std::ostream &out, PDBCatalog &catalog)
Definition: PDBCatalog.cc:1179
PDBLoggerPtr logger
Definition: PDBCatalog.h:433
map< string, int16_t > mapTypeNameToTypeID
Definition: PDBCatalog.h:461
void getModifiedMetadata(Handle< CatalogPrintMetadata > &itemMetadata)
Definition: PDBCatalog.cc:477
void setCatalogVersion(string version)
Definition: PDBCatalog.cc:276
string tempPath
Definition: PDBCatalog.h:541
std::shared_ptr< PDBLogger > PDBLoggerPtr
Definition: PDBLogger.h:40
bool addItemToVector(Handle< CatalogMetadataType > &item, int &key)
map< string, CatalogNodeMetadata > getListOfNodesInCluster()
Definition: PDBCatalog.cc:1149
char * c_str() const
Definition: PDBString.cc:184
void getListOfNodes(Handle< Vector< CatalogNodeMetadata >> &nodesInCatalog, const string &key)
Definition: PDBCatalog.cc:1400
void getListOfSets(Handle< Vector< CatalogSetMetadata >> &setsInCatalog, const string &key)
Definition: PDBCatalog.cc:1385
bool catalogSqlQuery(string statement)
Definition: PDBCatalog.cc:1325
bool updateMetadataInCatalog(pdb::Handle< CatalogMetadataType > &metadataValue, int &metadataCategory, string &errorMessage)
Definition: PDBCatalog.cc:1021
map< int, string > mapsPDBOjbect2SQLiteTable
Definition: PDBCatalog.h:575
bool deleteItemInVector(int &index, Handle< CatalogMetadataType > &item)
void getListOfDatabases(Handle< Vector< CatalogDatabaseMetadata >> &databasesInCatalog, const string &key)
Definition: PDBCatalog.cc:1365
string getCatalogVersion()
Definition: PDBCatalog.cc:280
map< int, string > mapsPDBArrayOjbect2SQLiteTable
Definition: PDBCatalog.h:582
sqlite3 * sqliteDBHandler
Definition: PDBCatalog.h:438
bool keyIsFound(int &metadataCategory, string &key, string &value)
Definition: PDBCatalog.cc:1275
string uriPath
Definition: PDBCatalog.h:524
bool updateItemInVector(int &index, Handle< CatalogMetadataType > &item)
void printsAllCatalogMetadata(std::string &outputString, std::string &errMsg)
Definition: PDBCatalog.cc:570