Matthias Brantner has proposed merging lp:~matthias-brantner/zorba/auditing into lp:zorba.
Requested reviews: Till Westmann (tillw) For more details, see: https://code.launchpad.net/~matthias-brantner/zorba/auditing/+merge/77600 This fix adds a new scoped auditor for auditing in the granularity of micro seconds (MicroDurationAuditor). Also, it fixes a bug that caused a crash if a ScopedAuditor was created with a 0-pointer event. -- https://code.launchpad.net/~matthias-brantner/zorba/auditing/+merge/77600 Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'include/zorba/audit.h' --- include/zorba/audit.h 2011-08-19 23:22:48 +0000 +++ include/zorba/audit.h 2011-09-29 19:54:29 +0000 @@ -95,6 +95,8 @@ class ZORBA_DLL_PUBLIC Event { public: + static Event* get(); + virtual bool audit(const Property&) const = 0; virtual bool audit(const String&) const = 0; === modified file 'include/zorba/audit_scoped.h' --- include/zorba/audit_scoped.h 2011-08-19 23:22:48 +0000 +++ include/zorba/audit_scoped.h 2011-09-29 19:54:29 +0000 @@ -28,8 +28,10 @@ class ZORBA_DLL_PUBLIC ScopedRecord { public: - ScopedRecord(Event* event) : theEvent(event), theRecord(0) { - assert(event); + ScopedRecord(Event* event) + : theEvent(event ? event : Event::get()), + theRecord(0) { + assert(theEvent); } ~ScopedRecord() { @@ -104,6 +106,7 @@ typedef ScopedAuditor<const int> IntAuditor; typedef ScopedAuditor<zorba::time::Timer> DurationAuditor; typedef ScopedAuditor<zorba::time::Timer, 0x1> TimestampAuditor; + typedef ScopedAuditor<zorba::time::Timer, 0x2> MicroDurationAuditor; template<> struct AuditorTraits<const std::string> { typedef const std::string value_type; @@ -141,7 +144,7 @@ static inline void start(value_type& value) { } static inline audit_type end(value_type& value) { - return value; + return static_cast<audit_type>(value); } }; @@ -189,6 +192,19 @@ return static_cast<audit_type>(value.getStart()); } }; + + template<> struct AuditorTraits<zorba::time::Timer, 0x2> { + typedef zorba::time::Timer value_type; + typedef long long audit_type; + static inline void start(value_type& value) { + value.start(); + } + static inline audit_type end(value_type& value) { + return static_cast<audit_type>(value.elapsed() * 1000); + } + + }; + } } #endif === modified file 'src/api/auditimpl.cpp' --- src/api/auditimpl.cpp 2011-08-19 23:22:48 +0000 +++ src/api/auditimpl.cpp 2011-09-29 19:54:29 +0000 @@ -395,6 +395,15 @@ NOPEventImpl NOP_EVENT_IMPL; //************************************************************************ +// Event +//************************************************************************ + +Event* +Event::get() { + return &NOP_EVENT_IMPL; +} + +//************************************************************************ // ProviderImpl //************************************************************************ === modified file 'test/unit/test_audit.cpp' --- test/unit/test_audit.cpp 2011-07-28 15:28:16 +0000 +++ test/unit/test_audit.cpp 2011-09-29 19:54:29 +0000 @@ -21,14 +21,12 @@ #include <zorba/zorba.h> #include <zorba/store_manager.h> #include <zorba/audit.h> +#include <zorba/audit_scoped.h> -int -test_audit(int argc, char* argv[]) +bool +test_audit_1(zorba::Zorba* aZorba) { - void* store = zorba::StoreManager::getStore(); - zorba::Zorba* lZorbaInstance = zorba::Zorba::getInstance(store); - - zorba::audit::Provider* lAuditProvider = lZorbaInstance->getAuditProvider(); + zorba::audit::Provider* lAuditProvider = aZorba->getAuditProvider(); zorba::audit::Configuration* config = lAuditProvider->createConfiguration(); std::vector<zorba::String> property_names; zorba::audit::Configuration::getPropertyNames(property_names); @@ -52,8 +50,8 @@ zorba::audit::Event* event = lAuditProvider->createEvent(config); - zorba::XQuery_t query = lZorbaInstance->createQuery(); - zorba::StaticContext_t lStaticContext = lZorbaInstance->createStaticContext(); + zorba::XQuery_t query = aZorba->createQuery(); + zorba::StaticContext_t lStaticContext = aZorba->createStaticContext(); lStaticContext->setAuditEvent(event); @@ -64,7 +62,7 @@ query->execute(std::cout, &lSerOptions); if (event->size() != 2) { - return 1; + return false; } else { // one record for the eval query and one for the main query const zorba::audit::Record* lRecord = event->at(0); @@ -74,9 +72,47 @@ std::cerr << *event << std::endl; } - - lZorbaInstance->getAuditProvider()->submitEvent(event); - lZorbaInstance->getAuditProvider()->destroyConfiguration(config); + aZorba->getAuditProvider()->submitEvent(event); + aZorba->getAuditProvider()->destroyConfiguration(config); + + return true; +} + +bool +test_audit_2(zorba::Zorba* aZorba) +{ + zorba::audit::Provider* lAuditProvider = aZorba->getAuditProvider(); + zorba::audit::Configuration* config = lAuditProvider->createConfiguration(); + + { + // test to make sure that auditing doesn't crash if the record is initialized + // with a 0 event pointer + zorba::audit::ScopedRecord sar(0); + zorba::time::Timer lTimer; + zorba::audit::MicroDurationAuditor auditor(sar, "blub", lTimer); + } + + + aZorba->getAuditProvider()->destroyConfiguration(config); + + return true; +} + +int +test_audit(int argc, char* argv[]) +{ + void* store = zorba::StoreManager::getStore(); + zorba::Zorba* lZorbaInstance = zorba::Zorba::getInstance(store); + + if (!test_audit_1(lZorbaInstance)) + { + return 1; + } + + if (!test_audit_2(lZorbaInstance)) + { + return 2; + } return 0; }
-- Mailing list: https://launchpad.net/~zorba-coders Post to : zorba-coders@lists.launchpad.net Unsubscribe : https://launchpad.net/~zorba-coders More help : https://help.launchpad.net/ListHelp