Skip to content

Commit b74a1a2

Browse files
authored
Improve program dataType(name) access (#333)
* Improve program dataType(name) access Export all data types on the main package export object Return a dataTypeName property on result objects Signed-off-by: Mark Irish <[email protected]>
1 parent abdfd13 commit b74a1a2

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

lib/odbc.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ declare namespace odbc {
33
class ColumnDefinition {
44
name: string;
55
dataType: number;
6+
dataTypeName: string;
67
columnSize: number;
78
decimalDigits: number;
89
nullable: boolean;

src/odbc.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,50 @@ Napi::Value ODBC::Init(Napi::Env env, Napi::Object exports) {
8282
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_PARAM_INPUT_OUTPUT", Napi::Number::New(env, SQL_PARAM_INPUT_OUTPUT), napi_enumerable));
8383
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_PARAM_OUTPUT", Napi::Number::New(env, SQL_PARAM_OUTPUT), napi_enumerable));
8484

85+
// Export the integer values for each data type so developers can utilize
86+
// them programmatically if needed
87+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_CHAR", Napi::Number::New(env, SQL_CHAR), napi_enumerable));
8588
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_VARCHAR", Napi::Number::New(env, SQL_VARCHAR), napi_enumerable));
89+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_LONGVARCHAR", Napi::Number::New(env, SQL_LONGVARCHAR), napi_enumerable));
90+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_WCHAR", Napi::Number::New(env, SQL_WCHAR), napi_enumerable));
8691
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_WVARCHAR", Napi::Number::New(env, SQL_WVARCHAR), napi_enumerable));
87-
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTEGER", Napi::Number::New(env, SQL_INTEGER), napi_enumerable));
92+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_WLONGVARCHAR", Napi::Number::New(env, SQL_WLONGVARCHAR), napi_enumerable));
93+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_DECIMAL", Napi::Number::New(env, SQL_DECIMAL), napi_enumerable));
94+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_NUMERIC", Napi::Number::New(env, SQL_NUMERIC), napi_enumerable));
8895
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_SMALLINT", Napi::Number::New(env, SQL_SMALLINT), napi_enumerable));
96+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTEGER", Napi::Number::New(env, SQL_INTEGER), napi_enumerable));
97+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_REAL", Napi::Number::New(env, SQL_REAL), napi_enumerable));
98+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_FLOAT", Napi::Number::New(env, SQL_FLOAT), napi_enumerable));
99+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_DOUBLE", Napi::Number::New(env, SQL_DOUBLE), napi_enumerable));
100+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_BIT", Napi::Number::New(env, SQL_BIT), napi_enumerable));
101+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TINYINT", Napi::Number::New(env, SQL_TINYINT), napi_enumerable));
102+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_BIGINT", Napi::Number::New(env, SQL_BIGINT), napi_enumerable));
103+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_BINARY", Napi::Number::New(env, SQL_BINARY), napi_enumerable));
104+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_VARBINARY", Napi::Number::New(env, SQL_VARBINARY), napi_enumerable));
105+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_LONGVARBINARY", Napi::Number::New(env, SQL_LONGVARBINARY), napi_enumerable));
106+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TYPE_DATE", Napi::Number::New(env, SQL_TYPE_DATE), napi_enumerable));
107+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TYPE_TIME", Napi::Number::New(env, SQL_TYPE_TIME), napi_enumerable));
108+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TYPE_TIMESTAMP", Napi::Number::New(env, SQL_TYPE_TIMESTAMP), napi_enumerable));
109+
// These are listed in the Microsoft ODBC documentation, but don't appear to
110+
// be in unixODBC
111+
// ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TYPE_UTCDATETIME", Napi::Number::New(env, SQL_TYPE_UTCDATETIME), napi_enumerable));
112+
// ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_TYPE_UTCTIME", Napi::Number::New(env, SQL_TYPE_UTCTIME), napi_enumerable));
113+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_MONTH", Napi::Number::New(env, SQL_INTERVAL_MONTH), napi_enumerable));
114+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_YEAR", Napi::Number::New(env, SQL_INTERVAL_YEAR), napi_enumerable));
115+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_YEAR_TO_MONTH", Napi::Number::New(env, SQL_INTERVAL_YEAR_TO_MONTH), napi_enumerable));
116+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_DAY", Napi::Number::New(env, SQL_INTERVAL_DAY), napi_enumerable));
117+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_HOUR", Napi::Number::New(env, SQL_INTERVAL_HOUR), napi_enumerable));
118+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_MINUTE", Napi::Number::New(env, SQL_INTERVAL_MINUTE), napi_enumerable));
119+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_SECOND", Napi::Number::New(env, SQL_INTERVAL_SECOND), napi_enumerable));
120+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_DAY_TO_HOUR", Napi::Number::New(env, SQL_INTERVAL_DAY_TO_HOUR), napi_enumerable));
121+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_DAY_TO_MINUTE", Napi::Number::New(env, SQL_INTERVAL_DAY_TO_MINUTE), napi_enumerable));
122+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_DAY_TO_SECOND", Napi::Number::New(env, SQL_INTERVAL_DAY_TO_SECOND), napi_enumerable));
123+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_HOUR_TO_MINUTE", Napi::Number::New(env, SQL_INTERVAL_HOUR_TO_MINUTE), napi_enumerable));
124+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_HOUR_TO_SECOND", Napi::Number::New(env, SQL_INTERVAL_HOUR_TO_SECOND), napi_enumerable));
125+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_INTERVAL_MINUTE_TO_SECOND", Napi::Number::New(env, SQL_INTERVAL_MINUTE_TO_SECOND), napi_enumerable));
126+
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_GUID", Napi::Number::New(env, SQL_GUID), napi_enumerable));
127+
// End data types
128+
89129

90130
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_NO_NULLS", Napi::Number::New(env, SQL_NO_NULLS), napi_enumerable));
91131
ODBC_CONSTANTS.push_back(Napi::PropertyDescriptor::Value("SQL_NULLABLE", Napi::Number::New(env, SQL_NULLABLE), napi_enumerable));

src/odbc_connection.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
// object keys for the result object
2727
const char* NAME = "name";
2828
const char* DATA_TYPE = "dataType";
29+
const char* DATA_TYPE_NAME = "dataTypeName";
2930
const char* COLUMN_SIZE = "columnSize";
3031
const char* DECIMAL_DIGITS = "decimalDigits";
3132
const char* NULLABLE = "nullable";
@@ -4006,6 +4007,61 @@ fetch_all_and_store
40064007
return return_code;
40074008
}
40084009

4010+
// This macro and function are used to translate the various ODBC data type
4011+
// macros, returning a string that matches the name of the macro in the ODBC
4012+
// header files. This is then used when returning column data to the user. If
4013+
// the user desires the native (non-ODBC) data type, they should call the
4014+
// columns() function available on the Connection object.
4015+
#define CASE_RETURN_DATA_TYPE_NAME(n) case n: return #n
4016+
4017+
const char*
4018+
get_odbc_type_name
4019+
(
4020+
SQLSMALLINT dataType
4021+
)
4022+
{
4023+
switch(dataType) {
4024+
CASE_RETURN_DATA_TYPE_NAME(SQL_CHAR);
4025+
CASE_RETURN_DATA_TYPE_NAME(SQL_VARCHAR);
4026+
CASE_RETURN_DATA_TYPE_NAME(SQL_LONGVARCHAR);
4027+
CASE_RETURN_DATA_TYPE_NAME(SQL_WCHAR);
4028+
CASE_RETURN_DATA_TYPE_NAME(SQL_WVARCHAR);
4029+
CASE_RETURN_DATA_TYPE_NAME(SQL_WLONGVARCHAR);
4030+
CASE_RETURN_DATA_TYPE_NAME(SQL_DECIMAL);
4031+
CASE_RETURN_DATA_TYPE_NAME(SQL_NUMERIC);
4032+
CASE_RETURN_DATA_TYPE_NAME(SQL_SMALLINT);
4033+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTEGER);
4034+
CASE_RETURN_DATA_TYPE_NAME(SQL_REAL);
4035+
CASE_RETURN_DATA_TYPE_NAME(SQL_FLOAT);
4036+
CASE_RETURN_DATA_TYPE_NAME(SQL_DOUBLE);
4037+
CASE_RETURN_DATA_TYPE_NAME(SQL_BIT);
4038+
CASE_RETURN_DATA_TYPE_NAME(SQL_TINYINT);
4039+
CASE_RETURN_DATA_TYPE_NAME(SQL_BIGINT);
4040+
CASE_RETURN_DATA_TYPE_NAME(SQL_BINARY);
4041+
CASE_RETURN_DATA_TYPE_NAME(SQL_VARBINARY);
4042+
CASE_RETURN_DATA_TYPE_NAME(SQL_LONGVARBINARY);
4043+
CASE_RETURN_DATA_TYPE_NAME(SQL_TYPE_DATE);
4044+
CASE_RETURN_DATA_TYPE_NAME(SQL_TYPE_TIME);
4045+
CASE_RETURN_DATA_TYPE_NAME(SQL_TYPE_TIMESTAMP);
4046+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_MONTH);
4047+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_YEAR);
4048+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_YEAR_TO_MONTH);
4049+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_DAY);
4050+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_HOUR);
4051+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_MINUTE);
4052+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_SECOND);
4053+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_DAY_TO_HOUR);
4054+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_DAY_TO_MINUTE);
4055+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_DAY_TO_SECOND);
4056+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_HOUR_TO_MINUTE);
4057+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_HOUR_TO_SECOND);
4058+
CASE_RETURN_DATA_TYPE_NAME(SQL_INTERVAL_MINUTE_TO_SECOND);
4059+
CASE_RETURN_DATA_TYPE_NAME(SQL_GUID);
4060+
4061+
default: return "UNKNOWN";
4062+
}
4063+
}
4064+
40094065
// All of data has been loaded into data->storedRows. Have to take the data
40104066
// stored in there and convert it it into JavaScript to be given to the
40114067
// Node.js runtime.
@@ -4075,6 +4131,7 @@ Napi::Array process_data_for_napi(Napi::Env env, StatementData *data, Napi::Arra
40754131
column.Set(Napi::String::New(env, NAME), Napi::String::New(env, (const char*)columns[h]->ColumnName));
40764132
#endif
40774133
column.Set(Napi::String::New(env, DATA_TYPE), Napi::Number::New(env, columns[h]->DataType));
4134+
column.Set(Napi::String::New(env, DATA_TYPE_NAME), Napi::String::New(env, get_odbc_type_name(columns[h]->DataType)));
40784135
column.Set(Napi::String::New(env, COLUMN_SIZE), Napi::Number::New(env, columns[h]->ColumnSize));
40794136
column.Set(Napi::String::New(env, DECIMAL_DIGITS), Napi::Number::New(env, columns[h]->DecimalDigits));
40804137
column.Set(Napi::String::New(env, NULLABLE), Napi::Boolean::New(env, columns[h]->Nullable));

0 commit comments

Comments
 (0)