⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 info.c

📁 postgresql-odbc,跨平台应用
💻 C
📖 第 1 页 / 共 5 页
字号:
			if (list_schemas || (conn->schema_support && !list_some))				set_tuplefield_string(&tuple[TABLES_SCHEMA_NAME], GET_SCHEMA_NAME(table_owner));			else				set_tuplefield_null(&tuple[TABLES_SCHEMA_NAME]);			if (list_some)				set_tuplefield_null(&tuple[TABLES_TABLE_NAME]);			else				set_nullfield_string(&tuple[TABLES_TABLE_NAME], table_name);			if (list_table_types || !list_some)				set_tuplefield_string(&tuple[TABLES_TABLE_TYPE], systable ? "SYSTEM TABLE" : (view ? "VIEW" : "TABLE"));			else				set_tuplefield_null(&tuple[TABLES_TABLE_TYPE]);			set_tuplefield_string(&tuple[TABLES_REMARKS], NULL_STRING);			/*** set_tuplefield_string(&tuple[TABLES_REMARKS], "TABLE"); ***/		}		result = PGAPI_Fetch(htbl_stmt);	}	if (result != SQL_NO_DATA_FOUND)	{		SC_full_error_copy(stmt, htbl_stmt, FALSE);		goto cleanup;	}	ret = SQL_SUCCESS;cleanup:#undef	return	/*	 * also, things need to think that this statement is finished so the	 * results can be retrieved.	 */	stmt->status = STMT_FINISHED;	if (escCatName)		free(escCatName);	if (escSchemaName)		free(escSchemaName);	if (escTableName)		free(escTableName);	if (tableType)		free(tableType);	/* set up the current tuple pointer for SQLFetch */	stmt->currTuple = -1;	SC_set_rowset_start(stmt, -1, FALSE);	SC_set_current_col(stmt, -1);	if (htbl_stmt)		PGAPI_FreeStmt(htbl_stmt, SQL_DROP);	if (stmt->internal)		ret = DiscardStatementSvp(stmt, ret, FALSE);	mylog("%s: EXIT, stmt=%p, ret=%d\n", func, stmt, ret);	return ret;}RETCODE		SQL_APIPGAPI_Columns(			  HSTMT hstmt,			  const SQLCHAR FAR * szTableQualifier, /* OA X*/			  SQLSMALLINT cbTableQualifier,			  const SQLCHAR FAR * szTableOwner, /* PV E*/			  SQLSMALLINT cbTableOwner,			  const SQLCHAR FAR * szTableName, /* PV E*/			  SQLSMALLINT cbTableName,			  const SQLCHAR FAR * szColumnName, /* PV E*/			  SQLSMALLINT cbColumnName,			  UWORD	flag,			  OID	reloid,			  Int2	attnum){	CSTR func = "PGAPI_Columns";	StatementClass *stmt = (StatementClass *) hstmt;	QResultClass	*res;	TupleField	*tuple;	HSTMT		hcol_stmt = NULL;	StatementClass *col_stmt;	char		columns_query[INFO_INQUIRY_LEN];	RETCODE		result;	char		table_owner[MAX_INFO_STRING],				table_name[MAX_INFO_STRING],				field_name[MAX_INFO_STRING],				field_type_name[MAX_INFO_STRING];	Int2		field_number, sqltype, concise_type,				result_cols,				decimal_digits;	Int4		field_type,				the_type,				field_length,				mod_length,				column_size,				ordinal;	char		useStaticPrecision, useStaticScale;	char		not_null[MAX_INFO_STRING],				relhasrules[MAX_INFO_STRING], relkind[8];	char	*escSchemaName = NULL, *escTableName = NULL, *escColumnName = NULL;	BOOL	search_pattern = TRUE, search_by_ids, relisaview;	ConnInfo   *ci;	ConnectionClass *conn;	SQLSMALLINT	internal_asis_type = SQL_C_CHAR, cbSchemaName;	SQLINTEGER	greloid;	const char	*like_or_eq = likeop;	const char	*szSchemaName;	mylog("%s: entering...stmt=%p scnm=%p len=%d\n", func, stmt, szTableOwner, cbTableOwner);	if (result = SC_initialize_and_recycle(stmt), SQL_SUCCESS != result)		return result;	conn = SC_get_conn(stmt);	ci = &(conn->connInfo);#ifdef	UNICODE_SUPPORT	if (CC_is_in_unicode_driver(conn))		internal_asis_type = INTERNAL_ASIS_TYPE;#endif /* UNICODE_SUPPORT */#define	return	DONT_CALL_RETURN_FROM_HERE???	search_by_ids = ((flag & PODBC_SEARCH_BY_IDS) != 0);	if (search_by_ids)	{		szSchemaName = NULL;		cbSchemaName = SQL_NULL_DATA;	}	else	{		szSchemaName = szTableOwner;		cbSchemaName = cbTableOwner;		reloid = 0;		attnum = 0;		/*	 	 *	TableName or ColumnName is ordinarily an pattern value,	 	 */		search_pattern = ((flag & PODBC_NOT_SEARCH_PATTERN) == 0); 		if (search_pattern) 		{			like_or_eq = likeop;			escTableName = adjustLikePattern(szTableName, cbTableName, SEARCH_PATTERN_ESCAPE, NULL, conn);			escColumnName = adjustLikePattern(szColumnName, cbColumnName, SEARCH_PATTERN_ESCAPE, NULL, conn);		}		else		{			like_or_eq = eqop;			escTableName = simpleCatalogEscape(szTableName, cbTableName, NULL, conn);			escColumnName = simpleCatalogEscape(szColumnName, cbColumnName, NULL, conn);		}	}retry_public_schema:	if (!search_by_ids)	{		if (escSchemaName)			free(escSchemaName);		if (search_pattern) 			escSchemaName = adjustLikePattern(szSchemaName, cbSchemaName, SEARCH_PATTERN_ESCAPE, NULL, conn);		else			escSchemaName = simpleCatalogEscape(szSchemaName, cbSchemaName, NULL, conn);	}	/*	 * Create the query to find out the columns (Note: pre 6.3 did not	 * have the atttypmod field)	 */	if (conn->schema_support)	{		strncpy(columns_query,			"select n.nspname, c.relname, a.attname, a.atttypid"	   		", t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull"			", c.relhasrules, c.relkind, c.oid, d.adsrc from (((pg_catalog.pg_class c"			" inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace",			sizeof(columns_query));		if (search_by_ids)			snprintf_add(columns_query, sizeof(columns_query), " and c.oid = %u", reloid);		else		{			if (escTableName)				snprintf_add(columns_query, sizeof(columns_query), " and c.relname %s '%s'", like_or_eq, escTableName);			schema_strcat1(columns_query, " and n.nspname %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS, szTableName, cbTableName, conn);		}		strcat(columns_query, ") inner join pg_catalog.pg_attribute a"			" on (not a.attisdropped)");		if (0 == attnum && (NULL == escColumnName || like_or_eq != eqop))			strcat(columns_query, " and a.attnum > 0");		if (search_by_ids)		{			if (attnum != 0)				snprintf_add(columns_query, sizeof(columns_query), " and a.attnum = %d", attnum);		}		else if (escColumnName)			snprintf_add(columns_query, sizeof(columns_query), " and a.attname %s '%s'", like_or_eq, escColumnName);		strcat(columns_query,			" and a.attrelid = c.oid) inner join pg_catalog.pg_type t"			" on t.oid = a.atttypid) left outer join pg_attrdef d"			" on a.atthasdef and d.adrelid = a.attrelid and d.adnum = a.attnum");		strcat(columns_query, " order by n.nspname, c.relname, attnum");	}	else	{		snprintf(columns_query, sizeof(columns_query),			"select u.usename, c.relname, a.attname, a.atttypid"	   		", t.typname, a.attnum, a.attlen, %s, a.attnotnull"			", c.relhasrules, c.relkind, c.oid, NULL from pg_user u"			", pg_class c, pg_attribute a, pg_type t where"			"  u.usesysid = c.relowner and c.oid= a.attrelid"			"  and a.atttypid = t.oid and (a.attnum > 0)",			PG_VERSION_LE(conn, 6.2) ? "a.attlen" : "a.atttypmod");		if (escTableName)			snprintf_add(columns_query, sizeof(columns_query), " and c.relname %s '%s'", like_or_eq, escTableName);		my_strcat1(columns_query, " and u.usename %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS);		if (escColumnName)			snprintf_add(columns_query, sizeof(columns_query), " and a.attname %s '%s'", like_or_eq, escColumnName);		strcat(columns_query, " order by c.relname, attnum");	}	result = PGAPI_AllocStmt(conn, &hcol_stmt);	if (!SQL_SUCCEEDED(result))	{		SC_set_error(stmt, STMT_NO_MEMORY_ERROR, "Couldn't allocate statement for PGAPI_Columns result.", func);		result = SQL_ERROR;		goto cleanup;	}	col_stmt = (StatementClass *) hcol_stmt;	mylog("%s: hcol_stmt = %p, col_stmt = %p\n", func, hcol_stmt, col_stmt);	result = PGAPI_ExecDirect(hcol_stmt, columns_query, SQL_NTS, 0);	if (!SQL_SUCCEEDED(result))	{		SC_full_error_copy(stmt, col_stmt, FALSE);		goto cleanup;	}	/* If not found */	if (conn->schema_support &&	    (flag & PODBC_SEARCH_PUBLIC_SCHEMA) != 0 &&	    (res = SC_get_Result(col_stmt)) &&	    0 == QR_get_num_total_tuples(res))	{		const char *user = CC_get_username(conn);		/*		 * If specified schema name == user_name and		 * the current schema is 'public',		 * retry the 'public' schema.		 */		if (!search_by_ids &&		    szSchemaName &&		    (cbSchemaName == SQL_NTS ||		     cbSchemaName == (SQLSMALLINT) strlen(user)) &&		    strnicmp(szSchemaName, user, strlen(user)) == 0 &&		    stricmp(CC_get_current_schema(conn), pubstr) == 0)		{			PGAPI_FreeStmt(hcol_stmt, SQL_DROP);			hcol_stmt = NULL;			szSchemaName = pubstr;			cbSchemaName = SQL_NTS;			goto retry_public_schema;		}	}	result = PGAPI_BindCol(hcol_stmt, 1, internal_asis_type,						   table_owner, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 2, internal_asis_type,						   table_name, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 3, internal_asis_type,						   field_name, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 4, SQL_C_LONG,						   &field_type, 4, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 5, internal_asis_type,						   field_type_name, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 6, SQL_C_SHORT,						   &field_number, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 7, SQL_C_LONG,						   &field_length, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 8, SQL_C_LONG,						   &mod_length, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 9, internal_asis_type,						   not_null, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 10, internal_asis_type,						   relhasrules, MAX_INFO_STRING, NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 11, internal_asis_type,						   relkind, sizeof(relkind), NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	result = PGAPI_BindCol(hcol_stmt, 12, SQL_C_LONG,					&greloid, sizeof(greloid), NULL);	if (!SQL_SUCCEEDED(result))	{		SC_error_copy(stmt, col_stmt, TRUE);		goto cleanup;	}	if (res = QR_Constructor(), !res)	{		SC_set_error(stmt, STMT_NO_MEMORY_ERROR, "Couldn't allocate memory for PGAPI_Columns result.", func);		goto cleanup;	}	SC_set_Result(stmt, res);	/* the binding structure for a statement is not set up until */	/*	 * a statement is actually executed, so we'll have to do this	 * ourselves.	 */	result_cols = NUM_OF_COLUMNS_FIELDS;	extend_column_bindings(SC_get_ARDF(stmt), result_cols);	stmt->catalog_result = TRUE;	/* set the field names */	QR_set_num_fields(res, result_cols);	QR_set_field_info_v(res, COLUMNS_CATALOG_NAME, "TABLE_QUALIFIER", PG_TYPE_VARCHAR, MAX_INFO_STRING);	QR_set_field_info_v(res, COLUMNS_SCHEMA_NAME, "TABLE_OWNER", PG_TYPE_VARCHAR, MAX_INFO_STRING);	QR_set_field_info_v(res, COLUMNS_TABLE_NAME, "TABLE_NAME", PG_TYPE_VARCHAR, MAX_INFO_STRING);	QR_set_field_info_v(res, COLUMNS_COLUMN_NAME, "COLUMN_NAME", PG_TYPE_VARCHAR, MAX_INFO_STRING);	QR_set_field_info_v(res, COLUMNS_DATA_TYPE, "DATA_TYPE", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_TYPE_NAME, "TYPE_NAME", PG_TYPE_VARCHAR, MAX_INFO_STRING);	QR_set_field_info_v(res, COLUMNS_PRECISION, "PRECISION", PG_TYPE_INT4, 4); /* COLUMN_SIZE */	QR_set_field_info_v(res, COLUMNS_LENGTH, "LENGTH", PG_TYPE_INT4, 4); /* BUFFER_LENGTH */	QR_set_field_info_v(res, COLUMNS_SCALE, "SCALE", PG_TYPE_INT2, 2); /* DECIMAL_DIGITS ***/	QR_set_field_info_v(res, COLUMNS_RADIX, "RADIX", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_NULLABLE, "NULLABLE", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_REMARKS, "REMARKS", PG_TYPE_VARCHAR, INFO_VARCHAR_SIZE);#if (ODBCVER >= 0x0300)	QR_set_field_info_v(res, COLUMNS_COLUMN_DEF, "COLUMN_DEF", PG_TYPE_VARCHAR, INFO_VARCHAR_SIZE);	QR_set_field_info_v(res, COLUMNS_SQL_DATA_TYPE, "SQL_DATA_TYPE", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_SQL_DATETIME_SUB, "SQL_DATETIME_SUB", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_CHAR_OCTET_LENGTH, "CHAR_OCTET_LENGTH", PG_TYPE_INT4, 4);	QR_set_field_info_v(res, COLUMNS_ORDINAL_POSITION, "ORDINAL_POSITION", PG_TYPE_INT4, 4);	QR_set_field_info_v(res, COLUMNS_IS_NULLABLE, "IS_NULLABLE", PG_TYPE_VARCHAR, INFO_VARCHAR_SIZE);#endif /* ODBCVER */	/* User defined fields */	QR_set_field_info_v(res, COLUMNS_DISPLAY_SIZE, "DISPLAY_SIZE", PG_TYPE_INT4, 4);	QR_set_field_info_v(res, COLUMNS_FIELD_TYPE, "FIELD_TYPE", PG_TYPE_INT4, 4);	QR_set_field_info_v(res, COLUMNS_AUTO_INCREMENT, "AUTO_INCREMENT", PG_TYPE_INT4, 4);	QR_set_field_info_v(res, COLUMNS_PHYSICAL_NUMBER, "PHYSICAL NUMBER", PG_TYPE_INT2, 2);	QR_set_field_info_v(res, COLUMNS_TABLE_OID, "TABLE OID", PG_TYPE_INT4, 4);	ordinal = 1;	result = PGAPI_Fetch(hcol_stmt);	/*	 * Only show oid if option AND there are other columns AND it's not	 * being called by SQLStatistics . Always show OID if it's a system	 * table	 */	if (PG_VERSION_GE(conn, 7.1))		relisaview = (relkind[0] == 'v');	else		relisaview = (relhasrules[0] == '1');	if (result != SQL_ERROR && !stmt->internal)	{		if (!relisaview &&			(atoi(ci->show_oid_column) ||			 strncmp(table_name, POSTGRES_SYS_PREFIX, strlen(POSTGRES_SYS_PREFIX)) == 0))		{			/* For OID fields */			the_type = PG_TYPE_OID;			tuple = QR_AddNew(res);			set_tuplefield_string(&tuple[COLUMNS_CATALOG_NAME], CurrCat(conn));			/* see note in SQLTables() */			if (conn->schema_support)				set_tuplefield_string(&tuple[COLUMNS_SCHEMA_NAME], GET_SCHEMA_NAME(table_owner));			else				set_tuplefield_string(&tuple[COLUMNS_SCHEMA_NAME], NULL_STRING);			set_tuplefield_string(&tuple[COLUMNS_TABLE_NAME], table_name);			set_tuplefield_string(&tuple[COLUMNS_COLUMN_NAME], OID_NAME);			sqltype = pgtype_to_concise_type(stmt, the_type, PG_STATIC);			set_tuplefield_int2(&tuple[COLUMNS_DATA_TYPE], sqltype);			set_tuplefield_string(&tuple[COLUMNS_TYPE_NAME], "OID");			set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC));			set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC));			set_nullfield_int2(&tuple[COLUMNS_SCALE], pgtype_decimal_digits(stmt, the_type, PG_STATIC));			set_nullfield_int2(&tuple[COLUMNS_RADIX], pgtype_radix(stmt, the_type));			set_tuplefield_int2(&tuple[COLUMNS_NULLABLE], SQL_NO_NULLS);			set_tuplefield_string(&tuple[COLUMNS_REMARKS], NULL_STRING);#if (ODBCVER >= 0x0300)			set_tuplefield_null(&tuple[COLUMNS_COLUMN_DEF]);			set_tuplefield_int2(&tuple[COLUMNS_SQL_DATA_TYPE], sqltype);			set_tuplefield_null(&tuple[COLUMNS_SQL_DATETIME_SUB]);			set_tuplefield_null(&tuple[COLUMNS_CHAR_OCTET_LENGTH]);			set_tuplefield_int4(&tuple[COLUMNS_ORDINAL_POSITION], ordinal);			set_tuplefield_string(&tuple[COLUMNS_IS_NULLABLE], "No");#endif /* ODBCVER */			set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC));			set_tuplefield_int4(&tuple[COLUMNS_FIELD_TYPE], the_type);			set_tuplefield_int4(&tuple[COLUMNS_AUTO_INCREMENT], TRUE);			set_tuplefield_int2(&tuple[COLUMNS_PHYSICAL_NUMBER], OID_ATTNUM);			set_tuplefield_int4(&tuple[COLUMNS_TABLE_OID], greloid);			ordinal++;		}	}	while (SQL_SUCCEEDED(result))	{		int	auto_unique;		SQLLEN	len_needed;		char	*attdef;		attdef = NULL;		PGAPI_SetPos(hcol_stmt, 1, SQL_POSITION, 0);		PGAPI_GetData(hcol_stmt, 13, internal_asis_type, NULL, 0, &len_needed);		if (len_needed > 0)		{mylog("len_needed=%d\n", len_needed);			attdef = malloc(len_needed + 1);			PGAPI_GetData(hcol_stmt, 13, internal_asis_type, attdef, len_needed + 1, &len_needed);mylog(" a

⌨️ 快捷键说明

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