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"
25 #include <bzs/db/protocol/tdap/client/filter.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);
737 template <
class Container>
739 bzs::rtl::exception * e = NULL)
741 mraResetter mras(
m_tb);
742 m_alias.reverseAliasNamesQuery(q);
744 typename Container::iterator it = begin(mdls), itb = begin(mdls),
746 it = itb = begin(mdls);
748 if (!
m_tb->isUseTransactd())
755 if ((it == itb) || !sorted ||
756 (
m_map.compKeyValue(mdl, *mdlb,
m_tb->keyNum()) ==
true) ||
757 (
m_map.compKeyValue(*mdlb, mdl,
m_tb->keyNum()) ==
true))
759 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
768 if (
m_tb->stat() != 0)
772 it = itb = begin(mdls);
775 if ((
m_tb->stat() != STATUS_SUCCESS) &&
776 (
m_tb->stat() != STATUS_NOT_FOUND_TI))
781 (
m_map.compKeyValue(mdl, *mdlb,
m_tb->keyNum()) ==
true) ||
782 (
m_map.compKeyValue(*mdlb, mdl,
m_tb->keyNum()) ==
true)))
785 if ((
m_tb->stat() != STATUS_SUCCESS) &&
786 (
m_tb->stat() != STATUS_NOT_FOUND_TI))
789 m_tb->keyValueDescription(buf, 8192);
791 *e << bzs::rtl::errnoCode(
m_tb->stat())
792 << bzs::rtl::errMessage(buf);
794 THROW_BZS_ERROR_WITH_CODEMSG(
m_tb->stat(), buf);
797 if (
m_tb->stat() == 0)
805 template <
class BaseContainer,
class T2>
808 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
809 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
810 std::sort(refList->begin(), refList->end(), comp);
815 template <
class BaseContainer,
class T2>
817 bzs::rtl::exception& e)
819 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
820 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
821 std::sort(refList->begin(), refList->end(), comp);
826 template <
class Container>
827 void readEach(Container& mdls,
bool sorted =
false,
828 bzs::rtl::exception * e = NULL)
831 mraResetter mras(
m_tb);
832 typename Container::iterator it = begin(mdls), itb = begin(mdls),
834 it = itb = begin(mdls);
839 if ((it == itb) || !sorted ||
840 (
m_map.compKeyValue(mdl, *mdlb,
m_tb->keyNum()) ==
true) ||
841 (
m_map.compKeyValue(*mdlb, mdl,
m_tb->keyNum()) ==
true))
843 m_map.setKeyValues(mdl, fds,
m_tb->keyNum());
845 if ((
m_tb->stat() != STATUS_SUCCESS) &&
846 (
m_tb->stat() != STATUS_NOT_FOUND_TI))
849 m_tb->keyValueDescription(buf, 8192);
851 *e << bzs::rtl::errnoCode(
m_tb->stat())
852 << bzs::rtl::errMessage(buf);
854 THROW_BZS_ERROR_WITH_CODEMSG(
m_tb->stat(), buf);
857 if (
m_tb->stat() == 0)
865 template <
class BaseContainer,
class T2>
866 void readEach(BaseContainer& mdls, T* (T2::*func)()
const)
868 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
869 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
870 std::sort(refList->begin(), refList->end(), comp);
875 template <
class BaseContainer,
class T2>
876 void readEach(BaseContainer& mdls, T* (T2::*func)()
const,
877 bzs::rtl::exception& e)
879 boost::shared_ptr<std::vector<T*> > refList(listup(mdls, func));
880 compFunc<MAP, T> comp(
m_map,
m_tb->keyNum());
881 std::sort(refList->begin(), refList->end(), comp);
899 m_alias.reverseAliasNamesQuery(q);
900 return m_tb->prepare(&q, serverPrepare);
911 #endif // BZS_DB_PROTOCOL_TDAP_CLIENT_TRDORMAPI_H
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:1254
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:891
テーブルイテレータクラステンプレート
Definition: trdboostapi.h:198
activeObject & readMore(collection_vec_type &mdls)
Definition: trdormapi.h:610
static void throwError(const _TCHAR *caption, short statusCode)
クエリー(フィルター)作成の補助をするためのベースクラス
Definition: table.h:354
activeObject & readMapMore(Any_Map_type &map)
Definition: trdormapi.h:535
eFindType
Definition: nsTable.h:57
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:885
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:876
table::eFindType direction(const pq_handle &q)
Definition: trdormapi.h:524
boost::shared_ptr< table > table_ptr
Definition: fields.h:251
フィールドコレクションクラス
Definition: fields.h:256
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:1130
boost::function< int(const fields &)> validationFunc
Definition: trdboostapi.h:251
void readEach(BaseContainer &mdls, T *(T2::*func)() const, queryBase &q, bzs::rtl::exception &e)
Definition: trdormapi.h:816
boost::shared_ptr< database > database_ptr
Definition: fields.h:250
void readEach(Container &mdls, queryBase &q, bool sorted=false, bzs::rtl::exception *e=NULL)
Definition: trdormapi.h:738
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:178
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:920
データベースとテーブルを管理するインタフェース
Definition: trdboostapi.h:172
void updateRecord(fields &fd, const char_td keynum)
Definition: trdboostapi.h:1138
activeObject(database_ptr &db, short tableIndex, short mode=TD_OPEN_NORMAL)
Definition: trdormapi.h:416
keySegment segments[MAX_KEY_SEGMENT]
Definition: tdapSchema.h:181
fieldsBase row
Definition: fields.h:252
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:158
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:180
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:897
~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:806
void readEach(Container &mdls, bool sorted=false, bzs::rtl::exception *e=NULL)
Definition: trdormapi.h:827
フィルタリングイテレータアダプターテンプレート
Definition: trdboostapi.h:256
indexIterator readIndex(table_ptr tb, eIndexOpType op, ushort_td lockBias=LOCK_BIAS_DEFAULT)
Definition: trdboostapi.h:313
void readEach(BaseContainer &mdls, T *(T2::*func)() const)
Definition: trdormapi.h:866