#pragma once #include "broker/store.bif.h" #include "broker/data.bif.h" #include "OpaqueVal.h" #include "Trigger.h" #include #include #include #include namespace bro_broker { extern OpaqueType* opaque_of_store_handle; /** * Create a Broker::QueryStatus value. * @param success whether the query status should be set to success or failure. * @return a Broker::QueryStatus value. */ EnumVal* query_status(bool success); /** * @return a Broker::QueryResult value that has a Broker::QueryStatus indicating * a failure. */ inline IntrusivePtr query_result() { auto rval = make_intrusive(BifType::Record::Broker::QueryResult); rval->Assign(0, query_status(false)); rval->Assign(1, make_intrusive(BifType::Record::Broker::Data)); return rval; } /** * @param data the result of the query. * @return a Broker::QueryResult value that has a Broker::QueryStatus indicating * a success. */ inline IntrusivePtr query_result(IntrusivePtr data) { auto rval = make_intrusive(BifType::Record::Broker::QueryResult); rval->Assign(0, query_status(true)); rval->Assign(1, std::move(data)); return rval; } /** * Used for asynchronous data store queries which use "when" statements. */ class StoreQueryCallback { public: StoreQueryCallback(trigger::Trigger* arg_trigger, const CallExpr* arg_call, broker::store store) : trigger(arg_trigger), call(arg_call), store(std::move(store)) { Ref(trigger); } ~StoreQueryCallback() { Unref(trigger); } void Result(const IntrusivePtr& result) { trigger->Cache(call, result.get()); trigger->Release(); } void Abort() { auto result = query_result(); trigger->Cache(call, result.get()); trigger->Release(); } bool Disabled() const { return trigger->Disabled(); } const broker::store& Store() const { return store; } private: trigger::Trigger* trigger; const CallExpr* call; broker::store store; }; /** * An opaque handle which wraps a Broker data store. */ class StoreHandleVal : public OpaqueVal { public: StoreHandleVal(broker::store s) : OpaqueVal(bro_broker::opaque_of_store_handle), store{s}, proxy{store}, store_pid{store.frontend_id()} { } void ValDescribe(ODesc* d) const override; broker::store store; broker::store::proxy proxy; broker::publisher_id store_pid; // Zeek table that events are forwarded to. IntrusivePtr forward_to; protected: StoreHandleVal() = default; DECLARE_OPAQUE_VALUE(StoreHandleVal) }; // Helper function to construct a broker backend type from script land. broker::backend to_backend_type(BifEnum::Broker::BackendType type); // Helper function to construct broker backend options from script land. broker::backend_options to_backend_options(broker::backend backend, RecordVal* options); } // namespace bro_broker