SQL99_test.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_types.h>
  14. #include <NdbThread.h>
  15. #include <NdbOut.hpp>
  16. #include <NdbSleep.h> 
  17. #include <NDBT.hpp>
  18. #include <sqlext.h>
  19. #include <stdio.h>
  20. //#include <stdlib.h>
  21. #include <unistd.h>
  22. //#include <windows.h>
  23. //#include <process.h>
  24. #define MAX_STR_LEN 128
  25. #define MAX_TABLE_NAME 32
  26. #define MAX_COL_NAME 32
  27. #define MAX_SQL_STMT 2048
  28. #define MAX_VALUE_LEN 32
  29. #define MAX_CHAR_ATTR_LEN 24 
  30. #define NUM_COL_ARITHM 2
  31. #define FLTDEV 0.0001
  32. //#define DBLDEV 0.000000001
  33. #define REPORTERROR(fn, str) ReportError(fn, str, __FILE__, __LINE__)
  34. #define REPORT(str) printf((str))
  35. #define ATTR_TYPE_SWITCH(buffer, ptr, attr) switch(attr){ 
  36. case T_INT:
  37. sprintf((char*)(buffer),"%d", (int)(ptr)) ;
  38. break ;
  39. case T_FLOAT:
  40. sprintf((char*)(buffer),"%f", (float)(ptr)) ;
  41. break ;
  42. default:
  43. break ;
  44. }
  45. #define ATTR_TYPE_SWITCH_T(value, attr) switch(attr){ 
  46. case T_INT:
  47. printf("%d      t", (int)(value)) ;
  48. break ;
  49. case T_FLOAT:
  50. printf("%f      t", (float)(value)) ;
  51. break ;
  52. default:
  53. break ;
  54. }
  55. #define ATTR_TYPE_SWITCH_AGR(str, value_A, value_B, value_C, attr) switch(attr){ 
  56. case T_INT:
  57. printf("%st%d       %dttt%dnn", str, value_A, (int)value_B, (int)value_C) ; break ;
  58. case T_FLOAT:
  59. printf("%st%d       %fttt%dnn", str, value_A, value_B, (int)value_C) ; break ;
  60. default:
  61. break ;
  62. }
  63. #define ODBC_FN(fn, rc) rc = ((((fn)))) ; if(SQL_SUCCESS == rc || SQL_SUCCESS_WITH_INFO == rc){;}else ReportError("ODBC function", "failed in ", __FILE__, __LINE__)
  64. typedef enum attr_type_tag {
  65. T_INT,
  66. T_FLOAT,
  67. // T_DOUBLE,
  68. T_CHAR
  69. } attr_type ;
  70. typedef enum aggr_fn_tag {
  71. FN_COUNT,
  72. FN_SUM,
  73. FN_AVG,
  74. FN_MAX,
  75. FN_MIN,
  76. FN_VARIANCE,
  77. FN_STDDEV
  78. } aggr_fn ;
  79. typedef enum join_type_tag {
  80. ITSELF,
  81. EQUI,
  82. NON_EQUI,
  83. INNER,
  84. OUTTER
  85. } join_type ;
  86. typedef enum arth_op_tag {
  87. MINUS,
  88. PLUS,
  89. MULTI,
  90. DIVIDE,
  91. MODULO
  92. } arth_op ;
  93. typedef struct ODBC_HANDLES_tag{
  94. SQLHENV     henv ;
  95. SQLHDBC     hdbc ;
  96. SQLHSTMT    hstmt ;
  97. } ODBC_HANDLES ;
  98. typedef enum handle_op_tag{
  99. GET,
  100. FREE
  101. } handle_op ;
  102. typedef enum test_case_tag {
  103. NUMERIC_DATA_TYPES,
  104. CHAR_DATA_TYPES,
  105. IDENTIFIERS,
  106. BASIC_QUERY,
  107. PREDICATE_SEARCH,
  108. DATA_MANIPULATION,
  109. NULL_SUPPORT,
  110. BASIC_CONSTRAINTS,
  111. TRANSACTION,
  112. SET_FUNCTIONS,
  113. BASIC_SCHEMA,
  114. JOINED_TABLE,
  115. ALL
  116. } test_case ;
  117. typedef enum status_tag{
  118. S_STOP,
  119. S_IDLE, 
  120. S_STARTED,
  121. S_GET_BUSY,
  122. S_BUSY,
  123. S_EXIT
  124. } status ;
  125. typedef enum type_tag {
  126. T_INSERT,
  127. T_READ,
  128. T_UPDATE,
  129. T_DELETE,
  130. T_READ_VERIFY,
  131. T_DELETE_VERIFY,
  132. T_WAIT
  133. } type ;
  134. typedef struct PARAMS_tag {
  135. int nThreadID ;
  136. int nError ;
  137. int nVerifyFlag ;
  138. status thread_status ;
  139. status report_status ;
  140. type op_type ;
  141. void* pThreadRef ;
  142. char szTableName[MAX_TABLE_NAME] ;
  143. } PARAMS ;
  144. typedef enum table_opt_tag {
  145. CREATE,
  146. DROP
  147. } table_opt ;
  148. static char szANSI[] ="0123456789ABCEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ;
  149. void ReportError(char* szFn, char* szBuffer, char* szFile, int iLine) ;
  150. void HandleError(void*, SQLSMALLINT) ;
  151. SQLRETURN GetHandles(ODBC_HANDLES*, handle_op, bool) ;
  152. SQLRETURN AggregateFn(aggr_fn, char*, int, double*, double*, attr_type) ;
  153. SQLRETURN GetDriverAndSourceInfo(SQLHDBC) ;
  154. SQLRETURN Join(char*, join_type) ;
  155. SQLRETURN GetResults(SQLHSTMT) ;
  156. int ArithOp(char*, int, float*, attr_type, arth_op) ;
  157. void ParseArguments(int argc, const char** argv) ;
  158. void* ThreadFnInt(void*) ;
  159. void* ThreadFnFloat(void*) ;
  160. //void* ThreadFnDouble(void*) ;
  161. void* ThreadFnChar(void*) ; 
  162. inline void AssignTableNames(char* szBuffer, int nTables) ;
  163. SQLRETURN CreateDemoTables(char*, int, table_opt) ;
  164. inline void StartThreads(PARAMS*, void*, int, char*, attr_type, UintPtr*) ;
  165. inline void SetThreadOperationType(PARAMS*, type) ;
  166. inline int  WaitForThreads(PARAMS*) ;
  167. inline void StopThreads(PARAMS*, UintPtr*) ;
  168. inline void PrintAll(char* szTableName, int, attr_type) ;
  169. void AssignRefCharValues(char*, bool) ;
  170. template <class T, class V>
  171. int VerifyArthOp(V* tValue, float* tOperand, T* tRes, arth_op op){
  172. int nResult = 0 ;
  173. int nValue = 0, nOperand = 0 ;
  174. switch(op){
  175. case MINUS:
  176. if(FLTDEV < abs((*tValue - *tOperand) - *tRes))
  177. nResult = -1 ;
  178. break ;
  179. case PLUS:
  180. if(FLTDEV < abs((*tValue + *tOperand) - *tRes))
  181. nResult = -1 ;
  182. break ;
  183. case MULTI:
  184. if(FLTDEV < abs((*tValue * *tOperand) - *tRes))
  185. nResult = -1 ;
  186. break ;
  187. case DIVIDE:
  188. if(FLTDEV < abs((*tValue / *tOperand) - *tRes))
  189. nResult = -1 ;
  190. break ;
  191. case MODULO:
  192. nValue = *tValue ;
  193. nOperand = *tOperand ;
  194. if(*tRes != (nValue % nOperand))
  195. nResult = -1 ;
  196. break ;
  197. }
  198. return nResult ;
  199. }
  200. template <class P> void AssignRefNumValues(P* pRef, attr_type attrType, bool bVerbose) {
  201. int count = 0, rows = 0, nThreadOffset = 0, nRowOffset = 0 ;
  202. P* p = (P*)pRef ;
  203. float fRandomBase = (rand()*rand()) % 100;
  204. for(int c = 0 ; c < nNoOfThreads ; ++c){
  205. nThreadOffset = nNoOfRows*nNoOfCol*c ;
  206. for(int d = 0 ; d < nNoOfRows ; ++d){
  207. nRowOffset = nNoOfCol*d ; ++rows ;
  208. for(int i = 0 ; i < nNoOfCol ; ++i){
  209. (p[nThreadOffset + nRowOffset + i]) = (fRandomBase*(c+1) + (d+3)*7 + i)/1.1034093201 ;
  210. ++count ;
  211. if(bVerbose){
  212. ATTR_TYPE_SWITCH_T(p[nThreadOffset + nRowOffset + i], AttributeType) ;
  213. }
  214. }
  215. if(bVerbose) { printf("n") ; NdbSleep_MilliSleep(10) ;
  216. }
  217. }
  218. }
  219. if(bVerbose){
  220. printf("_____________________") ;
  221. printf("nRows: %d Values: %dnn", rows, count) ;
  222. }
  223. return ;