blob: 5c769e14bf9da273dd85ed6a7dc30228532ab05a [file] [log] [blame]
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
#include <sql.h>
#include <sqlext.h>
#ifdef _UNICODE
#include <sqlucode.h>
#endif
#define SQL_MAX_SERVER_LEN 128*4+1
#define SQL_MAX_PORT_LEN 5+1
#define SQL_MAX_BUFFER_LEN 128*4+1
#define SQL_MAX_DB_NAME_LEN 60+1
#define MAX_CONNECT_STRING 512*4+1
#define MAX_SQLSTRING_LEN 2000*4+1
#define STATE_SIZE 5+1
#define SQL_MAX_DRIVER_LENGTH 300*4+1
#define MAX_NUM_COLUMNS 13
#define MAX_COLUMN_OUTPUT 300+1
#define SQL_MAX_TABLE_TYPE_LEN 10+1
#define SQL_MAX_REMARK_LEN 60+1
#define END_LOOP _T("END_LOOP")
#define CREATE_TABLE _T("create table ")
#define INSERT_TABLE _T("insert into ")
#define SELECT_TABLE _T("select ")
#define DROP_TABLE _T("drop table ")
// global struct to be used everywhere in the program.
typedef struct TestInfo
{
_TCHAR Server[SQL_MAX_SERVER_LEN];
_TCHAR Port[SQL_MAX_PORT_LEN];
_TCHAR DataSource[SQL_MAX_DSN_LENGTH];
_TCHAR UserName[SQL_MAX_USER_NAME_LEN];
_TCHAR Password[SQL_MAX_USER_NAME_LEN];
_TCHAR Database[SQL_MAX_DB_NAME_LEN];
_TCHAR Catalog[SQL_MAX_CATALOG_NAME_LEN];
_TCHAR Schema[SQL_MAX_SCHEMA_NAME_LEN];
_TCHAR Table[SQL_MAX_TABLE_NAME_LEN];
HENV henv;
HDBC hdbc;
HSTMT hstmt;
} TestInfo;
// max sql string that can be used in this program.
_TCHAR SQLStmt[MAX_SQLSTRING_LEN];
int Actual_Num_Columns;
int rowdata;
_TCHAR OutString[100];
// SQL Datatype
struct
{
_TCHAR *DataTypestr;
SWORD DataType;
SWORD CDataType;
_TCHAR *Name; // column name
BOOL PriKey; // primary key
_TCHAR *Description;
_TCHAR *Precision;
_TCHAR *Scale;
} ColumnInfo[] =
{
{_T("SQL_CHAR"),SQL_CHAR,SQL_C_TCHAR,_T("Column_Char"),TRUE,_T("char"),_T("200"),_T("")},
// {END_LOOP,}, use for testing
{_T("SQL_VARCHAR"),SQL_VARCHAR,SQL_C_TCHAR,_T("Column_Varchar"),FALSE,_T("varchar"),_T("254"),_T("")},
{_T("SQL_DECIMAL"),SQL_DECIMAL,SQL_C_TCHAR,_T("Column_Decimal"),FALSE,_T("decimal"),_T("15"),_T("5")},
{_T("SQL_NUMERIC"),SQL_NUMERIC,SQL_C_TCHAR,_T("Column_Numeric"),FALSE,_T("numeric"),_T("15"),_T("5")},
{_T("SQL_SMALLINT"),SQL_SMALLINT,SQL_C_SHORT,_T("Column_Smallint"),FALSE,_T("smallint"),_T(""),},
{_T("SQL_INTEGER"),SQL_INTEGER,SQL_C_LONG,_T("Column_Integer"),TRUE,_T("integer"),_T(""),},
{_T("SQL_REAL"),SQL_REAL,SQL_C_FLOAT,_T("Column_Real"),FALSE,_T("real"),_T(""),},
{_T("SQL_FLOAT"),SQL_FLOAT,SQL_C_DOUBLE,_T("Column_Float"),FALSE,_T("float"),_T(""),},
{_T("SQL_DOUBLE"),SQL_DOUBLE,SQL_C_DOUBLE,_T("Column_Double"),FALSE,_T("double precision"),_T(""),},
{_T("SQL_TYPE_DATE"),SQL_TYPE_DATE,SQL_C_TYPE_DATE,_T("Column_Date"),FALSE,_T("date"),_T(""),},
{_T("SQL_TYPE_TIME"),SQL_TYPE_TIME,SQL_C_TYPE_TIME,_T("Column_Time"),FALSE,_T("time"),_T(""),},
{_T("SQL_TYPE_TIMESTAMP"),SQL_TYPE_TIMESTAMP,SQL_C_TYPE_TIMESTAMP,_T("Column_Timestamp"),FALSE,_T("timestamp"),_T(""),},
{_T("SQL_BIGINT"),SQL_BIGINT,SQL_C_TCHAR,_T("Column_Bint"),FALSE,_T("largeint"),_T(""),},
{END_LOOP,}
};
// Datatypes below are used for datatype conversion from
// SQL_C_TYPE to SQL_TYPE and viceversa.
struct
{
_TCHAR *CharValue;
_TCHAR *VarcharValue;
_TCHAR *DecimalValue;
_TCHAR *NumericValue;
SWORD ShortValue;
SDWORD LongValue;
SFLOAT RealValue;
SDOUBLE FloatValue;
SDOUBLE DoubleValue;
DATE_STRUCT DateValue;
TIME_STRUCT TimeValue;
TIMESTAMP_STRUCT TimestampValue;
_TCHAR *BigintValue;
SQLLEN InValue;
SQLLEN InValue1;
} InputOutputValues[] =
{
{_T("C1"),_T("V1"),_T("1.2"),_T("1.2"),1,1,1.0,1.0,1.0,{1997,12,30},{11,45,23},{1997,10,12,11,33,41,123456},_T("1"),SQL_NTS,0},
{_T("Char data2"),_T("Varchar data2"),_T("1234.56"),_T("5678.12"),1234,12345,12340.0,12300.0,12345670.0,{1998,12,30},{11,45,23},{1998,10,12,11,33,41,123456},_T("123456"),SQL_NTS,0},
{_T("Character data for row 3"),_T("Varchar data for row 3"),_T("1234567.89"),_T("9876543.21"),9999,98765,98765.0,987654.0,98765432.0,{2000,01,01},{11,45,23},{1999,12,31,12,00,00,000000},_T("9876543"),SQL_NTS,0},
{END_LOOP,}
};
struct
{
_TCHAR *DataTypestr;
SWORD DataType;
SWORD CDataType;
_TCHAR *Name; // column name
BOOL PriKey; // primary key
_TCHAR *Description;
_TCHAR *Precision;
_TCHAR *Scale;
_TCHAR *Default;
} ColumnInfo2[] =
{
{_T("SQL_LONGVARCHAR"),SQL_LONGVARCHAR,SQL_C_TCHAR,_T("Column_LongVarchar"),FALSE,_T("long varchar"),_T("255"),_T(""),_T("'Default LongVarchar Value'")},
{_T("SQL_INTERVAL_YEAR"),SQL_INTERVAL_YEAR,SQL_C_INTERVAL_YEAR,_T("Column_IntervalYear"),FALSE,_T("interval year(4)"),_T(""),_T(""),_T("{interval '1000' year(4)}")},
{_T("SQL_INTERVAL_MONTH"),SQL_INTERVAL_MONTH,SQL_C_INTERVAL_MONTH,_T("Column_IntervalMonth"),FALSE,_T("interval month(3)"),_T(""),_T(""),_T("{interval '100' month(3)}")},
{_T("SQL_INTERVAL_YEAR_TO_MONTH"),SQL_INTERVAL_YEAR_TO_MONTH,SQL_C_INTERVAL_YEAR_TO_MONTH,_T("Column_IntervalYearToMonth"),FALSE,_T("interval year(3) to month"),_T(""),_T(""),_T("{interval '100-10' year(3) to month}")},
{_T("SQL_INTERVAL_DAY"),SQL_INTERVAL_DAY,SQL_C_INTERVAL_DAY,_T("Column_IntervalDay"),FALSE,_T("interval day(4)"),_T(""),_T(""),_T("{interval '1000' day(4)}")},
{_T("SQL_INTERVAL_HOUR"),SQL_INTERVAL_HOUR,SQL_C_INTERVAL_HOUR,_T("Column_IntervalHour"),FALSE,_T("interval hour(3)"),_T(""),_T(""),_T("{interval '100' hour(3)}")},
{_T("SQL_INTERVAL_MINUTE"),SQL_INTERVAL_MINUTE,SQL_C_INTERVAL_MINUTE,_T("Column_IntervalMinute"),FALSE,_T("interval minute(3)"),_T(""),_T(""),_T("{interval '100' minute(3)}")},
{_T("SQL_INTERVAL_SECOND"),SQL_INTERVAL_SECOND,SQL_C_INTERVAL_SECOND,_T("Column_IntervalSecond"),FALSE,_T("interval second(3,2)"),_T(""),_T(""),_T("{interval '100.10' second(3,2)}")},
{_T("SQL_INTERVAL_DAY_TO_HOUR"),SQL_INTERVAL_DAY_TO_HOUR,SQL_C_INTERVAL_DAY_TO_HOUR,_T("Column_IntervalDayToHour"),FALSE,_T("interval day(3) to hour"),_T(""),_T(""),_T("{interval '100 10' day(3) to hour}")},
{_T("SQL_INTERVAL_DAY_TO_MINUTE"),SQL_INTERVAL_DAY_TO_MINUTE,SQL_C_INTERVAL_DAY_TO_MINUTE,_T("Column_IntervalDayToMinute"),FALSE,_T("interval day(3) to minute"),_T(""),_T(""),_T("{interval '100 10:10' day(3) to minute}")},
{_T("SQL_INTERVAL_DAY_TO_SECOND"),SQL_INTERVAL_DAY_TO_SECOND,SQL_C_INTERVAL_DAY_TO_SECOND,_T("Column_IntervalDayToSecond"),FALSE,_T("interval day(3) to second(3)"),_T(""),_T(""),_T("{interval '100 10:10:10' day(3) to second(3)}")},
{_T("SQL_INTERVAL_HOUR_TO_MINUTE"),SQL_INTERVAL_HOUR_TO_MINUTE,SQL_C_INTERVAL_HOUR_TO_MINUTE,_T("Column_IntervalHourToMinute"),FALSE,_T("interval hour(3) to minute"),_T(""),_T(""),_T("{interval '100:10' hour(3) to minute}")},
{_T("SQL_INTERVAL_HOUR_TO_SECOND"),SQL_INTERVAL_HOUR_TO_SECOND,SQL_C_INTERVAL_HOUR_TO_SECOND,_T("Column_IntervalHourToSecond"),FALSE,_T("interval hour(3) to second(4)"),_T(""),_T(""),_T("{interval '100:10:10' hour(3) to second(4)}")},
{_T("SQL_INTERVAL_MINUTE_TO_SECOND"),SQL_INTERVAL_MINUTE_TO_SECOND,SQL_C_INTERVAL_MINUTE_TO_SECOND,_T("Column_IntervalMinuteToSecond"),FALSE,_T("interval minute(3) to second(5)"),_T(""),_T(""),_T("{interval '100:10' minute(3) to second(5)}")},
{_T("SQL_TYPE_DATE"),SQL_TYPE_DATE,SQL_C_TYPE_DATE,_T("Column_Date"),FALSE,_T("date"),_T(""),_T(""),_T("{d '2003-05-12'}")},
{_T("SQL_TYPE_TIME"),SQL_TYPE_TIME,SQL_C_TYPE_TIME,_T("Column_Time"),FALSE,_T("time"),_T(""),_T(""),_T("{t '16:30:00'}")},
{_T("SQL_TYPE_TIMESTAMP"),SQL_TYPE_TIMESTAMP,SQL_C_TYPE_TIMESTAMP,_T("Column_Timestamp"),FALSE,_T("timestamp"),_T(""),_T(""),_T("{ts '2003-05-12 16:30:00'}")},
{_T("SQL_CHAR"),SQL_CHAR,SQL_C_TCHAR,_T("Column_Char"),TRUE,_T("char"),_T("200"),_T(""),_T("")},
{END_LOOP,}
};
// Datatypes below are used for datatype conversion from
// SQL_C_TYPE to SQL_TYPE and viceversa.
struct
{
_TCHAR *LongVarcharValue;
_TCHAR *IntervalYearValue;
_TCHAR *IntervalMonthValue;
_TCHAR *IntervalYearToMonthValue;
_TCHAR *IntervalDayValue;
_TCHAR *IntervalHourValue;
_TCHAR *IntervalMinuteValue;
_TCHAR *IntervalSecondValue;
_TCHAR *IntervalDayToHourValue;
_TCHAR *IntervalDayToMinuteValue;
_TCHAR *IntervalDayToSecondValue;
_TCHAR *IntervalHourToMinuteValue;
_TCHAR *IntervalHourToSecondValue;
_TCHAR *IntervalMinuteToSecondValue;
_TCHAR *DateValue;
_TCHAR *TimeValue;
_TCHAR *TimestampValue;
_TCHAR *CharValue;
SQLLEN InValue;
SQLLEN InValue1;
BOOL UseExecDirect;
BOOL UseDefaults;
} InputOutputValues2[] =
{
{_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T("five"),SQL_NTS,0,0,1},
{_T("LV1"),_T("{interval '326' year(4)}"),_T("{interval '326' month(3)}"),_T("{interval '163-11' year(3) to month}"),_T("{interval '3261' day(4)}"),_T("{interval '163' hour(3)}"),_T("{interval '163' minute(3)}"),_T("{interval '223.16' second(3,2)}"),_T("{interval '163 12' day(3) to hour}"),_T("{interval '163 12:39' day(3) to minute}"),_T("{interval '163 12:39:59.16' day(3) to second(3)}")/*"{interval '163 12:39:59.163' day(3) to second(3)}"*/,_T("{interval '163:39' hour(3) to minute}"),_T("{interval '163:39:59.163' hour(3) to second(4)}"),_T("{interval '163:59.163' minute(3) to second(5)}"),_T("{d '2003-04-11'}"),_T("{t '19:40:20'}"),_T("{ts '2003-04-10 21:22:23.123456'}"),_T("one"),SQL_NTS,0,0,0},
{_T("LongVarchar Data for Row3"),_T("cast (99 as interval year(4))"),_T("cast (999 as interval month(3))"),_T("cast ('163-11' as interval year(3) to month)"),_T("cast ('3261' as interval day(4))"),_T("cast ('163' as interval hour(3))"),_T("cast ('163' as interval minute(3))"),_T("cast ('223.16' as interval second(3,2))"),_T("cast ('163 12' as interval day(3) to hour)"),_T("cast ('163 12:39' as interval day(3) to minute)"),_T("cast ('163 12:39:59.16' as interval day(3) to second(3))")/*"cast ('163 12:39:59.163' as interval day(3) to second(3))"*/,_T("cast ('163:39' as interval hour(3) to minute)"),_T("cast ('163:39:59.163' as interval hour(3) to second(4))"),_T("cast ('163:59.163' as interval minute(3) to second(5))"),_T("cast ('2000-12-31' as date)"),_T("cast ('23:59:59' as time)"),_T("cast ('2000-12-31 23:59:59.123456' as timestamp)"),_T("three"),SQL_NTS,0,1,0},
// {_T("LV Data for Defaults row"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T("five"),SQL_NTS,0,0,1},
{END_LOOP,}
};
struct
{
_TCHAR *Year;
_TCHAR *Month;
_TCHAR *YearToMonth;
_TCHAR *Day;
_TCHAR *Hour;
_TCHAR *Minute;
_TCHAR *Second;
_TCHAR *DayToHour;
_TCHAR *DayToMinute;
_TCHAR *DayToSecond;
_TCHAR *HourToMinute;
_TCHAR *HourToSecond;
_TCHAR *MinuteToSecond;
DATE_STRUCT DateValue;
TIME_STRUCT TimeValue;
TIMESTAMP_STRUCT TimestampValue;
} IntervalValues[] =
{
{_T("1000"),_T("100"),_T("100-10"),_T("1000"),_T("100"),_T("100"),_T("100.10"),_T("100 10"),_T("100 10:10"),_T("100 10:10:10"),_T("100:10"),_T("100:10:10"),_T("100:10"),{2003,05,12},{16,30,00},{2003,05,12,16,30,00,0}},
{_T("326"),_T("326"),_T("163-11"),_T("3261"),_T("163"),_T("163"),_T("223.16"),_T("163 12"),_T("163 12:39"),_T("163 12:39:59.16")/*"163 12:39:59.163"*/,_T("163:39"),_T("163:39:59.1630"),_T("163:59.16300"),{2003,04,11},{19,40,20},{2003,04,10,21,22,23,123456}},
// {_T("-326"),_T("-326"),_T("-163-11"),_T("-3261"),_T("-163"),_T("-163"),_T("-223.16"),_T("-163 12"),_T("-163 12:39"),_T("-16 23:39:56.23"),_T("-163:39"),_T("-163:39:59.1630"),_T("-163:59.16300"),{1901,01,1},{1,0,0},{1901,01,1,1,0,0,0}},
{_T("99"),_T("999"),_T("163-11"),_T("3261"),_T("163"),_T("163"),_T("223.16"),_T("163 12"),_T("163 12:39"),_T("163 12:39:59.16")/*"163 12:39:59.163"*/,_T("163:39"),_T("163:39:59.1630"),_T("163:59.16300"),{2003,12,31},{23,59,59},{2003,12,31,23,59,59,123456}},
{_T("999")},
};
struct
{
_TCHAR *DataTypestr;
SWORD DataType;
SWORD CDataType;
_TCHAR *Name; // column name
BOOL PriKey; // primary key
_TCHAR *Description;
_TCHAR *Precision;
_TCHAR *Scale;
_TCHAR *Charset;
} ColumnInfo3[] =
{
{_T("SQL_CHAR"),SQL_CHAR,SQL_C_TCHAR,_T("UTF8_Column_Char"),TRUE,_T("char"),_T("255"),_T(""),_T("character set UTF8")},
{_T("SQL_VARCHAR"),SQL_VARCHAR,SQL_C_TCHAR,_T("UTF8_Column_Varchar"),FALSE,_T("varchar"),_T("255"),_T(""),_T("character set UTF8")},
{_T("SQL_WCHAR"),SQL_WCHAR,SQL_C_TCHAR,_T("Column_WChar1"),FALSE,_T("wchar"),_T("255"),_T(""),_T("")},
{_T("SQL_WCHAR"),SQL_WCHAR,SQL_C_TCHAR,_T("Column_WChar2"),FALSE,_T("char"),_T("255"),_T(""),_T("character set UCS2")},
{_T("SQL_WVARCHAR"),SQL_WVARCHAR,SQL_C_TCHAR,_T("Column_WVarchar"),FALSE,_T("varchar"),_T("255"),_T(""),_T("character set UCS2")},
{_T("SQL_BIT"),SQL_BIT,SQL_C_SHORT,_T("Column_Bit"),FALSE,_T("bit"),_T(""),_T(""),_T("")},
{_T("SQL_TINYINT"),SQL_TINYINT,SQL_C_SHORT,_T("Column_TinyInt"),FALSE,_T("tinyint"),_T(""),_T(""),_T("")},
{_T("SQL_BINARY"),SQL_BINARY,SQL_C_TCHAR,_T("Column_Binary"),FALSE,_T("binary"),_T("255"),_T(""),_T("")},
{_T("SQL_VARBINARY"),SQL_VARBINARY,SQL_C_TCHAR,_T("Column_VarBinary"),FALSE,_T("varbinary"),_T("255"),_T(""),_T("")},
{END_LOOP,}
};
struct
{
_TCHAR *UTF8CharValue;
_TCHAR *UTF8VarcharValue;
_TCHAR *WCharValue1;
_TCHAR *WCharValue2;
_TCHAR *WVarcharValue;
SWORD BitValue;
SWORD TinyintValue;
_TCHAR *BinaryValue;
_TCHAR *VarBinaryValue;
SQLLEN InValue;
SQLLEN InValue1;
BOOL UseExecDirect;
} InputOutputValues3[] =
{
{_T("UTF8 Char Value"),_T("UTF8 Varchar Value"),_T("WChar Value1"),_T("WChar Value2"),_T("WVarchar Value"),0,11,_T("1001"),_T("1001"),SQL_NTS,0,1},
{_T("UTF8 Char Value_2"),_T("UTF8 Varchar Value_2"),_T("WChar Value1_2"),_T("WChar Value2_2"),_T("WVarchar Value_2"),1,22,_T("1002"),_T("1002"),SQL_NTS,0,0},
{END_LOOP,}
};