00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #ifndef _COMP_HOOK_H
00029 #define _COMP_HOOK_H
00030
00031 #include <dbtools.h>
00032 #include <search_node.h>
00033 #include <delta.h>
00034
00035 namespace coco {
00036
00037 class wnc_hook_base;
00038
00040
00050 class work_node_comp_hook
00051 {
00052 private:
00054 wnc_hook_base* __wh;
00055
00056 private:
00060 work_node_comp_hook(wnc_hook_base* w) : __wh(w) {}
00061
00062 public:
00067 work_node_comp_hook(const wnc_hook_base& w);
00072 work_node_comp_hook(const work_node_comp_hook& wh);
00073
00075 ~work_node_comp_hook();
00076
00080 work_node_comp_hook& operator=(const work_node_comp_hook& w);
00081
00088 void operator()(const work_node& wn, dbt_row& dbr,
00089 std::list<delta>* add_ds = NULL,
00090 std::list<certificate>* add_cs = NULL);
00091
00094 bool init_columns(vdbl::standard_table& stable);
00095
00098 bool drop_columns(vdbl::standard_table& stable);
00099
00101 const std::string& name() const;
00102 };
00103
00105
00111 class wnc_hook_base
00112 {
00113 private:
00115 std::string __name;
00121 std::list<std::string> __managed_cols;
00122
00123 protected:
00127 template <class _CI>
00128 bool _init_column(vdbl::standard_table& stable, const std::string& colname,
00129 const _CI& c);
00130
00134 template <class _CI>
00135 bool _init_column(vdbl::standard_table& stable, const char* colname,
00136 const _CI& c)
00137 { return _init_column(stable, std::string(colname), c); }
00138
00141 bool _drop_columns(vdbl::standard_table& stable);
00142
00145 search_node_relation parent_relation(const work_node& wn) const;
00146
00149 search_node_id node_id(const work_node& wn) const;
00150
00151 public:
00153 wnc_hook_base() : __name(), __managed_cols() {}
00155 wnc_hook_base(const std::string& name) : __name(name), __managed_cols() {}
00157 wnc_hook_base(const char* name) : __name(name), __managed_cols() {}
00159 wnc_hook_base(const wnc_hook_base& w) : __name(w.__name),
00160 __managed_cols(w.__managed_cols) {}
00161
00163 virtual ~wnc_hook_base() {}
00164
00166 virtual wnc_hook_base* new_copy() const = 0;
00167
00174 virtual void operator()(const work_node& wn, dbt_row& dbr,
00175 std::list<delta>* add_ds,
00176 std::list<certificate>* add_cs) const = 0;
00177
00182 virtual bool init_columns(vdbl::standard_table& stable) { return false; }
00183
00187 virtual bool drop_columns(vdbl::standard_table& stable) { return false; }
00188
00190 const std::string& name() const { return __name; }
00191 };
00192
00193 inline work_node_comp_hook::work_node_comp_hook(const wnc_hook_base& w)
00194 {
00195 __wh = w.new_copy();
00196 }
00197
00198 inline work_node_comp_hook::work_node_comp_hook(const work_node_comp_hook& wh)
00199 {
00200 __wh = wh.__wh->new_copy();
00201 }
00202
00203 inline work_node_comp_hook::~work_node_comp_hook()
00204 {
00205 if(__wh) delete __wh;
00206 }
00207
00208 inline work_node_comp_hook&
00209 work_node_comp_hook::operator=(const work_node_comp_hook& w)
00210 {
00211 if(__wh) delete __wh;
00212 __wh = w.__wh->new_copy();
00213 return *this;
00214 }
00215
00216 inline void work_node_comp_hook::operator()(const work_node& wn, dbt_row& dbr,
00217 std::list<delta>* add_ds, std::list<certificate>* add_cs)
00218 {
00219 (*__wh)(wn, dbr, add_ds, add_cs);
00220 }
00221
00222 inline bool work_node_comp_hook::init_columns(vdbl::standard_table& stable)
00223 {
00224 return __wh->init_columns(stable);
00225 }
00226
00227 inline bool work_node_comp_hook::drop_columns(vdbl::standard_table& stable)
00228 {
00229 return __wh->drop_columns(stable);
00230 }
00231
00232 inline const std::string& work_node_comp_hook::name() const
00233 {
00234 return __wh->name();
00235 }
00236
00237 template <class _CI>
00238 bool wnc_hook_base::_init_column(vdbl::standard_table& stable,
00239 const std::string& colname, const _CI& c)
00240 {
00241 bool ret = stable.add_col(colname, vdbl::typed_col<_CI>(c),
00242 vdbl::colflags(true));
00243 if(ret)
00244 __managed_cols.push_back(colname);
00245 return ret;
00246 }
00247
00248 }
00249
00250 #endif // _COMP_HOOK_H