summaryrefslogtreecommitdiff
path: root/storage/ndb/test/odbc/SQL99_test/SQL99_test.h
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/test/odbc/SQL99_test/SQL99_test.h')
-rw-r--r--storage/ndb/test/odbc/SQL99_test/SQL99_test.h261
1 files changed, 261 insertions, 0 deletions
diff --git a/storage/ndb/test/odbc/SQL99_test/SQL99_test.h b/storage/ndb/test/odbc/SQL99_test/SQL99_test.h
new file mode 100644
index 00000000000..1c49f4a9a51
--- /dev/null
+++ b/storage/ndb/test/odbc/SQL99_test/SQL99_test.h
@@ -0,0 +1,261 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+#include <ndb_types.h>
+#include <NdbThread.h>
+#include <NdbOut.hpp>
+#include <NdbSleep.h>
+#include <NDBT.hpp>
+#include <sqlext.h>
+#include <stdio.h>
+//#include <stdlib.h>
+#include <unistd.h>
+//#include <windows.h>
+//#include <process.h>
+
+#define MAX_STR_LEN 128
+#define MAX_TABLE_NAME 32
+#define MAX_COL_NAME 32
+#define MAX_SQL_STMT 2048
+#define MAX_VALUE_LEN 32
+#define MAX_CHAR_ATTR_LEN 24
+#define NUM_COL_ARITHM 2
+#define FLTDEV 0.0001
+//#define DBLDEV 0.000000001
+
+#define REPORTERROR(fn, str) ReportError(fn, str, __FILE__, __LINE__)
+#define REPORT(str) printf((str))
+
+#define ATTR_TYPE_SWITCH(buffer, ptr, attr) switch(attr){ \
+ case T_INT:\
+ sprintf((char*)(buffer),"%d", (int)(ptr)) ;\
+ break ;\
+ case T_FLOAT:\
+ sprintf((char*)(buffer),"%f", (float)(ptr)) ;\
+ break ;\
+ default:\
+ break ;\
+ }
+
+#define ATTR_TYPE_SWITCH_T(value, attr) switch(attr){ \
+ case T_INT:\
+ printf("%d \t", (int)(value)) ;\
+ break ;\
+ case T_FLOAT:\
+ printf("%f \t", (float)(value)) ;\
+ break ;\
+ default:\
+ break ;\
+ }
+
+#define ATTR_TYPE_SWITCH_AGR(str, value_A, value_B, value_C, attr) switch(attr){ \
+ case T_INT:\
+ printf("%s\t%d %d\t\t\t%d\n\n", str, value_A, (int)value_B, (int)value_C) ; break ;\
+ case T_FLOAT:\
+ printf("%s\t%d %f\t\t\t%d\n\n", str, value_A, value_B, (int)value_C) ; break ;\
+ default:\
+ break ;\
+ }
+
+
+#define ODBC_FN(fn, rc) rc = ((((fn)))) ; if(SQL_SUCCESS == rc || SQL_SUCCESS_WITH_INFO == rc){;}else ReportError("ODBC function", "failed in ", __FILE__, __LINE__)
+
+
+typedef enum attr_type_tag {
+ T_INT,
+ T_FLOAT,
+// T_DOUBLE,
+ T_CHAR
+} attr_type ;
+
+typedef enum aggr_fn_tag {
+ FN_COUNT,
+ FN_SUM,
+ FN_AVG,
+ FN_MAX,
+ FN_MIN,
+ FN_VARIANCE,
+ FN_STDDEV
+} aggr_fn ;
+
+typedef enum join_type_tag {
+ ITSELF,
+ EQUI,
+ NON_EQUI,
+ INNER,
+ OUTTER
+} join_type ;
+
+typedef enum arth_op_tag {
+ MINUS,
+ PLUS,
+ MULTI,
+ DIVIDE,
+ MODULO
+} arth_op ;
+
+typedef struct ODBC_HANDLES_tag{
+ SQLHENV henv ;
+ SQLHDBC hdbc ;
+ SQLHSTMT hstmt ;
+} ODBC_HANDLES ;
+
+typedef enum handle_op_tag{
+ GET,
+ FREE
+} handle_op ;
+
+typedef enum test_case_tag {
+ NUMERIC_DATA_TYPES,
+ CHAR_DATA_TYPES,
+ IDENTIFIERS,
+ BASIC_QUERY,
+ PREDICATE_SEARCH,
+ DATA_MANIPULATION,
+ NULL_SUPPORT,
+ BASIC_CONSTRAINTS,
+ TRANSACTION,
+ SET_FUNCTIONS,
+ BASIC_SCHEMA,
+ JOINED_TABLE,
+ ALL
+} test_case ;
+
+typedef enum status_tag{
+ S_STOP,
+ S_IDLE,
+ S_STARTED,
+ S_GET_BUSY,
+ S_BUSY,
+ S_EXIT
+} status ;
+
+typedef enum type_tag {
+ T_INSERT,
+ T_READ,
+ T_UPDATE,
+ T_DELETE,
+ T_READ_VERIFY,
+ T_DELETE_VERIFY,
+ T_WAIT
+} type ;
+
+typedef struct PARAMS_tag {
+ int nThreadID ;
+ int nError ;
+ int nVerifyFlag ;
+ status thread_status ;
+ status report_status ;
+ type op_type ;
+ void* pThreadRef ;
+ char szTableName[MAX_TABLE_NAME] ;
+} PARAMS ;
+
+typedef enum table_opt_tag {
+ CREATE,
+ DROP
+} table_opt ;
+
+static char szANSI[] ="0123456789ABCEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ;
+
+void ReportError(char* szFn, char* szBuffer, char* szFile, int iLine) ;
+void HandleError(void*, SQLSMALLINT) ;
+SQLRETURN GetHandles(ODBC_HANDLES*, handle_op, bool) ;
+SQLRETURN AggregateFn(aggr_fn, char*, int, double*, double*, attr_type) ;
+SQLRETURN GetDriverAndSourceInfo(SQLHDBC) ;
+SQLRETURN Join(char*, join_type) ;
+SQLRETURN GetResults(SQLHSTMT) ;
+int ArithOp(char*, int, float*, attr_type, arth_op) ;
+void ParseArguments(int argc, const char** argv) ;
+void* ThreadFnInt(void*) ;
+void* ThreadFnFloat(void*) ;
+//void* ThreadFnDouble(void*) ;
+void* ThreadFnChar(void*) ;
+inline void AssignTableNames(char* szBuffer, int nTables) ;
+SQLRETURN CreateDemoTables(char*, int, table_opt) ;
+inline void StartThreads(PARAMS*, void*, int, char*, attr_type, UintPtr*) ;
+inline void SetThreadOperationType(PARAMS*, type) ;
+inline int WaitForThreads(PARAMS*) ;
+inline void StopThreads(PARAMS*, UintPtr*) ;
+inline void PrintAll(char* szTableName, int, attr_type) ;
+void AssignRefCharValues(char*, bool) ;
+
+template <class T, class V>
+int VerifyArthOp(V* tValue, float* tOperand, T* tRes, arth_op op){
+
+ int nResult = 0 ;
+ int nValue = 0, nOperand = 0 ;
+
+ switch(op){
+ case MINUS:
+ if(FLTDEV < abs((*tValue - *tOperand) - *tRes))
+ nResult = -1 ;
+ break ;
+ case PLUS:
+ if(FLTDEV < abs((*tValue + *tOperand) - *tRes))
+ nResult = -1 ;
+ break ;
+ case MULTI:
+ if(FLTDEV < abs((*tValue * *tOperand) - *tRes))
+ nResult = -1 ;
+ break ;
+ case DIVIDE:
+ if(FLTDEV < abs((*tValue / *tOperand) - *tRes))
+ nResult = -1 ;
+ break ;
+ case MODULO:
+ nValue = *tValue ;
+ nOperand = *tOperand ;
+ if(*tRes != (nValue % nOperand))
+ nResult = -1 ;
+ break ;
+ }
+
+ return nResult ;
+}
+
+template <class P> void AssignRefNumValues(P* pRef, attr_type attrType, bool bVerbose) {
+
+ int count = 0, rows = 0, nThreadOffset = 0, nRowOffset = 0 ;
+ P* p = (P*)pRef ;
+
+ float fRandomBase = (rand()*rand()) % 100;
+ for(int c = 0 ; c < nNoOfThreads ; ++c){
+ nThreadOffset = nNoOfRows*nNoOfCol*c ;
+ for(int d = 0 ; d < nNoOfRows ; ++d){
+ nRowOffset = nNoOfCol*d ; ++rows ;
+ for(int i = 0 ; i < nNoOfCol ; ++i){
+ (p[nThreadOffset + nRowOffset + i]) = (fRandomBase*(c+1) + (d+3)*7 + i)/1.1034093201 ;
+ ++count ;
+ if(bVerbose){
+ ATTR_TYPE_SWITCH_T(p[nThreadOffset + nRowOffset + i], AttributeType) ;
+ }
+ }
+ if(bVerbose) { printf("\n") ; NdbSleep_MilliSleep(10) ;
+ }
+ }
+ }
+
+ if(bVerbose){
+ printf("_____________________") ;
+ printf("\nRows: %d Values: %d\n\n", rows, count) ;
+ }
+
+ return ;
+}
+
+