source: trunk/include/BerkeleyDB.h @ 704

Revision 694, 19.7 KB checked in by dcarter, 3 years ago (diff)

see #54: code cleanup

Line 
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 BERKELEYDB_H    /* Prevent multiple inclusion */
13#define BERKELEYDB_H 1
14
15#include <db_cxx.h>
16#include "Arm4dbBackEnd.h"
17
18#define WRAP_EXCEPTION(status,command) \
19    {\
20    try { (status) = (command); } \
21    catch (DbRunRecoveryException r) { panic (r, __FILE__, __LINE__); } \
22    catch (DbException e) { status = e.get_errno (); }\
23    }
24
25#define WRAP_EXCEPTION_STEP(status,command,step) \
26    {\
27    try { (status) = (command); step++; } \
28    catch (DbRunRecoveryException r) { panic (r, __FILE__, __LINE__); } \
29    catch (DbException e) { status = e.get_errno (); }\
30    }
31
32#define MAX_FAILURES    (5)
33
34/* The various databases */
35#define SEQUENCE_DB_NAME                                                        "arm4_sequence.db"
36
37#define APPLICATION_DB_NAME                                                     "arm4_appl.db"
38#define APPLICATION_NAME_DB_NAME                                        "arm4_appl_name.db"
39#define APPLICATION_IDENTITY_DB_NAME                            "arm4_appl_identity.db"
40#define APPLICATION_CONTEXT_NAMES_DB_NAME                       "arm4_appl_context_names.db"
41#define APPLICATION_INSTANCE_DB_NAME                            "arm4_appl_instance.db"
42#define APPLICATION_INSTANCE_APP_DB_NAME                        "arm4_appl_instance_app.db"
43#define APPLICATION_GROUP_DB_NAME                                       "arm4_appl_group.db"
44#define APPLICATION_INSTANCE_NAMES_DB_NAME                      "arm4_appl_instance_names.db"
45#define APPLICATION_CONTEXT_VALUES_DB_NAME                      "arm4_appl_context_values.db"
46#define APPLICATION_ADDRESS_DB_NAME                                     "arm4_appl_address.db"
47
48#define TRANSACTION_DB_NAME                                                     "arm4_tran.db"
49#define TRANSACTION_NAME_DB_NAME                                        "arm4_tran_name.db"
50#define TRANSACTION_APPID_DB_NAME                                       "arm4_tran_appid.db"
51#define TRANSACTION_IDENTITY_DB_NAME                            "arm4_tran_identity.db"
52#define TRANSACTION_CONTEXT_NAMES_DB_NAME                       "arm4_tran_context_names.db"
53#define TRANSACTION_IDENTITY_URI_DB_NAME                        "arm4_tran_identity_uri.db"
54#define TRANSACTION_METRIC_BINDING_DB_NAME                      "arm4_tran_metric_binding.db"
55#define TRANSACTION_INSTANCE_DB_NAME                            "arm4_tran_instance.db"
56#define TRANSACTION_INSTANCE_TRANID_DB_NAME                     "arm4_tran_instance_tranid.db"
57#define TRANSACTION_INSTANCE_APP_HANDLE_DB_NAME         "arm4_tran_instance_app_handle.db"
58#define TRANSACTION_CONTEXT_VALUES_DB_NAME                      "arm4_tran_context_values.db"
59#define TRANSACTION_CONTEXT_URI_DB_NAME                         "arm4_tran_context_uri.db"
60#define TRANSACTION_CONTEXT_METRIC_VALUE_DB_NAME        "arm4_tran_context_metric_value.db"
61#define TRANSACTION_CONTEXT_USER_DB_NAME                        "arm4_tran_context_user.db"
62#define TRANSACTION_CONTEXT_DIAG_DB_NAME                        "arm4_tran_context_diag.db"
63
64#define METRIC_DB_NAME                              "arm4_metric.db"
65#define METRIC_NAME_DB_NAME                                             "arm4_metric_name.db"
66#define METRIC_APPID_DB_NAME                                        "arm4_metric_appid.db"
67
68#define CORRELATOR_PARENT_DB_NAME                                       "arm4_correlator_parent.db"
69#define CORRELATOR_CURRENT_DB_NAME                                      "arm4_correlator_current.db"
70
71#define TRACE_STAT_DB_NAME                                                      "arm4_trace_stat.db"
72#define APPDEX_STAT_DB_NAME                                                     "arm4_appdex_stat.db"
73
74
75class BerkeleyDB : public Arm4dbBackEnd
76{
77public:
78        /* Constructors */
79        BerkeleyDB ();
80
81        /* Destructors */
82        virtual ~BerkeleyDB ();
83
84        /* Accessors */
85
86        /* Mutators */
87
88        /* Operations */
89        void initializeLibrary (void);
90        void initializeThread (void);
91
92        arm_error_t openDatabases (void);
93        arm_error_t openDatabasesReadOnly (void);
94        arm_error_t closeDatabasesNoLock (void);
95
96        arm_error_t initializeSequences (arm4_shm_header_t *header_ptr);
97
98        arm_error_t processApplicationInstances (const arm4_shm_application_instance_t *app_instance_ptr);
99        arm_error_t processApplicationGroup (const arm4_shm_property_t *group_ptr);
100        arm_error_t processApplicationInstanceId (const arm4_shm_property_t *property_ptr);
101        arm_error_t processApplicationContext (const arm4_shm_context_property_t *property_ptr);
102        arm_error_t processApplicationAddress (const arm4_shm_address_t *address_ptr);
103        arm_error_t processTransactionInstances (const arm4_shm_transaction_instance_t *tran_instance_ptr);
104        arm_error_t processTransactionContext (const arm4_shm_context_property_t *property_ptr);
105        arm_error_t processTransactionUri (const arm4_shm_uri_t *uri_ptr);
106        arm_error_t processTransactionMetricValue (const arm4_shm_metric_value_t *metric_ptr);
107        arm_error_t processTransactionUser (const arm4_shm_user_t *user_ptr);
108        arm_error_t processTransactionDiag (const arm4_shm_diag_t *diag_ptr);
109        arm_error_t processCorrelators (const arm4_shm_correlator_t *correlator_ptr);
110        arm_error_t processSequence (const arm4_shm_db_sequence_t *sequence_ptr);
111        arm_error_t processRegisterApplication (const arm4_shm_register_application_t *application_ptr,
112                arm_id_t *appid_ptr,
113                arm_boolean_t *is_new_ptr);
114        arm_error_t processRegisterApplicationIdentity (const arm4_shm_register_application_identity_t *identity_ptr);
115        arm_error_t processRegisterApplicationContext (const arm4_shm_register_application_context_t *context_ptr);
116        arm_error_t processRegisterTransaction (const arm4_shm_register_transaction_t *transaction_ptr,
117                arm_id_t *tranid_ptr,
118                arm_boolean_t *is_new_ptr);
119        arm_error_t processRegisterTransactionIdentity (const arm4_shm_register_application_identity_t *identity_ptr);
120        arm_error_t processRegisterTransactionContext (const arm4_shm_register_application_context_t *context_ptr);
121        arm_error_t processRegisterTransactionUri (const arm4_shm_register_transaction_uri_t *uri_ptr);
122        arm_error_t processRegisterTransactionMetricBinding (const arm4_shm_register_transaction_metric_t *metric_ptr);
123        arm_error_t processRegisterMetric (arm4_shm_register_metric_t *metric_ptr,
124                arm_id_t *metricid_ptr);
125        arm_error_t processTraceStats (arm_time_t sample_time, arm4db_transaction_trace_stats_t *stats_ptr, int transaction_count);
126
127        void saveApplicationDefinition (const arm_id_t &appl_id, const application_record_t &application);
128        void saveApplicationIdentity (const arm_id_t &appl_id, const property_record_t &property);
129        void saveApplicationContext (const arm_id_t &appl_id, const indexed_property_name_record_t &property);
130
131        void saveMetricDefinition (const arm_id_t &metric_id, const metric_record_t &metric);
132       
133        void saveTransactionDefinition (const arm_id_t &tran_id, const transaction_record_t &transaction);
134        void saveTransactionIdentity (const arm_id_t &tran_id, const property_record_t &property);
135        void saveTransactionContext (const arm_id_t &tran_id, const indexed_property_name_record_t &property);
136        void saveTransactionUri (const arm_id_t &tran_id, const char *uri_ptr);
137        void saveTransactionMetric (const arm_id_t &tran_id, const arm_metric_binding_t &binding);
138
139        void saveApplicationInstance (const arm_app_start_handle_t app_handle, const application_instance_record_t &application);
140        void saveAppInstanceContextValue (const arm_app_start_handle_t app_handle, const indexed_property_value_record_t &property);
141        void saveAppInstanceGroup (const arm_app_start_handle_t app_handle, const char *group_ptr);
142        void saveAppInstanceName (const arm_app_start_handle_t app_handle, const char *name_ptr);
143        void saveAppInstanceAddress (const arm_app_start_handle_t app_handle, const application_address_record_t &address_value);
144
145        void saveTransactionInstance (const arm_tran_start_handle_t tran_handle, const transaction_instance_record_t &transaction);
146        void saveTranInstanceContextValue (const arm_tran_start_handle_t tran_handle, const indexed_property_value_record_t &property);
147        void saveTranInstanceMetricValue (const arm_tran_start_handle_t tran_handle, const metric_value_record_t &metric);
148        void saveTranInstanceUri (const arm_tran_start_handle_t tran_handle, const char *uri_ptr);
149        void saveTranInstanceUser (const arm_tran_start_handle_t tran_handle, const user_record_t &user);
150        void saveTranInstanceDiag (const arm_tran_start_handle_t tran_handle, const char *diag_ptr);
151        void saveTranCorrelator (const arm_tran_start_handle_t tran_handle, const arm_correlator_t *correlator_ptr);
152        void saveTranParentCorrelator (const arm_tran_start_handle_t tran_handle, const arm_correlator_t *correlator_ptr);
153
154        void saveTraceStats (const arm_time_t sample_time, const arm4db_transaction_trace_stats_t &trace_stats);
155
156        /* Checkpoint the database transactions */
157        virtual void checkpoint (void);
158       
159        /* Get transaction stats */
160        virtual void *getStats (void);
161
162        /* Debugging routines */
163        virtual void dump (void) const;
164       
165        /* Database backup and rollover */
166        virtual void backup (void);
167
168    /* Reporting functions */
169    virtual void printSummaries (void) const;
170    virtual void printTransactions (void) const;
171
172    virtual std::list<arm_id_t> *getApplicationList (void);
173    virtual std::list<arm_id_t> *getTransactionList (void);
174    virtual std::list<arm_id_t> *getTransactionList (const arm_id_t &app_id);
175        virtual std::list<arm_tran_start_handle_t> *getTransactionInstanceList (const arm_id_t &tran_id);
176        virtual int getApplicationCount (void);
177        virtual int getTransactionCount (void);
178        virtual int getTransactionCount (const arm_id_t &app_id);
179   
180    virtual arm_error_t getApplicationInformation (const arm_id_t &app_id, arm4db_application_summary_t *summary_ptr);
181    virtual arm_error_t getTransactionInformation (const arm_id_t &tran_id, arm4db_transaction_summary_t *summary_ptr);
182        virtual const arm_correlator_t *getCorrelator (arm_tran_start_handle_t tran_handle, arm_correlator_t *correlator_ptr);
183        virtual const arm_correlator_t *getParentCorrelator (arm_tran_start_handle_t tran_handle, arm_correlator_t *correlator_ptr);
184   
185    virtual void setTransactionTraceInformation (const arm_id_t &tran_id, const arm4db_transaction_summary_t &summary);
186   
187    virtual std::ostream& exportApplicationDefinitions (std::ostream &os) const;
188    virtual std::ostream& exportTransactionDefinitions (std::ostream &os) const;
189    virtual std::ostream& exportMetricDefinitions (std::ostream &os) const;
190    virtual std::ostream& exportApplications (std::ostream &os) const;
191    virtual std::ostream& exportTransactions (std::ostream &os) const;
192    virtual std::ostream& exportTraceStats (std::ostream &os) const;
193
194        /* Operators */
195
196private:
197        /* Mark these as private to prevent their use */
198        BerkeleyDB (const Arm4db &);
199        BerkeleyDB &operator= (const Arm4db &);
200
201        const Arm4dbConfig &getConfig (void) { return Arm4dbConfig::getConfig (); }
202
203    static void panic (const DbRunRecoveryException &r, const char *file, int line);
204    static void panic (const DbException &e, const char *file, int line);
205
206        int openEnvironment (int flags);
207        int openDatabaseWithTxn (Db **db_ptr,
208                const char *db_name_ptr,
209                int flags,
210                DbTxn *transaction_ptr);
211    int openDatabase (Db **db_ptr,
212        const char *db_name_ptr,
213        int flags);
214    void close_database (Db **database_pptr);
215
216        /* Association methods */
217        static int get_application_name (Db *db_ptr,
218                const Dbt *primary_key_ptr,
219                const Dbt *primary_data_ptr,
220                Dbt *secondary_key_ptr);
221        static int get_application_instance_app (Db *db_ptr,
222                const Dbt *primary_key_ptr,
223                const Dbt *primary_data_ptr,
224                Dbt *secondary_key_ptr);
225        static int get_transaction_name (Db *db_ptr,
226                const Dbt *primary_key_ptr,
227                const Dbt *primary_data_ptr,
228                Dbt *secondary_key_ptr);
229        static int get_transaction_appid (Db *db_ptr,
230                const Dbt *primary_key_ptr,
231                const Dbt *primary_data_ptr,
232                Dbt *secondary_key_ptr);
233        static int get_tran_instance_tranid (Db *db_ptr,
234                const Dbt *primary_key_ptr,
235                const Dbt *primary_data_ptr,
236                Dbt *secondary_key_ptr);
237        static int get_tran_instance_app_handle (Db *db_ptr,
238                const Dbt *primary_key_ptr,
239                const Dbt *primary_data_ptr,
240                Dbt *secondary_key_ptr);
241        static int get_metric_name (Db *db_ptr,
242                const Dbt *primary_key_ptr,
243                const Dbt *primary_data_ptr,
244                Dbt *secondary_key_ptr);
245        static int get_metric_appid (Db *db_ptr,
246                const Dbt *primary_key_ptr,
247                const Dbt *primary_data_ptr,
248                Dbt *secondary_key_ptr);
249
250        int openApplicationDatabase (int flags);
251        int openApplicationInstanceDatabase (int flags);
252        int openTransactionDatabase (int flags);
253        int openTransactionInstanceDatabase (int flags);
254        int openMetricDatabase (int flags);
255        arm_error_t openDatabasesNoLock (int flags);
256
257        int     process_application_instances_txn (const arm4_shm_application_instance_t *entry_ptr);
258        int process_application_group_txn (const arm4_shm_property_t *group_ptr);
259        int process_application_instance_id_txn (const arm4_shm_property_t *property_ptr);
260        int process_application_context_txn (const arm4_shm_context_property_t *property_ptr);
261        int process_application_address_txn (const arm4_shm_address_t *address_ptr);
262        int process_transaction_instances_txn (const arm4_shm_transaction_instance_t *entry_ptr);
263        int process_transaction_context_txn (const arm4_shm_context_property_t *property_ptr);
264        int process_transaction_uri_txn (const arm4_shm_uri_t *property_ptr);
265        int process_transaction_metric_value_txn (const arm4_shm_metric_value_t *metric_ptr);
266        int process_transaction_user_txn (const arm4_shm_user_t *user_ptr);
267        int process_transaction_diag_txn (const arm4_shm_diag_t *diag_ptr);
268        int process_correlator_txn (const arm4_shm_correlator_t *correlator_ptr);
269        int process_sequence_txn (const arm4_shm_db_sequence_t *sequence_ptr);
270        int process_register_application_txn (const unsigned char *digest_ptr,
271                const char *application_name_ptr,
272                const arm_charset_t charset,
273                arm_id_t *output_app_id,
274                arm_boolean_t *is_new_ptr);
275        int process_register_application_identity_txn (const arm4_shm_register_application_identity_t *identity_ptr);
276        int process_register_application_context_txn (const arm4_shm_register_application_context_t *context_ptr);
277        int process_register_transaction_txn (const arm4_shm_register_transaction_t *transaction_ptr,
278                arm_id_t *output_tran_id,
279                arm_boolean_t *is_new_ptr);
280        int process_register_transaction_identity_txn (const arm4_shm_register_application_identity_t *identity_ptr);
281        int process_register_transaction_context_txn (const arm4_shm_register_application_context_t *context_ptr);
282        int process_register_transaction_uri_txn (const arm4_shm_register_transaction_uri_t *uri_ptr);
283        int process_register_transaction_metric_binding_txn (const arm4_shm_register_transaction_metric_t *metric_ptr);
284        int process_register_metric_txn (const unsigned char *digest_ptr,
285                const char *metric_name_ptr,
286                const arm_id_t *app_id,
287                const char *metric_units_ptr,
288                const arm_metric_format_t metric_format,
289                const arm_metric_usage_t metric_usage,
290                arm_id_t *output_metric_id);
291        int process_trace_stats_txn (arm_time_t sample_time, arm4db_transaction_trace_stats_t *stats_ptr);
292
293        int initialize_sequence (int index, arm4_shm_header_t *header_ptr);
294
295        void dump_sequence (void) const;
296        void dump_application (void) const;
297        void dump_application_identity (void) const;
298        void dump_application_context_names (void) const;
299        void dump_application_instance (void) const;
300        void dump_application_group (void) const;
301        void dump_application_instance_names (void) const;
302        void dump_application_context_values (void) const;
303        void dump_application_address (void) const;
304        void dump_transaction (void) const;
305        void dump_transaction_identity (void) const;
306        void dump_transaction_context_names (void) const;
307        void dump_transaction_identity_uri (void) const;
308        void dump_transaction_metric_binding (void) const;
309        void dump_transaction_instance (void) const;
310        void dump_transaction_context_values (void) const;
311        void dump_transaction_context_uri (void) const;
312        void dump_transaction_context_metric_value (void) const;
313        void dump_transaction_context_user (void) const;
314        void dump_transaction_context_diag (void) const;
315        void dump_metric (void) const;
316
317    std::ostream& export_application_definition (std::ostream &os, const arm_id_t &appl_id, const application_record_t &application) const;
318        std::ostream& export_application_identity (std::ostream &os, const arm_id_t &appl_id) const;
319        std::ostream& export_application_context_names (std::ostream &os, const arm_id_t &appl_id) const;
320
321        std::ostream& export_transaction_identity (std::ostream &os, const arm_id_t &tran_id) const;
322        std::ostream& export_transaction_context (std::ostream &os, const arm_id_t &tran_id) const;
323        std::ostream& export_transaction_uri (std::ostream &os, const arm_id_t &tran_id) const;
324        std::ostream& export_transaction_metric_binding (std::ostream &os, const arm_id_t &tran_id) const;
325       
326        std::ostream& exportApplicationGroup (std::ostream &os, arm_app_start_handle_t app_handle) const;
327        std::ostream& exportApplicationInstanceNames (std::ostream &os, arm_app_start_handle_t app_handle) const;
328        std::ostream& exportApplicationContextValues (std::ostream &os, arm_app_start_handle_t app_handle) const;
329        std::ostream& exportApplicationAddress (std::ostream &os, arm_app_start_handle_t app_handle) const;
330
331        std::ostream& exportTransactionContextValues (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
332        std::ostream& exportTransactionContextUri (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
333        std::ostream& exportTransactionContextMetricValue (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
334        std::ostream& exportTransactionContextUser (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
335        std::ostream& exportTransactionContextDiag (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
336        std::ostream& exportParentCorrelator (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
337        std::ostream& exportCorrelator (std::ostream &os, arm_tran_start_handle_t tran_handle) const;
338
339        arm_error_t copyDatabases (void);
340        void destroyInstanceDatabase (const char *name_ptr);
341        void destroyInstanceDatabases (void);
342
343    void find_and_print_correlators (arm_tran_start_handle_t tran_handle) const;
344    void find_and_print_metric_values (arm_tran_start_handle_t tran_handle) const;
345    void find_and_print_user_values (arm_tran_start_handle_t tran_handle) const;
346    void find_and_print_diag_values (arm_tran_start_handle_t tran_handle) const;
347    int find_application (application_record_t *application_ptr,
348        const arm_id_t *appl_id) const;
349    int find_transaction (transaction_record_t *transaction_ptr,
350        const arm_id_t *transaction_instance_ptr) const;
351    void print_transaction_metadata (const arm_id_t *tran_id) const;
352        void print_trace_stats (const arm_id_t *tran_id) const;
353    arm_error_t summarize_transaction (const arm_id_t *tran_id) const;
354    void print_application_metadata (const arm_id_t *appl_id) const;
355    arm_error_t summarize_application (const arm_id_t *appl_id, const application_record_t *application_ptr) const;
356
357        int save (Db *db_ptr, const void *key_ptr, size_t key_size, const void *data_ptr, size_t data_size);
358        int save (Db *db_ptr, const void *key_ptr, size_t key_size, const char *data_ptr);
359
360    DbEnv *m_environmentPtr;
361
362        /* The database objects */
363        Db      *db_sequence_ptr;
364
365        Db      *db_application_ptr;
366        Db      *db_application_name_ptr;
367        Db      *db_application_identity_ptr;
368        Db      *db_application_context_names_ptr;
369        Db      *db_application_instance_ptr;
370        Db      *db_application_instance_app_ptr;
371        Db      *db_application_group_ptr;
372        Db      *db_application_instance_names_ptr;
373        Db      *db_application_context_values_ptr;
374        Db      *db_application_address_ptr;
375       
376        Db      *db_transaction_ptr;
377        Db      *db_transaction_name_ptr;
378        Db      *db_transaction_appid_ptr;
379        Db      *db_transaction_identity_ptr;
380        Db      *db_transaction_context_names_ptr;
381        Db      *db_transaction_identity_uri_ptr;
382        Db      *db_transaction_metric_binding_ptr;
383        Db      *db_transaction_instance_ptr;
384        Db      *db_transaction_instance_tranid_ptr;
385        Db      *db_transaction_instance_app_handle_ptr;
386        Db      *db_transaction_context_values_ptr;
387        Db      *db_transaction_context_uri_ptr;
388        Db      *db_transaction_context_metric_value_ptr;
389        Db      *db_transaction_context_user_ptr;
390        Db      *db_transaction_context_diag_ptr;
391       
392        Db  *db_metric_ptr;
393        Db      *db_metric_name_ptr;
394        Db      *db_metric_appid_ptr;
395       
396        Db      *db_parent_correlator_ptr;
397        Db      *db_current_correlator_ptr;
398       
399        Db      *db_trace_stat_ptr;
400        Db      *db_appdex_stat_ptr;
401};
402
403#endif /* BERKELEYDB_H */
Note: See TracBrowser for help on using the repository browser.