transactd 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +16 -16
  4. data/README-JA +16 -16
  5. data/bin/common/tdclc_32_2_1.dll +0 -0
  6. data/bin/common/tdclc_64_2_1.dll +0 -0
  7. data/build/common/transactd_cl_common.cmake +0 -1
  8. data/build/common/transactd_common.cmake +28 -38
  9. data/build/swig/ruby/ruby.swg +36 -30
  10. data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
  11. data/build/swig/tdcl.i +217 -62
  12. data/build/tdclc/CMakeLists.txt +14 -26
  13. data/build/tdclc/libtdclcm.map +4 -0
  14. data/build/tdclc/tdclc.cbproj +1 -1
  15. data/build/tdclc/tdclc.rc +0 -0
  16. data/build/tdclcpp/CMakeLists.txt +7 -22
  17. data/build/tdclcpp/tdclcpp.rc +0 -0
  18. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  19. data/build/tdclrb/CMakeLists.txt +7 -49
  20. data/build/tdclrb/tdclrb.rc +62 -0
  21. data/source/bzs/db/blobBuffer.h +5 -0
  22. data/source/bzs/db/blobStructs.h +2 -0
  23. data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
  24. data/source/bzs/db/engine/mysql/database.cpp +391 -169
  25. data/source/bzs/db/engine/mysql/database.h +178 -40
  26. data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
  27. data/source/bzs/db/engine/mysql/dbManager.h +3 -39
  28. data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
  29. data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
  30. data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
  31. data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
  32. data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
  33. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  34. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
  35. data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
  36. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
  37. data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
  38. data/source/bzs/db/protocol/tdap/client/client.h +52 -25
  39. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
  40. data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
  41. data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
  42. data/source/bzs/db/protocol/tdap/client/database.h +1 -1
  43. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
  44. data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
  45. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
  46. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
  47. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
  48. data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
  49. data/source/bzs/db/protocol/tdap/client/field.h +7 -3
  50. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
  51. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
  52. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  53. data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
  54. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
  55. data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
  56. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
  57. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
  58. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
  59. data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
  60. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
  61. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
  62. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
  63. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
  64. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
  65. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
  66. data/source/bzs/db/protocol/tdap/client/request.h +84 -26
  67. data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
  68. data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
  69. data/source/bzs/db/protocol/tdap/client/table.h +48 -5
  70. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
  71. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
  72. data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
  73. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
  74. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
  75. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
  76. data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
  77. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
  78. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  79. data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
  80. data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
  81. data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
  82. data/source/bzs/db/transactd/appModule.h +1 -1
  83. data/source/bzs/db/transactd/connManager.cpp +2 -0
  84. data/source/bzs/db/transactd/transactd.cpp +1 -0
  85. data/source/bzs/env/compiler.h +10 -0
  86. data/source/bzs/env/mbcswchrLinux.cpp +42 -6
  87. data/source/bzs/env/mbcswchrLinux.h +40 -12
  88. data/source/bzs/example/queryData.cpp +33 -4
  89. data/source/bzs/netsvc/client/iconnection.h +107 -0
  90. data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
  91. data/source/bzs/netsvc/client/tcpClient.h +96 -87
  92. data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
  93. data/source/bzs/rtl/benchmark.cpp +2 -2
  94. data/source/bzs/rtl/stringBuffers.cpp +3 -3
  95. data/source/bzs/rtl/stringBuffers.h +2 -2
  96. data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
  97. data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
  98. data/source/bzs/test/tdclphp/bench.php +126 -101
  99. data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
  100. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
  101. data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
  102. data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
  103. data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
  104. data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
  105. data/source/bzs/test/transactdBench/workerBase.h +46 -0
  106. data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
  107. data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
  108. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
  109. data/source/global/ormsrcgen/main.cpp +2 -0
  110. data/source/global/tdclatl/Database.cpp +2 -2
  111. data/source/global/tdclatl/Database.h +1 -1
  112. data/source/global/tdclatl/FieldDefs.cpp +0 -3
  113. data/source/global/tdclatl/PooledDbManager.cpp +2 -2
  114. data/source/global/tdclatl/PooledDbManager.h +1 -1
  115. data/source/global/tdclatl/PreparedQuery.cpp +53 -0
  116. data/source/global/tdclatl/PreparedQuery.h +61 -0
  117. data/source/global/tdclatl/QueryBase.cpp +2 -1
  118. data/source/global/tdclatl/QueryBase.h +1 -1
  119. data/source/global/tdclatl/Record.cpp +3 -15
  120. data/source/global/tdclatl/Recordset.cpp +15 -10
  121. data/source/global/tdclatl/Recordset.h +3 -0
  122. data/source/global/tdclatl/Table.cpp +42 -7
  123. data/source/global/tdclatl/Table.h +3 -1
  124. data/source/global/tdclatl/activeTable.cpp +264 -76
  125. data/source/global/tdclatl/activeTable.h +12 -3
  126. data/source/global/tdclatl/tdclatl.idl +92 -10
  127. data/source/linux/charsetConvert.h +7 -7
  128. data/transactd.gemspec +14 -27
  129. metadata +18 -27
  130. data/bin/common/tdclc_32_2_0.dll +0 -0
  131. data/bin/common/tdclc_64_2_0.dll +0 -0
  132. data/build/swig/php/generate.cmake.in +0 -56
  133. data/build/swig/php/generate.cmd.in +0 -47
  134. data/build/swig/php/php.swg +0 -197
  135. data/build/swig/php/transactd.no_yield.php +0 -4494
  136. data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
  137. data/build/swig/php/transactd.no_yield.php.patch +0 -685
  138. data/build/swig/php/transactd.yield.php +0 -4461
  139. data/build/swig/php/transactd.yield.php.git.patch +0 -652
  140. data/build/swig/php/transactd.yield.php.patch +0 -652
  141. data/build/swig/ruby/generate.cmake.in +0 -35
  142. data/build/swig/ruby/generate.cmd.in +0 -19
  143. data/build/tdclc/BUILDNUMBER.txt +0 -1
  144. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  145. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  146. data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -18,7 +18,7 @@
18
18
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
19
  02111-1307, USA.
20
20
  ================================================================= */
21
-
21
+ #include <my_config.h>
22
22
  #include <boost/thread/mutex.hpp>
23
23
  #include <bzs/db/engine/mysql/database.h>
24
24
 
@@ -44,46 +44,10 @@ struct handle
44
44
  short cid;
45
45
  };
46
46
 
47
- class smartDbsReopen
48
- {
49
- std::vector<boost::shared_ptr<database> >& m_dbs;
50
-
51
- public:
52
- static std::string removeName;
53
-
54
- smartDbsReopen(std::vector<boost::shared_ptr<database> >& dbs) : m_dbs(dbs)
55
- {
56
- for (size_t i = 0; i < m_dbs.size(); i++)
57
- {
58
- if (m_dbs[i])
59
- {
60
- m_dbs[i]->use();
61
- m_dbs[i]->unUseTables(false);
62
- m_dbs[i]->closeForReopen();
63
- }
64
- }
65
- }
66
-
67
- ~smartDbsReopen()
68
- {
69
- for (size_t i = 0; i < m_dbs.size(); i++)
70
- {
71
- if (m_dbs[i])
72
- {
73
- if (removeName != m_dbs[i]->name())
74
- {
75
- m_dbs[i]->use();
76
- m_dbs[i]->reopen();
77
- }
78
- }
79
- }
80
- }
81
- };
82
-
83
- class dbManager;
84
47
 
85
48
  class dbManager
86
49
  {
50
+ // Lock for isSutdown(), called by another thread
87
51
  mutable boost::mutex m_mutex;
88
52
 
89
53
  int m_autoHandle;
@@ -101,7 +65,7 @@ protected:
101
65
  database* getDatabase(const char* dbname, short cid) const;
102
66
  database* getDatabaseCid(short cid) const;
103
67
  int getDatabaseID(short cid) const;
104
- table* getTable(int handle, enum_sql_command cmd = SQLCOM_SELECT) const;
68
+ table* getTable(int handle, enum_sql_command cmd = SQLCOM_SELECT, engine::mysql::rowLockMode* lck=NULL) const;
105
69
  void checkNewHandle(int newHandle) const;
106
70
  int addHandle(int dbid, int tableid, int assignid = -1);
107
71
  database* useDataBase(int id) const;
@@ -16,7 +16,7 @@
16
16
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
17
  02111-1307, USA.
18
18
  ================================================================= */
19
-
19
+ #include <my_config.h>
20
20
  #include "errorMessage.h"
21
21
  #undef PACKAGE
22
22
  #include "mysqlInternal.h"
@@ -38,7 +38,7 @@ const char* errorMessage(int errorCode)
38
38
  case STATUS_PROGRAM_ERROR:
39
39
  return "Program error";
40
40
  case STATUS_CANNOT_LOCK_TABLE:
41
- return "Can not open the table Allrady locked";
41
+ return "Can not open the table already locked";
42
42
  case STATUS_TABLE_NOTOPEN:
43
43
  return "Can not open the table";
44
44
  case STATUS_INVALID_KEYNAME:
@@ -55,17 +55,21 @@ const char* errorMessage(int errorCode)
55
55
  return "";
56
56
  }
57
57
 
58
- void printErrorMessage(const int* errorCode, const std::string* message)
58
+ void printWarningMessage(const int* errorCode, const std::string* message)
59
59
  {
60
60
  int code = errorCode ? *errorCode : 0;
61
61
  std::string msg = errorMessage(code);
62
62
  if (message)
63
- msg += " :" + *message;
64
-
65
- if ((code != STATUS_TABLE_NOTOPEN) && (code != STATUS_INVALID_BOOKMARK))
66
63
  {
67
- sql_print_error("%s", msg.c_str());
64
+ if ((msg != "") && (*message != ""))
65
+ msg += ": " + *message;
66
+ else
67
+ msg += *message;
68
68
  }
69
+ if ((code != STATUS_TABLE_NOTOPEN) &&
70
+ (code != STATUS_INVALID_BOOKMARK) &&
71
+ (code != STATUS_CANNOT_LOCK_TABLE))
72
+ sql_print_warning("Transactd: %s", msg.c_str());
69
73
  }
70
74
 
71
75
  } // namespace mysql
@@ -32,7 +32,7 @@ namespace mysql
32
32
  {
33
33
 
34
34
  const char* errorMessage(int errorCode);
35
- void printErrorMessage(const int* errorCode, const std::string* msg);
35
+ void printWarningMessage(const int* errorCode, const std::string* msg);
36
36
 
37
37
  } // namespace mysql
38
38
  } // namespace engine
@@ -16,9 +16,8 @@
16
16
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
17
  02111-1307, USA.
18
18
  ================================================================= */
19
-
19
+ #include <my_config.h>
20
20
  #include "mydebuglog.h"
21
- #include "dbManager.h"
22
21
  #include <bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h>
23
22
  #include <bzs/env/crosscompile.h>
24
23
  #include <bzs/env/fileopen.h>
@@ -166,14 +166,14 @@ inline void cp_restore_globals(THD* thd)
166
166
  my_pthread_setspecific_ptr(THR_MALLOC, 0);
167
167
  }
168
168
 
169
- inline bool cp_is_write_lock(handler* file)
169
+ inline void cp_thd_set_read_only(THD* thd)
170
170
  {
171
- return true;
171
+ ;
172
172
  }
173
173
 
174
- inline void cp_thd_set_read_only(THD* thd)
174
+ inline bool cp_thd_get_read_only(THD* thd)
175
175
  {
176
- ;
176
+ return false;
177
177
  }
178
178
 
179
179
  inline bool cp_open_table(THD* thd, TABLE_LIST* tables,
@@ -209,14 +209,14 @@ inline void cp_restore_globals(THD* thd)
209
209
  thd->restore_globals();
210
210
  }
211
211
 
212
- inline bool cp_is_write_lock(handler* file)
212
+ inline void cp_thd_set_read_only(THD* thd)
213
213
  {
214
- return (file->get_lock_type() == F_WRLCK);
214
+ thd->tx_read_only = (thd->variables.tx_read_only != 0);
215
215
  }
216
216
 
217
- inline void cp_thd_set_read_only(THD* thd)
217
+ inline bool cp_thd_get_read_only(THD* thd)
218
218
  {
219
- thd->tx_read_only = (thd->variables.tx_read_only != 0);
219
+ return (thd->variables.tx_read_only != 0);
220
220
  }
221
221
 
222
222
  inline bool cp_open_table(THD* thd, TABLE_LIST* tables,
@@ -92,8 +92,19 @@ void endThread()
92
92
  setStackaddr(0);
93
93
  }
94
94
 
95
+ void waitForServerStart()
96
+ {
97
+ mysql_mutex_lock(&LOCK_server_started);
98
+ while (!mysqld_server_started)
99
+ mysql_cond_wait(&COND_server_started, &LOCK_server_started);
100
+ mysql_mutex_unlock(&LOCK_server_started);
101
+ }
102
+
95
103
  THD* buildTHD()
96
104
  {
105
+ if (!mysqld_server_started)
106
+ waitForServerStart();
107
+
97
108
  THD* thd = new THD();
98
109
  mysql_mutex_lock(&LOCK_thread_count);
99
110
  thd->variables.pseudo_thread_id = thread_id++;
@@ -365,7 +365,7 @@ int dbExecuter::commandExec(std::vector<request>& requests,
365
365
  writeError(1, buf, "");
366
366
  sql_print_error("%s", boost::diagnostic_information(e).c_str());
367
367
  }
368
- printErrorMessage(code, msg);
368
+ printWarningMessage(code, msg);
369
369
  }
370
370
 
371
371
  catch (...)
@@ -90,8 +90,7 @@ activeTable& activeTable::join(recordset& rs, queryBase& q, const _TCHAR* name1,
90
90
  const _TCHAR* name2, const _TCHAR* name3,
91
91
  const _TCHAR* name4, const _TCHAR* name5,
92
92
  const _TCHAR* name6, const _TCHAR* name7,
93
- const _TCHAR* name8, const _TCHAR* name9,
94
- const _TCHAR* name10, const _TCHAR* name11)
93
+ const _TCHAR* name8)
95
94
  {
96
95
  m_imple->join(*rs.m_imple, q, name1, name2, name3, name4, name5, name6,
97
96
  name7, name8);
@@ -102,9 +101,29 @@ activeTable& activeTable::outerJoin(recordset& rs, queryBase& q,
102
101
  const _TCHAR* name1, const _TCHAR* name2,
103
102
  const _TCHAR* name3, const _TCHAR* name4,
104
103
  const _TCHAR* name5, const _TCHAR* name6,
105
- const _TCHAR* name7, const _TCHAR* name8,
106
- const _TCHAR* name9, const _TCHAR* name10,
107
- const _TCHAR* name11)
104
+ const _TCHAR* name7, const _TCHAR* name8)
105
+ {
106
+ m_imple->outerJoin(*rs.m_imple, q, name1, name2, name3, name4, name5, name6,
107
+ name7, name8);
108
+ return *this;
109
+ }
110
+
111
+ activeTable& activeTable::join(recordset& rs, pq_handle& q, const _TCHAR* name1,
112
+ const _TCHAR* name2, const _TCHAR* name3,
113
+ const _TCHAR* name4, const _TCHAR* name5,
114
+ const _TCHAR* name6, const _TCHAR* name7,
115
+ const _TCHAR* name8)
116
+ {
117
+ m_imple->join(*rs.m_imple, q, name1, name2, name3, name4, name5, name6,
118
+ name7, name8);
119
+ return *this;
120
+ }
121
+
122
+ activeTable& activeTable::outerJoin(recordset& rs, pq_handle& q,
123
+ const _TCHAR* name1, const _TCHAR* name2,
124
+ const _TCHAR* name3, const _TCHAR* name4,
125
+ const _TCHAR* name5, const _TCHAR* name6,
126
+ const _TCHAR* name7, const _TCHAR* name8)
108
127
  {
109
128
  m_imple->outerJoin(*rs.m_imple, q, name1, name2, name3, name4, name5, name6,
110
129
  name7, name8);
@@ -123,9 +142,13 @@ activeTable& activeTable::option(int v)
123
142
  return *this;
124
143
  }
125
144
 
126
- activeTable& activeTable::read(recordset& rs, queryBase& q)
145
+ pq_handle activeTable::prepare(queryBase& q, bool serverPrepare)
127
146
  {
147
+ return m_imple->prepare(q, serverPrepare);
148
+ }
128
149
 
150
+ activeTable& activeTable::read(recordset& rs, queryBase& q)
151
+ {
129
152
  m_imple->read(*rs.m_imple, q);
130
153
  return *this;
131
154
  }
@@ -136,6 +159,18 @@ activeTable& activeTable::read(recordset& rs, queryBase& q, validationFunc func)
136
159
  return *this;
137
160
  }
138
161
 
162
+ activeTable& activeTable::read(recordset& rs, pq_handle& q)
163
+ {
164
+ m_imple->read(*rs.m_imple, q);
165
+ return *this;
166
+ }
167
+
168
+ activeTable& activeTable::read(recordset& rs, pq_handle& q, validationFunc func)
169
+ {
170
+ m_imple->read(*rs.m_imple, q, func);
171
+ return *this;
172
+ }
173
+
139
174
  activeTable* activeTable::create(idatabaseManager* mgr, const _TCHAR* tableName)
140
175
  {
141
176
  return new activeTable(mgr, tableName);
@@ -32,6 +32,51 @@ namespace tdap
32
32
  namespace client
33
33
  {
34
34
 
35
+ /* For php use */
36
+ class preparedQuery
37
+ {
38
+ pq_handle m_filter;
39
+ int m_index;
40
+ public:
41
+ preparedQuery(pq_handle filter) : m_filter(filter),m_index(0){}
42
+
43
+ inline bool supplyValue(int index, const _TCHAR* v)
44
+ {
45
+ return client::supplyValue(m_filter, index, v);
46
+ }
47
+
48
+ inline bool supplyValue(int index, __int64 v)
49
+ {
50
+ return client::supplyValue(m_filter, index, v);
51
+ }
52
+
53
+ inline bool supplyValue(int index, double v)
54
+ {
55
+ return client::supplyValue(m_filter, index, v);
56
+ }
57
+
58
+ inline bool addValue(const _TCHAR* v)
59
+ {
60
+ return client::supplyValue(m_filter, m_index++, v);
61
+ }
62
+
63
+ inline bool addValue(__int64 v)
64
+ {
65
+ return client::supplyValue(m_filter, m_index++, v);
66
+ }
67
+
68
+ inline bool addValue(double v)
69
+ {
70
+ return client::supplyValue(m_filter, m_index++, v);
71
+ }
72
+
73
+ inline void resetAddIndex() { m_index = 0; }
74
+ /** @cond INTERNAL */
75
+ inline pq_handle& getFilter() { return m_filter; };
76
+ /** @endcond */
77
+ };
78
+
79
+
35
80
  class DLLLIB activeTable
36
81
  {
37
82
  class activeTableImple* m_imple;
@@ -39,6 +84,13 @@ class DLLLIB activeTable
39
84
  activeTable(const activeTable& r);
40
85
  activeTable& operator=(const activeTable& r);
41
86
 
87
+ template<class T>
88
+ inline void _supplyValue(pq_handle& q, int index, const T v)
89
+ {
90
+ if (!supplyValue(q, index, v))
91
+ THROW_BZS_ERROR_WITH_MSG(_T("Prepared query : supply value error."));
92
+ }
93
+
42
94
  public:
43
95
  explicit activeTable(idatabaseManager* mgr, const _TCHAR* tableName);
44
96
  explicit activeTable(dbmanager_ptr& mgr, const _TCHAR* tableName);
@@ -53,26 +105,143 @@ public:
53
105
 
54
106
  writableRecord& getWritableRecord();
55
107
 
56
- activeTable& join(recordset& mdls, queryBase& q, const _TCHAR* name1,
108
+ activeTable& join(recordset& rs, queryBase& q, const _TCHAR* name1,
57
109
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
58
110
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
59
111
  const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
60
- const _TCHAR* name8 = NULL, const _TCHAR* name9 = NULL,
61
- const _TCHAR* name10 = NULL, const _TCHAR* name11 = NULL);
112
+ const _TCHAR* name8 = NULL);
62
113
 
63
114
  activeTable&
64
- outerJoin(recordset& mdls, queryBase& q, const _TCHAR* name1,
115
+ outerJoin(recordset& rs, queryBase& q, const _TCHAR* name1,
65
116
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
66
117
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
67
118
  const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
68
- const _TCHAR* name8 = NULL, const _TCHAR* name9 = NULL,
69
- const _TCHAR* name10 = NULL, const _TCHAR* name11 = NULL);
119
+ const _TCHAR* name8 = NULL);
120
+
121
+ activeTable& join(recordset& rs, pq_handle& q, const _TCHAR* name1,
122
+ const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
123
+ const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
124
+ const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
125
+ const _TCHAR* name8 = NULL);
126
+
127
+ activeTable&
128
+ outerJoin(recordset& rs, pq_handle& q, const _TCHAR* name1,
129
+ const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
130
+ const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
131
+ const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
132
+ const _TCHAR* name8 = NULL);
70
133
 
71
134
  activeTable& index(int v);
72
135
  table_ptr table() const;
73
136
  activeTable& option(int v);
74
- activeTable& read(recordset& mdls, queryBase& q);
75
- activeTable& read(recordset& mdls, queryBase& q, validationFunc func);
137
+ pq_handle prepare(queryBase& q, bool serverPrepare = false);
138
+ activeTable& read(recordset& rs, queryBase& q);
139
+ activeTable& read(recordset& rs, queryBase& q, validationFunc func);
140
+ activeTable& read(recordset& rs, pq_handle& q);
141
+ activeTable& read(recordset& rs, pq_handle& q, validationFunc func);
142
+
143
+ /** @cond INTERNAL */
144
+ template<class T0>
145
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0)
146
+ {
147
+ _supplyValue(q, 0, v0);
148
+ read(rs, q);
149
+ return *this;
150
+ }
151
+
152
+ template<class T0, class T1>
153
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1)
154
+ {
155
+ _supplyValue(q, 0, v0);
156
+ _supplyValue(q, 1, v1);
157
+ read(rs, q);
158
+ return *this;
159
+ }
160
+
161
+ template<class T0, class T1, class T2>
162
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
163
+ const T2 v2)
164
+ {
165
+ _supplyValue(q, 0, v0);
166
+ _supplyValue(q, 1, v1);
167
+ _supplyValue(q, 2, v2);
168
+ read(rs, q);
169
+ return *this;
170
+ }
171
+
172
+ template<class T0, class T1, class T2, class T3>
173
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
174
+ const T2 v2, const T3 v3)
175
+ {
176
+ _supplyValue(q, 0, v0);
177
+ _supplyValue(q, 1, v1);
178
+ _supplyValue(q, 2, v2);
179
+ _supplyValue(q, 3, v3);
180
+ read(rs, q);
181
+ return *this;
182
+ }
183
+
184
+ template<class T0, class T1, class T2, class T3, class T4>
185
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
186
+ const T2 v2, const T3 v3, const T4 v4)
187
+ {
188
+ _supplyValue(q, 0, v0);
189
+ _supplyValue(q, 1, v1);
190
+ _supplyValue(q, 2, v2);
191
+ _supplyValue(q, 3, v3);
192
+ _supplyValue(q, 4, v4);
193
+ read(rs, q);
194
+ return *this;
195
+ }
196
+
197
+ template<class T0, class T1, class T2, class T3, class T4, class T5>
198
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
199
+ const T2 v2, const T3 v3, const T4 v4, const T5 v5)
200
+ {
201
+ _supplyValue(q, 0, v0);
202
+ _supplyValue(q, 1, v1);
203
+ _supplyValue(q, 2, v2);
204
+ _supplyValue(q, 3, v3);
205
+ _supplyValue(q, 4, v4);
206
+ _supplyValue(q, 5, v5);
207
+ read(rs, q);
208
+ return *this;
209
+ }
210
+
211
+ template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
212
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
213
+ const T2 v2, const T3 v3, const T4 v4, const T5 v5,
214
+ const T6 v6)
215
+ {
216
+ _supplyValue(q, 0, v0);
217
+ _supplyValue(q, 1, v1);
218
+ _supplyValue(q, 2, v2);
219
+ _supplyValue(q, 3, v3);
220
+ _supplyValue(q, 4, v4);
221
+ _supplyValue(q, 5, v5);
222
+ _supplyValue(q, 6, v6);
223
+ read(rs, q);
224
+ return *this;
225
+ }
226
+
227
+ template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
228
+ class T7>
229
+ activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
230
+ const T2 v2, const T3 v3, const T4 v4, const T5 v5,
231
+ const T6 v6, const T7 v7)
232
+ {
233
+ _supplyValue(q, 0, v0);
234
+ _supplyValue(q, 1, v1);
235
+ _supplyValue(q, 2, v2);
236
+ _supplyValue(q, 3, v3);
237
+ _supplyValue(q, 4, v4);
238
+ _supplyValue(q, 5, v5);
239
+ _supplyValue(q, 6, v6);
240
+ _supplyValue(q, 7, v7);
241
+ read(rs, q);
242
+ return *this;
243
+ }
244
+ /** @endcond */
76
245
 
77
246
  /** @cond INTERNAL */
78
247