1 #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_TRDORMAPI_H
2 #define BZS_DB_PROTOCOL_TDAP_CLIENT_TRDORMAPI_H
21 #include "trdboostapi.h"
22 #include "fieldNameAlias.h"
23 #include "memRecord.h"
24 #include "groupComp.h"
26 #include <boost/shared_array.hpp>
41 template <
class Container>
42 typename Container::key_type resolvKeyValue(Container& m,
43 const std::_tstring& name,
44 bool noexception =
false);
46 template <
class Container>
typename Container::iterator begin(Container& m);
48 template <
class Container>
typename Container::iterator end(Container& m);
50 template <
class Container>
void clear(Container& m);
52 template <
class Container>
53 void push_back(Container& m,
typename Container::row_type c);
55 template <
class ROW_TYPE,
class KEY_TYPE,
class T>
56 void setValue(ROW_TYPE&
row, KEY_TYPE key,
const T& value);
62 inline typename std::vector<T>::iterator begin(std::vector<T>& m)
68 inline typename std::vector<T>::iterator end(std::vector<T>& m)
73 template <
class T>
inline void push_back(std::vector<T>& m, T c)
75 return m.push_back(c);
78 #if (_MSC_VER || (__BCPLUSPLUS__ && !defined(__clang__)))
81 template <
class Container>
82 inline void readBefore(Container& mdls,
table_ptr tb,
83 const aliasMap_type* alias,
84 typename Container::header_type* dummy = 0)
86 mdls.readBefore(tb, alias);
90 template <
class Container>
inline void readBefore(...){};
94 template <
class Container>
95 void push_back(Container& m,
typename Container::item_type c);
97 template <
class T>
class has_header
105 template <
class C>
static yes test(
typename C::header_type*);
107 template <
class C>
static no test(...);
111 static const bool value;
113 static const bool value =
sizeof(test<T>(0)) ==
sizeof(char);
118 template <
class Container>
120 readBefore(Container& mdls,
table_ptr tb,
const aliasMap_type* alias,
121 typename boost::enable_if<has_header<Container> >::type* = 0)
124 mdls.readBefore(tb, alias);
128 template <
class Container>
130 readBefore(Container& mdls,
table_ptr tb,
const aliasMap_type* alias,
131 typename boost::disable_if<has_header<Container> >::type* = 0)
139 template <
class MAP,
class Container,
class T =
typename MAP::mdl_typename,
140 class FDI =
typename MAP::fdi_typename>
151 template <
class mdls_type>
152 void addContainer(T* u,
typename mdls_type::item_type* p)
154 typename mdls_type::item_type ptr(u);
155 push_back(m_mdls, ptr);
158 template <
class mdls_type>
void addContainer(T* u, ...)
160 push_back(m_mdls, boost::shared_ptr<T>(u));
164 mdlsHandler(Container& mdls) : m_mdls(mdls) {}
166 virtual ~mdlsHandler(){};
168 void init(
int option, FDI* fdi, MAP& map,
table_ptr tb,
169 const aliasMap_type* alias = NULL)
174 readBefore<Container>(m_mdls, tb, alias);
177 void operator()(
const fields& fds)
179 T* u(create(m_mdls, m_option));
180 m_map->readMap(*u, fds, m_option);
181 addContainer<Container>(u, 0);
187 template <
class MAP,
class T>
class compFunc
193 compFunc(MAP& map,
int keynum) : m_map(map), m_keynum(keynum) {}
194 bool operator()(T* l, T* r)
const
196 return m_map.compKeyValue(*l, *r, m_keynum);
199 bool operator()(boost::shared_ptr<T>& l, boost::shared_ptr<T>& r)
const
201 return m_map.compKeyValue(*l, *r, m_keynum);
205 template <
class T,
class RET>
206 bool sortFuncBase(
const T& l,
const T& r, RET (T::*func1)()
const)
208 RET retl = (l.*func1)();
209 RET retr = (r.*func1)();
213 template <
class T,
class FUNC1,
class FUNC2,
class FUNC3>
214 bool sortFunc(
const T& l,
const T& r, FUNC1 func1, FUNC2 func2, FUNC3 func3)
216 bool v = sortFuncBase(l, r, func1);
221 v = sortFuncBase(r, l, func1);
224 v = sortFuncBase(l, r, func2);
229 v = sortFuncBase(r, l, func2);
232 v = sortFuncBase(l, r, func3);
238 template <
class FUNC1,
class FUNC2,
class FUNC3>
class sortFunctor
245 sortFunctor(FUNC1 func1, FUNC2 func2, FUNC3 func3)
246 : m_func1(func1), m_func2(func2), m_func3(func3)
249 template <
class T>
bool operator()(
const T* l,
const T* r)
const
251 return sortFunc(*l, *r, m_func1, m_func2, m_func2);
255 bool operator()(
const boost::shared_ptr<T>& l,
256 const boost::shared_ptr<T>& r)
const
258 bool v = sortFunc(*l, *r, m_func1, m_func2, m_func2);
263 template <
class Container,
class FUNC1,
class FUNC2,
class FUNC3>
264 void sort(Container& mdls, FUNC1 func1, FUNC2 func2, FUNC3 func3)
266 sortFunctor<FUNC1, FUNC2, FUNC3> functor(func1, func2, func3);
267 std::sort(begin(mdls), end(mdls), functor);
270 template <
class Container,
class FUNC1,
class FUNC2>
271 void sort(Container& mdls, FUNC1 func1, FUNC2 func2)
273 sortFunctor<FUNC1, FUNC2, FUNC1> functor(func1, func2, NULL);
274 std::sort(begin(mdls), end(mdls), functor);
277 template <
class Container,
class FUNC1>
void sort(Container& mdls, FUNC1 func1)
279 sortFunctor<FUNC1, FUNC1, FUNC1> functor(func1, NULL, NULL);
280 std::sort(begin(mdls), end(mdls), functor);
283 template <
class T2,
class T,
class Container>
284 inline boost::shared_ptr<std::vector<T> > listup(Container& mdls,
285 T (T2::*func)()
const)
287 typename Container::iterator it = begin(mdls), ite = end(mdls);
289 boost::shared_ptr<std::vector<T> > mdlst(
new std::vector<T>());
293 T ref = (mdl.*func)();
294 mdlst->push_back(ref);
310 m_tb->mra()->setJoinType(mra_nojoin);
317 template <
class MAP,
class T =
typename MAP::mdl_typename,
318 class FDI =
typename MAP::fdi_typename>
326 void init(
database_ptr& db,
const _TCHAR* name,
short mode)
331 void init(
database* db,
const _TCHAR* name,
short mode)
341 void init(
database_ptr& db,
short tableindex,
short mode)
346 void init(
database* db,
short tableindex,
short mode)
351 void prepare(
const pq_handle& q)
369 init(mgr,
m_map.getTableName());
377 init(db,
m_map.getTableName(), mode);
385 init(mgr, tableName);
399 short mode = TD_OPEN_NORMAL)
402 init(db, tableName, mode);
408 short mode = TD_OPEN_NORMAL)
411 init(db, tableName, mode);
417 short mode = TD_OPEN_NORMAL)
420 init(db, tableIndex, mode);
426 short mode = TD_OPEN_NORMAL)
429 init(db, tableIndex, mode);
447 keyValueSetter<T0>::set(
m_tb,
m_tb->keyNum(), kv0);
451 template <
class T0,
class T1>
454 keyValueSetter<T0, T1>::set(
m_tb,
m_tb->keyNum(), kv0, kv1);
458 template <
class T0,
class T1,
class T2>
461 keyValueSetter<T0, T1, T2>::set(
m_tb,
m_tb->keyNum(), kv0, kv1, kv2);
465 template <
class T0,
class T1,
class T2,
class T3>
469 keyValueSetter<T0, T1, T2, T3>::set(
m_tb,
m_tb->keyNum(), kv0, kv1, kv2,
474 template <
class T0,
class T1,
class T2,
class T3,
class T4>
476 const T3 kv3,
const T4 kv4)
478 keyValueSetter<T0, T1, T2, T3, T4>::set(
m_tb,
m_tb->keyNum(), kv0, kv1,
483 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5>
485 const T3 kv3,
const T4 kv4,
const T5 kv5)
487 keyValueSetter<T0, T1, T2, T3, T4, T5>::set(
m_tb,
m_tb->keyNum(), kv0,
488 kv1, kv2, kv3, kv4, kv5);
492 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
495 const T3 kv3,
const T4 kv4,
const T5 kv5,
498 keyValueSetter<T0, T1, T2, T3, T4, T5, T6>::set(
499 m_tb,
m_tb->keyNum(), kv0, kv1, kv2, kv3, kv4, kv5, kv6);
505 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
508 const T3 kv3,
const T4 kv4,
const T5 kv5,
509 const T6 kv6,
const T7 kv7)
511 keyValueSetter<T0, T1, T2, T3, T4, T5, T6, T7>::set(
512 m_tb,
m_tb->keyNum(), kv0, kv1, kv2, kv3, kv4, kv5, kv6, kv7);
526 return q->direction();
534 template <
class Any_Map_type>
537 mraResetter mras(
m_tb);
553 template <
class Any_Map_type ,
class Query>
556 mraResetter mras(
m_tb);
577 template <
class Any_Map_type,
class Query>
580 mraResetter mras(
m_tb);
602 template <
class Query>
606 mdlsHandler<MAP, collection_vec_type> map(mdls);
612 mdlsHandler<MAP, collection_vec_type> map(mdls);
616 template <
class Container>
619 typename MAP::collection_orm_typename map(mdls);
623 template <
class Query>
626 mdlsHandler<MAP, collection_vec_type> map(mdls);
630 template <
class Container,
class Query>
633 typename MAP::collection_orm_typename map(mdls);
637 template <
class Container,
class Query>
640 typename MAP::collection_orm_typename map(mdls);
644 template <
class T2>
void read(T2& mdl,
bool setKeyValueFromObj =
true)
647 if (setKeyValueFromObj)
648 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
650 if (
m_tb->stat() != 0)
655 template <
class T2>
void update(T2& mdl,
bool setKeyValueFromObj =
true)
658 if (setKeyValueFromObj)
659 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
661 if (
m_tb->stat() != 0)
672 if (
m_tb->stat() != 0)
675 if (
m_tb->stat() != 0)
680 template <
class T2>
void del(T2& mdl,
bool setKeyValueFromObj =
true)
682 read(mdl, setKeyValueFromObj);
684 if (
m_tb->stat() != 0)
696 template <
class T2>
void save(T2& mdl,
bool setKeyValueFromObj =
true)
699 if (setKeyValueFromObj)
700 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
702 if (
m_tb->stat() == STATUS_NOT_FOUND_TI)
711 #ifdef USE_CONTAINER_CUD // default not support
713 template <
class Container>
void update(Container& mdls)
715 typename Container::iterator it = begin(mdls), ite = end(mdls);
720 template <
class Container>
void del(Container& mdls)
722 typename Container::iterator it = begin(mdls), ite = end(mdls);
727 template <
class Container>
void insert(Container& mdls)
729 typename Container::iterator it = begin(mdls), ite = end(mdls);
736 template <
class Container>
738 bzs::rtl::exception * e = NULL)
740 mraResetter mras(
m_tb);
741 m_alias.reverseAliasNamesQuery(q);
743 typename Container::iterator it = begin(mdls), itb = begin(mdls),
745 it = itb = begin(mdls);
747 if (!
m_tb->isUseTransactd())
754 if ((it == itb) || !sorted ||
755 (
m_map.compKeyValue(mdl, mdlb,
m_tb->keyNum()) ==
true) ||
756 (
m_map.compKeyValue(mdlb, mdl,
m_tb->keyNum()) ==
true))
758 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
767 if (
m_tb->stat() != 0)
771 it = itb = begin(mdls);
774 if ((
m_tb->stat() != STATUS_SUCCESS) &&
775 (
m_tb->stat() != STATUS_NOT_FOUND_TI))
780 (
m_map.compKeyValue(mdl, mdlb,
m_tb->keyNum()) ==
true) ||
781 (
m_map.compKeyValue(mdlb, mdl,
m_tb->keyNum()) ==
true)))
784 if (
m_tb->stat() != 0)
787 m_tb->keyValueDescription(buf, 8192);
789 *e << bzs::rtl::errnoCode(
m_tb->stat())
790 << bzs::rtl::errMessage(buf);
792 THROW_BZS_ERROR_WITH_CODEMSG(
m_tb->stat(), buf);
795 if (
m_tb->stat() == 0)
802 template <
class BaseContainer,
class T2>
805 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
806 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
807 std::sort(refList->begin(), refList->end(), comp);
811 template <
class BaseContainer,
class T2>
813 bzs::rtl::exception& e)
815 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
816 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
817 std::sort(refList->begin(), refList->end(), comp);
822 template <
class Container>
823 void readEach(Container& mdls,
bool sorted =
false,
824 bzs::rtl::exception * e = NULL)
827 mraResetter mras(
m_tb);
828 typename Container::iterator it = begin(mdls), itb = begin(mdls),
830 it = itb = begin(mdls);
835 if ((it == itb) || !sorted ||
836 (
m_map.compKeyValue(mdl, mdlb,
m_tb->keyNum()) ==
true) ||
837 (
m_map.compKeyValue(mdlb, mdl,
m_tb->keyNum()) ==
true))
839 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
841 if (
m_tb->stat() != 0)
844 m_tb->keyValueDescription(buf, 8192);
846 *e << bzs::rtl::errnoCode(
m_tb->stat())
847 << bzs::rtl::errMessage(buf);
849 THROW_BZS_ERROR_WITH_CODEMSG(
m_tb->stat(), buf);
852 if (
m_tb->stat() == 0)
860 template <
class BaseContainer,
class T2>
861 void readEach(BaseContainer& mdls, T* (T2::*func)()
const)
863 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
864 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
865 std::sort(refList->begin(), refList->end(), comp);
869 template <
class BaseContainer,
class T2>
870 void readEach(BaseContainer& mdls, T* (T2::*func)()
const,
871 bzs::rtl::exception& e)
873 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
874 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
875 std::sort(refList->begin(), refList->end(), comp);
893 m_alias.reverseAliasNamesQuery(q);
894 return m_tb->prepare(&q, serverPrepare);
905 #endif // BZS_DB_PROTOCOL_TDAP_CLIENT_TRDORMAPI_H
const _TCHAR * protocol(const _TCHAR *uri)
Definition: uri.h:42
activeObject(idatabaseManager *mgr)
Definition: trdormapi.h:366
activeObject & index(int v)
Definition: trdormapi.h:436
activeObject & readMap(Any_Map_type &map, Query &q, validationFunc func)
Definition: trdormapi.h:578
void for_each(T iterator, F func)
Definition: trdboostapi.h:1201
activeObject & read(collection_vec_type &mdls, Query &q, validationFunc func)
Definition: trdormapi.h:603
activeObject & option(int v)
Definition: trdormapi.h:518
activeObject & read(collection_vec_type &mdls, Query &q)
Definition: trdormapi.h:624
activeObject & resetAlias()
Definition: trdormapi.h:885
テーブルイテレータクラステンプレート
Definition: trdboostapi.h:178
activeObject & readMore(collection_vec_type &mdls)
Definition: trdormapi.h:610
static void throwError(const _TCHAR *caption, short statusCode)
クエリー(フィルター)作成の補助をするためのベースクラス
Definition: table.h:314
activeObject & readMapMore(Any_Map_type &map)
Definition: trdormapi.h:535
eFindType
Definition: nsTable.h:56
int m_option
Definition: trdormapi.h:360
void save(T2 &mdl, bool setKeyValueFromObj=true)
Definition: trdormapi.h:696
activeObject & alias(const _TCHAR *src, const _TCHAR *dst)
Definition: trdormapi.h:879
MAP m_map
Definition: trdormapi.h:359
activeObject(database_ptr &db, const _TCHAR *tableName, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:398
void readEach(BaseContainer &mdls, T *(T2::*func)() const, bzs::rtl::exception &e)
Definition: trdormapi.h:870
table::eFindType direction(const pq_handle &q)
Definition: trdormapi.h:524
boost::shared_ptr< table > table_ptr
Definition: fields.h:219
フィールドコレクションクラス
Definition: fields.h:224
FDI * m_fdi
Definition: trdormapi.h:358
void addSeekKeyValue(const _TCHAR *value, bool reset=false)
void insertRecord(T &some, bool ncc=true)
Definition: trdboostapi.h:1077
boost::function< int(const fields &)> validationFunc
Definition: trdboostapi.h:231
void readEach(BaseContainer &mdls, T *(T2::*func)() const, queryBase &q, bzs::rtl::exception &e)
Definition: trdormapi.h:812
boost::shared_ptr< database > database_ptr
Definition: fields.h:218
void readEach(Container &mdls, queryBase &q, bool sorted=false, bzs::rtl::exception *e=NULL)
Definition: trdormapi.h:737
table::eFindType getDirection() const
activeObject & keyValue(const T0 kv0, const T1 kv1, const T2 kv2, const T3 kv3, const T4 kv4, const T5 kv5, const T6 kv6, const T7 kv7)
Definition: trdormapi.h:507
activeObject(database_ptr &db, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:374
activeObject & read(Container &mdls, Query &q, validationFunc func)
Definition: trdormapi.h:638
キー定義構造体
Definition: tdapSchema.h:147
Definition: trdboostapi.h:48
table_ptr openTable(Database_Ptr db, const _TCHAR *name, short mode=TD_OPEN_NORMAL, bool autoCreate=true, const _TCHAR *ownerName=NULL, const _TCHAR *uri=NULL)
Definition: trdboostapi.h:894
データベースとテーブルを管理するインタフェース
Definition: trdboostapi.h:152
void updateRecord(fields &fd, const char_td keynum)
Definition: trdboostapi.h:1085
activeObject(database_ptr &db, short tableIndex, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:416
keySegment segments[MAX_KEY_SEGMENT]
Definition: tdapSchema.h:150
fieldsBase row
Definition: fields.h:220
virtual table_ptr table(const _TCHAR *name)=0
void insert(T2 &mdl)
Definition: trdormapi.h:688
std::vector< boost::shared_ptr< T > > collection_vec_type
Definition: trdormapi.h:364
table_ptr m_tb
Definition: trdormapi.h:357
uchar_td fieldNum
Definition: tdapSchema.h:139
table_ptr table() const
Definition: trdormapi.h:516
void update(T2 &mdl, bool setKeyValueFromObj=true)
Definition: trdormapi.h:655
uchar_td segmentCount
Definition: tdapSchema.h:149
activeObject(idatabaseManager *mgr, const _TCHAR *tableName)
Definition: trdormapi.h:382
void del()
Definition: trdormapi.h:669
activeObject(database *db, short tableIndex, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:425
table::eFindType direction(const queryBase &q)
Definition: trdormapi.h:529
void read(T2 &mdl, bool setKeyValueFromObj=true)
Definition: trdormapi.h:644
activeObject & readMap(Any_Map_type &map, Query &q)
Definition: trdormapi.h:554
activeObject & readMore(Container &mdls)
Definition: trdormapi.h:617
データベースアクセスクラス
Definition: database.h:59
fdNmaeAlias m_alias
Definition: trdormapi.h:361
activeObject & read(Container &mdls, Query &q)
Definition: trdormapi.h:631
activeObject(database *db, const _TCHAR *tableName, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:407
C++用 O/Rマッパー Template.
Definition: trdormapi.h:319
pq_handle prepare(queryBase &q, bool serverPrepare=false)
Definition: trdormapi.h:891
~activeObject()
Definition: trdormapi.h:434
void del(T2 &mdl, bool setKeyValueFromObj=true)
Definition: trdormapi.h:680
void readEach(BaseContainer &mdls, T *(T2::*func)() const, queryBase &q)
Definition: trdormapi.h:803
void readEach(Container &mdls, bool sorted=false, bzs::rtl::exception *e=NULL)
Definition: trdormapi.h:823
フィルタリングイテレータアダプターテンプレート
Definition: trdboostapi.h:236
indexIterator readIndex(table_ptr tb, eIndexOpType op, ushort_td lockBias=LOCK_BIAS_DEFAULT)
Definition: trdboostapi.h:293
void readEach(BaseContainer &mdls, T *(T2::*func)() const)
Definition: trdormapi.h:861