| 1 | /********************************************************************** |
|---|
| 2 | * Copyright (c) 2005-2008 David Carter <dcarter@arm4.org> and others. |
|---|
| 3 | * All rights reserved. This program and the accompanying materials |
|---|
| 4 | * are made available under the terms of the Eclipse Public License v1.0 |
|---|
| 5 | * which accompanies this distribution, and is available at |
|---|
| 6 | * http://www.eclipse.org/legal/epl-v10.html |
|---|
| 7 | * |
|---|
| 8 | * Contributors: |
|---|
| 9 | * David Carter - Initial API and implementation |
|---|
| 10 | **********************************************************************/ |
|---|
| 11 | |
|---|
| 12 | #ifndef LIBARM4DB_H /* Prevent multiple inclusion */ |
|---|
| 13 | #define LIBARM4DB_H 1 |
|---|
| 14 | |
|---|
| 15 | #include <list> |
|---|
| 16 | #include <iostream> |
|---|
| 17 | #include <libxml/xmlreader.h> |
|---|
| 18 | |
|---|
| 19 | #include "arm4_shm.h" |
|---|
| 20 | #include "arm4_db.h" |
|---|
| 21 | #include "Arm4dbConfig.h" |
|---|
| 22 | #include "Arm4dbBackEnd.h" |
|---|
| 23 | |
|---|
| 24 | class Arm4db { |
|---|
| 25 | public: |
|---|
| 26 | /* Constructors */ |
|---|
| 27 | |
|---|
| 28 | /* Destructors */ |
|---|
| 29 | virtual ~Arm4db (); |
|---|
| 30 | |
|---|
| 31 | /* Accessors */ |
|---|
| 32 | |
|---|
| 33 | /* Mutators */ |
|---|
| 34 | |
|---|
| 35 | /* Operations */ |
|---|
| 36 | static Arm4db *getArm4db (const Arm4dbConfig &config); /* Singleton factory method */ |
|---|
| 37 | static Arm4db *getArm4db (void); |
|---|
| 38 | |
|---|
| 39 | arm_error_t closeDatabases (void); |
|---|
| 40 | arm_error_t removeDatabases (void); |
|---|
| 41 | |
|---|
| 42 | std::ostream& exportDefinitions (std::ostream &os) const; |
|---|
| 43 | std::ostream& exportAll (std::ostream &os) const; |
|---|
| 44 | void import (const char *filename_ptr); |
|---|
| 45 | void importFromMemory (const std::string &xml); |
|---|
| 46 | |
|---|
| 47 | void initializeThread (void) { m_backendPtr->initializeThread (); } |
|---|
| 48 | |
|---|
| 49 | arm_error_t openDatabases (void) { return m_backendPtr->openDatabases (); } |
|---|
| 50 | arm_error_t openDatabasesReadOnly (void) { return m_backendPtr->openDatabasesReadOnly (); } |
|---|
| 51 | arm_error_t closeDatabasesNoLock (void) { return m_backendPtr->closeDatabasesNoLock (); } |
|---|
| 52 | |
|---|
| 53 | arm_error_t initializeSequences (arm4_shm_header_t *header_ptr) { return m_backendPtr->initializeSequences (header_ptr); } |
|---|
| 54 | |
|---|
| 55 | arm_error_t processApplicationInstances (const arm4_shm_application_instance_t *app_instance_ptr) |
|---|
| 56 | { return m_backendPtr->processApplicationInstances (app_instance_ptr); } |
|---|
| 57 | arm_error_t processApplicationGroup (const arm4_shm_property_t *group_ptr) |
|---|
| 58 | { return m_backendPtr->processApplicationGroup (group_ptr); } |
|---|
| 59 | arm_error_t processApplicationInstanceId (const arm4_shm_property_t *property_ptr) |
|---|
| 60 | { return m_backendPtr->processApplicationInstanceId (property_ptr); } |
|---|
| 61 | arm_error_t processApplicationContext (const arm4_shm_context_property_t *property_ptr) |
|---|
| 62 | { return m_backendPtr->processApplicationContext (property_ptr); } |
|---|
| 63 | arm_error_t processApplicationAddress (const arm4_shm_address_t *address_ptr) |
|---|
| 64 | { return m_backendPtr->processApplicationAddress (address_ptr); } |
|---|
| 65 | arm_error_t processTransactionInstances (const arm4_shm_transaction_instance_t *tran_instance_ptr) |
|---|
| 66 | { return m_backendPtr->processTransactionInstances (tran_instance_ptr); } |
|---|
| 67 | arm_error_t processTransactionContext (const arm4_shm_context_property_t *property_ptr) |
|---|
| 68 | { return m_backendPtr->processTransactionContext (property_ptr); } |
|---|
| 69 | arm_error_t processTransactionUri (const arm4_shm_uri_t *uri_ptr) |
|---|
| 70 | { return m_backendPtr->processTransactionUri (uri_ptr); } |
|---|
| 71 | arm_error_t processTransactionMetricValue (const arm4_shm_metric_value_t *metric_ptr) |
|---|
| 72 | { return m_backendPtr->processTransactionMetricValue (metric_ptr); } |
|---|
| 73 | arm_error_t processTransactionUser (const arm4_shm_user_t *user_ptr) |
|---|
| 74 | { return m_backendPtr->processTransactionUser (user_ptr); } |
|---|
| 75 | arm_error_t processTransactionDiag (const arm4_shm_diag_t *diag_ptr) |
|---|
| 76 | { return m_backendPtr->processTransactionDiag (diag_ptr); } |
|---|
| 77 | arm_error_t processCorrelators (const arm4_shm_correlator_t *correlator_ptr) |
|---|
| 78 | { return m_backendPtr->processCorrelators (correlator_ptr); } |
|---|
| 79 | arm_error_t processSequence (const arm4_shm_db_sequence_t *sequence_ptr) |
|---|
| 80 | { return m_backendPtr->processSequence (sequence_ptr); } |
|---|
| 81 | arm_error_t processRegisterApplication (const arm4_shm_register_application_t *application_ptr, |
|---|
| 82 | arm_id_t *appid_ptr, |
|---|
| 83 | arm_boolean_t *is_new_ptr) |
|---|
| 84 | { return m_backendPtr->processRegisterApplication (application_ptr, appid_ptr, is_new_ptr); } |
|---|
| 85 | arm_error_t processRegisterApplicationIdentity (const arm4_shm_register_application_identity_t *identity_ptr) |
|---|
| 86 | { return m_backendPtr->processRegisterApplicationIdentity (identity_ptr); } |
|---|
| 87 | arm_error_t processRegisterApplicationContext (const arm4_shm_register_application_context_t *context_ptr) |
|---|
| 88 | { return m_backendPtr->processRegisterApplicationContext (context_ptr); } |
|---|
| 89 | arm_error_t processRegisterTransaction (const arm4_shm_register_transaction_t *transaction_ptr, |
|---|
| 90 | arm_id_t *tranid_ptr, |
|---|
| 91 | arm_boolean_t *is_new_ptr) |
|---|
| 92 | { return m_backendPtr->processRegisterTransaction (transaction_ptr, tranid_ptr, is_new_ptr); } |
|---|
| 93 | arm_error_t processRegisterTransactionIdentity (const arm4_shm_register_application_identity_t *identity_ptr) |
|---|
| 94 | { return m_backendPtr->processRegisterTransactionIdentity (identity_ptr); } |
|---|
| 95 | arm_error_t processRegisterTransactionContext (const arm4_shm_register_application_context_t *context_ptr) |
|---|
| 96 | { return m_backendPtr->processRegisterTransactionContext (context_ptr); } |
|---|
| 97 | arm_error_t processRegisterTransactionUri (const arm4_shm_register_transaction_uri_t *uri_ptr) |
|---|
| 98 | { return m_backendPtr->processRegisterTransactionUri (uri_ptr); } |
|---|
| 99 | arm_error_t processRegisterTransactionMetricBinding (const arm4_shm_register_transaction_metric_t *metric_ptr) |
|---|
| 100 | { return m_backendPtr->processRegisterTransactionMetricBinding (metric_ptr); } |
|---|
| 101 | arm_error_t processRegisterMetric (arm4_shm_register_metric_t *metric_ptr, arm_id_t *metricid_ptr) |
|---|
| 102 | { return m_backendPtr->processRegisterMetric (metric_ptr, metricid_ptr); } |
|---|
| 103 | arm_error_t processTraceStats (arm_time_t sample_time, arm4db_transaction_trace_stats_t *stats_ptr, int transaction_count) |
|---|
| 104 | { return m_backendPtr->processTraceStats (sample_time, stats_ptr, transaction_count); } |
|---|
| 105 | |
|---|
| 106 | void saveApplicationDefinition (const arm_id_t &appl_id, const application_record_t &application) |
|---|
| 107 | { m_backendPtr->saveApplicationDefinition (appl_id, application); } |
|---|
| 108 | void saveApplicationIdentity (const arm_id_t &appl_id, const property_record_t &property) |
|---|
| 109 | { m_backendPtr->saveApplicationIdentity (appl_id, property); } |
|---|
| 110 | void saveApplicationContext (const arm_id_t &appl_id, const indexed_property_name_record_t &property) |
|---|
| 111 | { m_backendPtr->saveApplicationContext (appl_id, property); } |
|---|
| 112 | |
|---|
| 113 | void saveMetricDefinition (const arm_id_t &metric_id, const metric_record_t &metric) |
|---|
| 114 | { m_backendPtr->saveMetricDefinition (metric_id, metric); } |
|---|
| 115 | |
|---|
| 116 | void saveTransactionDefinition (const arm_id_t &tran_id, const transaction_record_t &transaction) |
|---|
| 117 | { m_backendPtr->saveTransactionDefinition (tran_id, transaction); } |
|---|
| 118 | void saveTransactionIdentity (const arm_id_t &tran_id, const property_record_t &property) |
|---|
| 119 | { m_backendPtr->saveTransactionIdentity (tran_id, property); } |
|---|
| 120 | void saveTransactionContext (const arm_id_t &tran_id, const indexed_property_name_record_t &property) |
|---|
| 121 | { m_backendPtr->saveTransactionContext (tran_id, property); } |
|---|
| 122 | void saveTransactionUri (const arm_id_t &tran_id, const char *uri_ptr) |
|---|
| 123 | { m_backendPtr->saveTransactionUri (tran_id, uri_ptr); } |
|---|
| 124 | void saveTransactionMetric (const arm_id_t &tran_id, const arm_metric_binding_t &binding) |
|---|
| 125 | { m_backendPtr->saveTransactionMetric (tran_id, binding); } |
|---|
| 126 | |
|---|
| 127 | void saveApplicationInstance (const arm_app_start_handle_t app_handle, const application_instance_record_t &application) |
|---|
| 128 | { m_backendPtr->saveApplicationInstance (app_handle, application); } |
|---|
| 129 | void saveAppInstanceContextValue (const arm_app_start_handle_t app_handle, const indexed_property_value_record_t &property) |
|---|
| 130 | { m_backendPtr->saveAppInstanceContextValue (app_handle, property); } |
|---|
| 131 | void saveAppInstanceGroup (const arm_app_start_handle_t app_handle, const char *group_ptr) |
|---|
| 132 | { m_backendPtr->saveAppInstanceGroup (app_handle, group_ptr); } |
|---|
| 133 | void saveAppInstanceName (const arm_app_start_handle_t app_handle, const char *name_ptr) |
|---|
| 134 | { m_backendPtr->saveAppInstanceName (app_handle, name_ptr); } |
|---|
| 135 | void saveAppInstanceAddress (const arm_app_start_handle_t app_handle, const application_address_record_t &address_value) |
|---|
| 136 | { m_backendPtr->saveAppInstanceAddress (app_handle, address_value); } |
|---|
| 137 | |
|---|
| 138 | void saveTransactionInstance (const arm_tran_start_handle_t tran_handle, const transaction_instance_record_t &transaction) |
|---|
| 139 | { m_backendPtr->saveTransactionInstance (tran_handle, transaction); } |
|---|
| 140 | void saveTranInstanceContextValue (const arm_tran_start_handle_t tran_handle, const indexed_property_value_record_t &property) |
|---|
| 141 | { m_backendPtr->saveTranInstanceContextValue (tran_handle, property); } |
|---|
| 142 | void saveTranInstanceMetricValue (const arm_tran_start_handle_t tran_handle, const metric_value_record_t &metric) |
|---|
| 143 | { m_backendPtr->saveTranInstanceMetricValue (tran_handle, metric); } |
|---|
| 144 | void saveTranInstanceUri (const arm_tran_start_handle_t tran_handle, const char *uri_ptr) |
|---|
| 145 | { m_backendPtr->saveTranInstanceUri (tran_handle, uri_ptr); } |
|---|
| 146 | void saveTranInstanceUser (const arm_tran_start_handle_t tran_handle, const user_record_t &user) |
|---|
| 147 | { m_backendPtr->saveTranInstanceUser (tran_handle, user); } |
|---|
| 148 | void saveTranInstanceDiag (const arm_tran_start_handle_t tran_handle, const char *diag_ptr) |
|---|
| 149 | { m_backendPtr->saveTranInstanceDiag (tran_handle, diag_ptr); } |
|---|
| 150 | void saveTranCorrelator (const arm_tran_start_handle_t tran_handle, const arm_correlator_t *correlator_ptr) |
|---|
| 151 | { m_backendPtr->saveTranCorrelator (tran_handle, correlator_ptr); } |
|---|
| 152 | void saveTranParentCorrelator (const arm_tran_start_handle_t tran_handle, const arm_correlator_t *correlator_ptr) |
|---|
| 153 | { m_backendPtr->saveTranParentCorrelator (tran_handle, correlator_ptr); } |
|---|
| 154 | |
|---|
| 155 | void saveTraceStats (const arm_time_t sample_time, const arm4db_transaction_trace_stats_t &trace_stats) |
|---|
| 156 | { m_backendPtr->saveTraceStats (sample_time, trace_stats); } |
|---|
| 157 | |
|---|
| 158 | /* Checkpoint the database transactions */ |
|---|
| 159 | void checkpoint (void) { m_backendPtr->checkpoint (); } |
|---|
| 160 | |
|---|
| 161 | /* Get transaction stats */ |
|---|
| 162 | void *getStats (void) { return m_backendPtr->getStats (); } |
|---|
| 163 | |
|---|
| 164 | /* Debugging routines */ |
|---|
| 165 | void dump (void) const { m_backendPtr->dump (); } |
|---|
| 166 | |
|---|
| 167 | /* Database backup and rollover */ |
|---|
| 168 | void backup (void) { m_backendPtr->backup (); } |
|---|
| 169 | |
|---|
| 170 | /* Reporting functions */ |
|---|
| 171 | void printSummaries (void) const { m_backendPtr->printSummaries (); } |
|---|
| 172 | void printTransactions (void) const { m_backendPtr->printTransactions (); } |
|---|
| 173 | |
|---|
| 174 | std::list<arm_id_t> *getApplicationList (void) |
|---|
| 175 | { return m_backendPtr->getApplicationList (); } |
|---|
| 176 | std::list<arm_id_t> *getTransactionList (void) |
|---|
| 177 | { return m_backendPtr->getTransactionList (); } |
|---|
| 178 | std::list<arm_id_t> *getTransactionList (const arm_id_t &app_id) |
|---|
| 179 | { return m_backendPtr->getTransactionList (app_id); } |
|---|
| 180 | std::list<arm_tran_start_handle_t> *getTransactionInstanceList (const arm_id_t &tran_id) |
|---|
| 181 | { return m_backendPtr->getTransactionInstanceList (tran_id); } |
|---|
| 182 | int getApplicationCount (void) |
|---|
| 183 | { return m_backendPtr->getApplicationCount (); } |
|---|
| 184 | int getTransactionCount (void) |
|---|
| 185 | { return m_backendPtr->getTransactionCount (); } |
|---|
| 186 | int getTransactionCount (const arm_id_t &app_id) |
|---|
| 187 | { return m_backendPtr->getTransactionCount (app_id); } |
|---|
| 188 | |
|---|
| 189 | arm_error_t getApplicationInformation (const arm_id_t &app_id, arm4db_application_summary_t *summary_ptr) |
|---|
| 190 | { return m_backendPtr->getApplicationInformation (app_id, summary_ptr); } |
|---|
| 191 | arm_error_t getTransactionInformation (const arm_id_t &tran_id, arm4db_transaction_summary_t *summary_ptr) |
|---|
| 192 | { return m_backendPtr->getTransactionInformation (tran_id, summary_ptr); } |
|---|
| 193 | const arm_correlator_t *getCorrelator (arm_tran_start_handle_t tran_handle, arm_correlator_t *correlator_ptr) |
|---|
| 194 | { return m_backendPtr->getCorrelator (tran_handle, correlator_ptr); } |
|---|
| 195 | const arm_correlator_t *getParentCorrelator (arm_tran_start_handle_t tran_handle, arm_correlator_t *correlator_ptr) |
|---|
| 196 | { return m_backendPtr->getParentCorrelator (tran_handle, correlator_ptr); } |
|---|
| 197 | |
|---|
| 198 | void setTransactionTraceInformation (const arm_id_t &tran_id, const arm4db_transaction_summary_t &summary) |
|---|
| 199 | { m_backendPtr->setTransactionTraceInformation (tran_id, summary); } |
|---|
| 200 | |
|---|
| 201 | std::ostream& exportApplicationDefinitions (std::ostream &os) const |
|---|
| 202 | { return m_backendPtr->exportApplicationDefinitions (os); } |
|---|
| 203 | std::ostream& exportTransactionDefinitions (std::ostream &os) const |
|---|
| 204 | { return m_backendPtr->exportTransactionDefinitions (os); } |
|---|
| 205 | std::ostream& exportMetricDefinitions (std::ostream &os) const |
|---|
| 206 | { return m_backendPtr->exportMetricDefinitions (os); } |
|---|
| 207 | std::ostream& exportApplications (std::ostream &os) const |
|---|
| 208 | { return m_backendPtr->exportApplications (os); } |
|---|
| 209 | std::ostream& exportTransactions (std::ostream &os) const |
|---|
| 210 | { return m_backendPtr->exportTransactions (os); } |
|---|
| 211 | std::ostream& exportTraceStats (std::ostream &os) const |
|---|
| 212 | { return m_backendPtr->exportTraceStats (os); } |
|---|
| 213 | |
|---|
| 214 | /* Operators */ |
|---|
| 215 | |
|---|
| 216 | private: |
|---|
| 217 | /* The main constructor is protected so we can implement a factory */ |
|---|
| 218 | Arm4db (); |
|---|
| 219 | |
|---|
| 220 | /* Mark these as private to prevent their use */ |
|---|
| 221 | Arm4db (const Arm4db &); |
|---|
| 222 | Arm4db &operator= (const Arm4db &); |
|---|
| 223 | |
|---|
| 224 | static const Arm4dbConfig &getConfig (void) { return Arm4dbConfig::getConfig (); } |
|---|
| 225 | void setBackEnd (void); |
|---|
| 226 | void initializeLibrary (void) { m_backendPtr->initializeLibrary (); } |
|---|
| 227 | |
|---|
| 228 | // XML Parser routines |
|---|
| 229 | void streamReader(xmlTextReaderPtr reader); |
|---|
| 230 | void streamFile(const char *filename); |
|---|
| 231 | void streamFileFromMemory(const std::string &xml); |
|---|
| 232 | |
|---|
| 233 | const xmlChar *getTextNode(xmlTextReaderPtr reader); |
|---|
| 234 | arm_int32_t getIntNode(xmlTextReaderPtr reader); |
|---|
| 235 | arm_int64_t getInt64Node(xmlTextReaderPtr reader); |
|---|
| 236 | void getTimeNode(xmlTextReaderPtr reader, arm_time_t &time_value); |
|---|
| 237 | void getIdNode(xmlTextReaderPtr reader, arm_id_t &id); |
|---|
| 238 | void getDigestNode(xmlTextReaderPtr reader, char *digest_ptr); |
|---|
| 239 | void getAddressNode(xmlTextReaderPtr reader, arm_uint8_t *address_ptr); |
|---|
| 240 | void getCorrelatorNode(xmlTextReaderPtr reader, arm_correlator_t *correlator_ptr); |
|---|
| 241 | void getMetricNode(xmlTextReaderPtr reader, metric_value_record_t &metric); |
|---|
| 242 | |
|---|
| 243 | void processAnyNode(xmlTextReaderPtr reader); |
|---|
| 244 | |
|---|
| 245 | void processArm4ApplicationDefinitionNode(xmlTextReaderPtr reader); |
|---|
| 246 | void processApplicationIdentity(xmlTextReaderPtr reader, const arm_id_t &appl_id); |
|---|
| 247 | void processApplicationContext(xmlTextReaderPtr reader, const arm_id_t &appl_id); |
|---|
| 248 | |
|---|
| 249 | void processArm4MetricDefinitionNode(xmlTextReaderPtr reader); |
|---|
| 250 | |
|---|
| 251 | void processArm4TransactionDefinitionNode(xmlTextReaderPtr reader); |
|---|
| 252 | void processTransactionIdentity(xmlTextReaderPtr reader, const arm_id_t &tran_id); |
|---|
| 253 | void processTransactionContext(xmlTextReaderPtr reader, const arm_id_t &tran_id); |
|---|
| 254 | void processTransactionMetric(xmlTextReaderPtr reader, const arm_id_t &tran_id); |
|---|
| 255 | |
|---|
| 256 | void processArm4ApplicationInstanceNode(xmlTextReaderPtr reader); |
|---|
| 257 | void processAppInstanceContextValue(xmlTextReaderPtr reader, const arm_app_start_handle_t app_handle); |
|---|
| 258 | void processAppInstanceAddress(xmlTextReaderPtr reader, const arm_app_start_handle_t app_handle); |
|---|
| 259 | |
|---|
| 260 | void processArm4TransactionInstanceNode(xmlTextReaderPtr reader); |
|---|
| 261 | void processTranInstanceContextValue(xmlTextReaderPtr reader, const arm_tran_start_handle_t tran_handle); |
|---|
| 262 | void processTranInstanceMetricValue(xmlTextReaderPtr reader, const arm_tran_start_handle_t tran_handle); |
|---|
| 263 | void processTranInstanceUser(xmlTextReaderPtr reader, const arm_tran_start_handle_t tran_handle); |
|---|
| 264 | |
|---|
| 265 | void processArm4TransactionTraceNode(xmlTextReaderPtr reader); |
|---|
| 266 | |
|---|
| 267 | void processArm4DefinitionsNode(xmlTextReaderPtr reader); |
|---|
| 268 | void processArm4InstancesNode(xmlTextReaderPtr reader); |
|---|
| 269 | void processArm4Node(xmlTextReaderPtr reader); |
|---|
| 270 | void processRootNode(xmlTextReaderPtr reader); |
|---|
| 271 | |
|---|
| 272 | |
|---|
| 273 | static Arm4dbBackEnd *m_backendPtr; // The actual database backend |
|---|
| 274 | static Arm4db *m_singletonPtr; // The current database instance |
|---|
| 275 | }; |
|---|
| 276 | |
|---|
| 277 | #endif /* LIBARM4DB_H */ |
|---|