sqlgettypeinfo.c

来自「这个是内存数据库的客户端」· C语言 代码 · 共 1,091 行 · 第 1/3 页

C
1,091
字号
		SQL_INTERVAL,	       /* sql_data_type */		SQL_CODE_DAY_TO_MINUTE,/* sql_datetime_sub */		-1,		       /* num_prec_radix */		5,		       /* interval_precision */		NULL		       /* tuple */	},	{		"interval day to second",/* type_name */		SQL_INTERVAL_DAY_TO_SECOND,/* data_type */		14,		       /* column_size */		"'",		       /* literal_prefix */		"'",		       /* literal_suffix */		"precision",	       /* create_params */		SQL_NULLABLE,	       /* nullable */		SQL_FALSE,	       /* case_sensitive */		SQL_PRED_BASIC,	       /* searchable */		-1,		       /* unsigned_attribute */		SQL_FALSE,	       /* fixed_prec_scale */		-1,		       /* auto_unique_value */		NULL,		       /* local_type_name */		0,		       /* minimum_scale */		0,		       /* maximum_scale */		SQL_INTERVAL,	       /* sql_data_type */		SQL_CODE_DAY_TO_SECOND,/* sql_datetime_sub */		-1,		       /* num_prec_radix */		5,		       /* interval_precision */		NULL		       /* tuple */	},	{		"interval hour to minute",/* type_name */		SQL_INTERVAL_HOUR_TO_MINUTE,/* data_type */		9,		       /* column_size */		"'",		       /* literal_prefix */		"'",		       /* literal_suffix */		"precision",	       /* create_params */		SQL_NULLABLE,	       /* nullable */		SQL_FALSE,	       /* case_sensitive */		SQL_PRED_BASIC,	       /* searchable */		-1,		       /* unsigned_attribute */		SQL_FALSE,	       /* fixed_prec_scale */		-1,		       /* auto_unique_value */		NULL,		       /* local_type_name */		0,		       /* minimum_scale */		0,		       /* maximum_scale */		SQL_INTERVAL,	       /* sql_data_type */		SQL_CODE_HOUR_TO_MINUTE,/* sql_datetime_sub */		-1,		       /* num_prec_radix */		6,		       /* interval_precision */		NULL		       /* tuple */	},	{		"interval hour to second",/* type_name */		SQL_INTERVAL_HOUR_TO_SECOND,/* data_type */		12,		       /* column_size */		"'",		       /* literal_prefix */		"'",		       /* literal_suffix */		"precision",	       /* create_params */		SQL_NULLABLE,	       /* nullable */		SQL_FALSE,	       /* case_sensitive */		SQL_PRED_BASIC,	       /* searchable */		-1,		       /* unsigned_attribute */		SQL_FALSE,	       /* fixed_prec_scale */		-1,		       /* auto_unique_value */		NULL,		       /* local_type_name */		0,		       /* minimum_scale */		0,		       /* maximum_scale */		SQL_INTERVAL,	       /* sql_data_type */		SQL_CODE_HOUR_TO_SECOND,/* sql_datetime_sub */		-1,		       /* num_prec_radix */		6,		       /* interval_precision */		NULL		       /* tuple */	},	{		"interval minute to second",/* type_name */		SQL_INTERVAL_MINUTE_TO_SECOND,/* data_type */		13,		       /* column_size */		"'",		       /* literal_prefix */		"'",		       /* literal_suffix */		"precision",	       /* create_params */		SQL_NULLABLE,	       /* nullable */		SQL_FALSE,	       /* case_sensitive */		SQL_PRED_BASIC,	       /* searchable */		-1,		       /* unsigned_attribute */		SQL_FALSE,	       /* fixed_prec_scale */		-1,		       /* auto_unique_value */		NULL,		       /* local_type_name */		0,		       /* minimum_scale */		0,		       /* maximum_scale */		SQL_INTERVAL,	       /* sql_data_type */		SQL_CODE_MINUTE_TO_SECOND,/* sql_datetime_sub */		-1,		       /* num_prec_radix */		10,		       /* interval_precision */		NULL		       /* tuple */	}};/* find some info about a type given the concise type */const char *ODBCGetTypeInfo(int concise_type, int *data_type, int *sql_data_type, int *sql_datetime_sub){	struct types *t;	for (t = types; t < &types[sizeof(types) / sizeof(types[0])]; t++) {		if (t->data_type == concise_type) {			if (data_type)				*data_type = t->data_type;			if (sql_data_type)				*sql_data_type = t->sql_data_type;			if (sql_datetime_sub)				*sql_datetime_sub = t->sql_datetime_sub;			return t->type_name;		}	}	return NULL;}static SQLRETURNSQLGetTypeInfo_(ODBCStmt *stmt, SQLSMALLINT nSqlDataType){	const char **tuples[sizeof(types) / sizeof(types[0])];	struct types *t;	int i;	switch (nSqlDataType) {	case SQL_ALL_TYPES:	case SQL_CHAR:	case SQL_NUMERIC:	case SQL_DECIMAL:	case SQL_INTEGER:	case SQL_SMALLINT:	case SQL_FLOAT:	case SQL_REAL:	case SQL_DOUBLE:	case SQL_DATE:	case SQL_TIME:	case SQL_TIMESTAMP:	case SQL_VARCHAR:	case SQL_TYPE_DATE:	case SQL_TYPE_TIME:	case SQL_TYPE_TIMESTAMP:	case SQL_LONGVARCHAR:	case SQL_BINARY:	case SQL_VARBINARY:	case SQL_LONGVARBINARY:	case SQL_BIGINT:	case SQL_TINYINT:	case SQL_BIT:	case SQL_WCHAR:	case SQL_WVARCHAR:	case SQL_WLONGVARCHAR:	case SQL_GUID:	case SQL_INTERVAL_YEAR:	case SQL_INTERVAL_MONTH:	case SQL_INTERVAL_DAY:	case SQL_INTERVAL_HOUR:	case SQL_INTERVAL_MINUTE:	case SQL_INTERVAL_SECOND:	case SQL_INTERVAL_YEAR_TO_MONTH:	case SQL_INTERVAL_DAY_TO_HOUR:	case SQL_INTERVAL_DAY_TO_MINUTE:	case SQL_INTERVAL_DAY_TO_SECOND:	case SQL_INTERVAL_HOUR_TO_MINUTE:	case SQL_INTERVAL_HOUR_TO_SECOND:	case SQL_INTERVAL_MINUTE_TO_SECOND:		break;		/* some pre ODBC 3.0 data types which can be mapped to ODBC		   3.0 data types */	case -80:		/* SQL_INTERVAL_YEAR */		nSqlDataType = SQL_INTERVAL_YEAR;		break;	case -81:		/* SQL_INTERVAL_YEAR_TO_MONTH */		nSqlDataType = SQL_INTERVAL_YEAR_TO_MONTH;		break;	case -82:		/* SQL_INTERVAL_MONTH */		nSqlDataType = SQL_INTERVAL_MONTH;		break;	case -83:		/* SQL_INTERVAL_DAY */		nSqlDataType = SQL_INTERVAL_DAY;		break;	case -84:		/* SQL_INTERVAL_HOUR */		nSqlDataType = SQL_INTERVAL_HOUR;		break;	case -85:		/* SQL_INTERVAL_MINUTE */		nSqlDataType = SQL_INTERVAL_MINUTE;		break;	case -86:		/* SQL_INTERVAL_SECOND */		nSqlDataType = SQL_INTERVAL_SECOND;		break;	case -87:		/* SQL_INTERVAL_DAY_TO_HOUR */		nSqlDataType = SQL_INTERVAL_DAY_TO_HOUR;		break;	case -88:		/* SQL_INTERVAL_DAY_TO_MINUTE */		nSqlDataType = SQL_INTERVAL_DAY_TO_MINUTE;		break;	case -89:		/* SQL_INTERVAL_DAY_TO_SECOND */		nSqlDataType = SQL_INTERVAL_DAY_TO_SECOND;		break;	case -90:		/* SQL_INTERVAL_HOUR_TO_MINUTE */		nSqlDataType = SQL_INTERVAL_HOUR_TO_MINUTE;		break;	case -91:		/* SQL_INTERVAL_HOUR_TO_SECOND */		nSqlDataType = SQL_INTERVAL_HOUR_TO_SECOND;		break;	case -92:		/* SQL_INTERVAL_MINUTE_TO_SECOND */		nSqlDataType = SQL_INTERVAL_MINUTE_TO_SECOND;		break;	case -95:		/* SQL_UNICODE_CHAR and SQL_UNICODE */		nSqlDataType = SQL_WCHAR;		break;	case -96:		/* SQL_UNICODE_VARCHAR */		nSqlDataType = SQL_WVARCHAR;		break;	case -97:		/* SQL_UNICODE_LONGVARCHAR */		nSqlDataType = SQL_WLONGVARCHAR;		break;	default:		/* Invalid SQL data type */		addStmtError(stmt, "HY004", NULL, 0);		return SQL_ERROR;	}	for (t = types, i = 0; t < &types[sizeof(types) / sizeof(types[0])]; t++) {		if (nSqlDataType == SQL_ALL_TYPES || nSqlDataType == t->data_type) {			if (t->tuple == NULL) {				char buf[32];				t->tuple = malloc(NCOLUMNS * sizeof(*t->tuple));				t->tuple[0] = t->type_name;				snprintf(buf, sizeof(buf), "%d", t->data_type);				t->tuple[1] = strdup(buf);				if (t->column_size == -1)					t->tuple[2] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->column_size);					t->tuple[2] = strdup(buf);				}				t->tuple[3] = t->literal_prefix;				t->tuple[4] = t->literal_suffix;				t->tuple[5] = t->create_params;				snprintf(buf, sizeof(buf), "%d", t->nullable);				t->tuple[6] = strdup(buf);				snprintf(buf, sizeof(buf), "%d", t->case_sensitive);				t->tuple[7] = strdup(buf);				snprintf(buf, sizeof(buf), "%d", t->searchable);				t->tuple[8] = strdup(buf);				if (t->unsigned_attribute == -1)					t->tuple[9] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->unsigned_attribute);					t->tuple[9] = strdup(buf);				}				snprintf(buf, sizeof(buf), "%d", t->fixed_prec_scale);				t->tuple[10] = strdup(buf);				if (t->auto_unique_value == -1)					t->tuple[11] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->auto_unique_value);					t->tuple[11] = strdup(buf);				}				t->tuple[12] = t->local_type_name;				if (t->minimum_scale == -1)					t->tuple[13] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->minimum_scale);					t->tuple[13] = strdup(buf);				}				if (t->maximum_scale == -1)					t->tuple[14] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->maximum_scale);					t->tuple[14] = strdup(buf);				}				snprintf(buf, sizeof(buf), "%d", t->sql_data_type);				t->tuple[15] = strdup(buf);				if (t->sql_datetime_sub == -1)					t->tuple[16] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->sql_datetime_sub);					t->tuple[16] = strdup(buf);				}				if (t->num_prec_radix == -1)					t->tuple[17] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->num_prec_radix);					t->tuple[17] = strdup(buf);				}				if (t->interval_precision == -1)					t->tuple[18] = NULL;				else {					snprintf(buf, sizeof(buf), "%d", t->interval_precision);					t->tuple[18] = strdup(buf);				}			}			tuples[i++] = t->tuple;		}	}	mapi_virtual_result(stmt->hdl, NCOLUMNS, columnnames, columntypes, columnlengths, i, tuples);	return ODBCInitResult(stmt);}SQLRETURN SQL_APISQLGetTypeInfo(SQLHSTMT hStmt, SQLSMALLINT nSqlDataType){	ODBCStmt *stmt = (ODBCStmt *) hStmt;#ifdef ODBCDEBUG	ODBCLOG("SQLGetTypeInfo " PTRFMT " %d\n", PTRFMTCAST hStmt, nSqlDataType);#endif	if (!isValidStmt(stmt))		 return SQL_INVALID_HANDLE;	clearStmtErrors(stmt);	return SQLGetTypeInfo_(stmt, nSqlDataType);}#ifdef WITH_WCHARSQLRETURN SQL_APISQLGetTypeInfoA(SQLHSTMT hStmt, SQLSMALLINT nSqlDataType){	return SQLGetTypeInfo(hStmt, nSqlDataType);}SQLRETURN SQL_APISQLGetTypeInfoW(SQLHSTMT hStmt, SQLSMALLINT nSqlDataType){	ODBCStmt *stmt = (ODBCStmt *) hStmt;#ifdef ODBCDEBUG	ODBCLOG("SQLGetTypeInfoW " PTRFMT " %d\n", PTRFMTCAST hStmt, nSqlDataType);#endif	if (!isValidStmt(stmt))		 return SQL_INVALID_HANDLE;	clearStmtErrors(stmt);	return SQLGetTypeInfo_(stmt, nSqlDataType);}#endif /* WITH_WCHAR */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?