📄 catalog.c
字号:
// Have DBMS set up result set of ColumnPrivileges.
RETCODE SQL_API SQLColumnPrivileges(HSTMT hstmt,
UCHAR FAR *szTableQualifier,
SWORD cbTableQualifier,
UCHAR FAR *szTableOwner,SWORD cbTableOwner,
UCHAR FAR *szTableName,SWORD cbTableName,
UCHAR FAR *szColumnName,SWORD cbColumnName)
{
DBUG_ENTER("SQLColumnPrivileges");
DBUG_RETURN(set_error(((STMT FAR*) hstmt)->dbc,"IM001",
"MyODBC doesn't support this yet",4000));
}
// Have DBMS set up result set of SpecialColumns.
MYSQL_FIELD SQLSPECIALCOLUMNS_fields[] = {
{"Scope","MySQL SpecialColumns",NULL,FIELD_TYPE_SHORT,5,5,
NOT_NULL_FLAG},
{"Column_name","MySQL SpecialColumns",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,
NAME_LEN,NOT_NULL_FLAG},
{"Data_type","MySQL SpecialColumns",NULL,FIELD_TYPE_SHORT,5,5,
NOT_NULL_FLAG},
{"Type_name","MySQL SpecialColumns",NULL,FIELD_TYPE_VAR_STRING,20,20,
NOT_NULL_FLAG},
{"Precision","MySQL SpecialColumns",NULL,FIELD_TYPE_LONG,7,7},
{"Length","MySQL SpecialColumns",NULL,FIELD_TYPE_LONG,7,7},
{"Scale","MySQL SpecialColumns",NULL,FIELD_TYPE_SHORT,3,3},
{"Pseudo_column","MySQL SpecialColumns",NULL,FIELD_TYPE_SHORT,3,3}
};
const uint SQLSPECIALCOLUMNS_FIELDS=array_elements(SQLSPECIALCOLUMNS_fields);
RETCODE SQL_API SQLSpecialColumns(HSTMT hstmt,UWORD fColType,
UCHAR FAR *szTableQualifier,
SWORD cbTableQualifier,
UCHAR FAR *szTableOwner,SWORD cbTableOwner,
UCHAR FAR *szTableName,SWORD cbTableName,
UWORD fScope,UWORD fNullable)
{
char buff[80],table_name[NAME_LEN+1];
uint field_count;
ulong transfer_length,precision,display_size;
STMT FAR *stmt=(STMT FAR*) hstmt;
char **row;
MEM_ROOT *alloc;
bool primary_key;
MYSQL_FIELD *field;
DBUG_ENTER("SQLSpecialColumns");
if (check_parameters(hstmt,szTableQualifier,cbTableQualifier,szTableOwner,
cbTableOwner,szTableName,&cbTableName,table_name,1))
DBUG_RETURN(SQL_ERROR);
if (!(stmt->result=mysql_list_fields(&stmt->dbc->mysql,table_name,0)))
{
strmov(stmt->dbc->sqlstate,"S1000");
return(SQL_ERROR);
}
if (fColType == SQL_ROWVER)
{ /* Find possible timestamp */
stmt->result_array=
(char**) my_malloc(sizeof(char*)*SQLSPECIALCOLUMNS_FIELDS*
stmt->result->field_count, MYF(MY_FAE | MY_ZEROFILL));
/* convert mysql fields to data that odbc wants */
alloc=&stmt->result->field_alloc;
field_count=0;
mysql_field_seek(stmt->result,0);
for (row= stmt->result_array ;
(field = mysql_fetch_field(stmt->result)) ;
)
{
int type;
if ((field->type != FIELD_TYPE_TIMESTAMP))
continue;
field_count++;
sprintf(buff,"%d",SQL_SCOPE_SESSION);
row[0]=strdup_root(alloc,buff);
row[1]= field->name;
type=unireg_to_sql_datatype(stmt,field,buff,&transfer_length,&precision,&display_size);
row[3]=strdup_root(alloc,buff);
sprintf(buff,"%d",type);
row[2]=strdup_root(alloc,buff);
sprintf(buff,"%d",precision);
row[4]=strdup_root(alloc,buff);
sprintf(buff,"%d",transfer_length);
row[5]=strdup_root(alloc,buff);
sprintf(buff,"%d",field->decimals);
row[6]=strdup_root(alloc,buff);
sprintf(buff,"%d",SQL_PC_NOT_PSEUDO);
row[7]=strdup_root(alloc,buff);
row+=SQLSPECIALCOLUMNS_FIELDS;
}
stmt->result->row_count=field_count;
mysql_link_fields(stmt,SQLSPECIALCOLUMNS_fields,
SQLSPECIALCOLUMNS_FIELDS);
DBUG_RETURN(SQL_SUCCESS);
}
/*
* The optimal set of columns for identifing a row is either
* the primary key, or if there is no primary key, then
* all the fields.
*/
/* Check if there is a primary (unique) key */
primary_key=0;
while ((field = mysql_fetch_field(stmt->result)))
{
if (field->flags & PRI_KEY_FLAG)
{
primary_key=1;
break;
}
}
stmt->result_array=
(char**) my_malloc(sizeof(char*)*SQLSPECIALCOLUMNS_FIELDS*
stmt->result->field_count, MYF(MY_FAE | MY_ZEROFILL));
/* convert mysql fields to data that odbc wants */
alloc=&stmt->result->field_alloc;
field_count=0;
mysql_field_seek(stmt->result,0);
for (row= stmt->result_array ;
(field = mysql_fetch_field(stmt->result)) ;
)
{
int type;
if (primary_key && !(field->flags & PRI_KEY_FLAG))
continue;
field_count++;
sprintf(buff,"%d",SQL_SCOPE_SESSION);
row[0]=strdup_root(alloc,buff);
row[1]= field->name;
type=unireg_to_sql_datatype(stmt,field,buff,&transfer_length,&precision,&display_size);
row[3]=strdup_root(alloc,buff);
sprintf(buff,"%d",type);
row[2]=strdup_root(alloc,buff);
sprintf(buff,"%d",precision);
row[4]=strdup_root(alloc,buff);
sprintf(buff,"%d",transfer_length);
row[5]=strdup_root(alloc,buff);
sprintf(buff,"%d",field->decimals);
row[6]=strdup_root(alloc,buff);
sprintf(buff,"%d",SQL_PC_NOT_PSEUDO);
row[7]=strdup_root(alloc,buff);
row+=SQLSPECIALCOLUMNS_FIELDS;
}
stmt->result->row_count=field_count;
mysql_link_fields(stmt,SQLSPECIALCOLUMNS_fields,
SQLSPECIALCOLUMNS_FIELDS);
DBUG_RETURN(SQL_SUCCESS);
}
// Have DBMS set up result set of PrimaryKeys.
MYSQL_FIELD SQLPRIM_KEYS_fields[] = {
{"Table_qualifer","MySQL Primary keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0},
{"Table_owner","MySQL Primary keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0},
{"Table_name","MySQL Primary keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,NAME_LEN,
NOT_NULL_FLAG},
{"Column_name","MySQL Primary keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,NAME_LEN,
NOT_NULL_FLAG},
{"Key_seq","MySQL Primary keys",NULL,FIELD_TYPE_SHORT,2,2,NOT_NULL_FLAG},
{"Pk_name","MySQL Primary keys",NULL,FIELD_TYPE_VAR_STRING,128,0},
};
const uint SQLPRIM_KEYS_FIELDS=array_elements(SQLPRIM_KEYS_fields);
RETCODE SQL_API SQLPrimaryKeys(HSTMT hstmt,
UCHAR FAR *szTableQualifier,
SWORD cbTableQualifier,
UCHAR FAR *szTableOwner,SWORD cbTableOwner,
UCHAR FAR *szTableName,SWORD cbTableName)
{
char buff[100],table_name[NAME_LEN+1],**data;
STMT FAR *stmt=(STMT FAR*) hstmt;
uint row_count;
MYSQL_ROW row;
DBUG_ENTER("SQLPrimaryKeys");
if (check_parameters(hstmt,szTableQualifier,cbTableQualifier,szTableOwner,
cbTableOwner,szTableName,&cbTableName,table_name,1))
DBUG_RETURN(SQL_ERROR);
remove_escape(table_name);
strxmov(buff,"show keys from ",table_name,NullS);
if (mysql_query(&stmt->dbc->mysql,buff) ||
!(stmt->result=mysql_store_result(&stmt->dbc->mysql)))
{
strmov(stmt->dbc->sqlstate,"S1000");
DBUG_RETURN(SQL_ERROR);
}
stmt->result_array= (char**) my_malloc(sizeof(char*)*SQLPRIM_KEYS_FIELDS*
stmt->result->row_count,
MYF(MY_FAE | MY_ZEROFILL));
row_count=0;
data=stmt->result_array;
while ((row = mysql_fetch_row(stmt->result)))
{
if (row[1][0] == '0') /* If unique index */
{
if (row_count && !strcmp(row[3],"1"))
break; /* Allready found unique key */
row_count++;
data[0]=data[1]=0;
data[2]=row[0];
data[3]=row[4];
data[4]=row[3];
data[5]="PRIMARY";
data+=SQLPRIM_KEYS_FIELDS;
}
}
stmt->result->row_count=row_count;
mysql_link_fields(stmt,SQLPRIM_KEYS_fields,SQLPRIM_KEYS_FIELDS);
DBUG_RETURN(SQL_SUCCESS);
}
/*
** Have DBMS set up result set of ForeignKeys.
** mysql dosen't have foreing key, return empty set
*/
MYSQL_FIELD SQLFORE_KEYS_fields[] = {
{"Pktable_qualifer","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0},
{"PkTable_owner","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0},
{"PkTable_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,
NAME_LEN,NOT_NULL_FLAG},
{"PkColumn_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,
NAME_LEN,NOT_NULL_FLAG},
{"fktable_qualifier","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0,
NOT_NULL_FLAG},
{"fkTable_owner","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,0},
{"fkTable_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,
NAME_LEN,NOT_NULL_FLAG},
{"fkColumn_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,NAME_LEN,
NAME_LEN,NOT_NULL_FLAG},
{"Key_seq","MySQL Foreign keys",NULL,FIELD_TYPE_SHORT,2,2,NOT_NULL_FLAG},
{"Update_rule","MySQL Foreign keys",NULL,FIELD_TYPE_SHORT,2,2},
{"Delete_rule","MySQL Foreign keys",NULL,FIELD_TYPE_SHORT,2,2},
{"Fk_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,128,0},
{"Pk_name","MySQL Foreign keys",NULL,FIELD_TYPE_VAR_STRING,128,0},
};
const uint SQLFORE_KEYS_FIELDS=array_elements(SQLFORE_KEYS_fields);
RETCODE SQL_API SQLForeignKeys(HSTMT hstmt,
UCHAR FAR *szPkTableQualifier,
SWORD cbPkTableQualifier,
UCHAR FAR *szPkTableOwner,SWORD cbPkTableOwner,
UCHAR FAR *szPkTableName,SWORD cbPkTableName,
UCHAR FAR *szFkTableQualifier,
SWORD cbFkTableQualifier,
UCHAR FAR *szFkTableOwner,SWORD cbFkTableOwner,
UCHAR FAR *szFkTableName,SWORD cbFkTableName)
{
STMT FAR *stmt=(STMT FAR*) hstmt;
DBUG_ENTER("SQLForeignKeys");
SQLFreeStmt(hstmt,MYSQL_RESET);
stmt->result=(MYSQL_RES*) my_malloc(sizeof(MYSQL_RES),MYF(MY_ZEROFILL));
stmt->result->eof=1;
mysql_link_fields(stmt,SQLFORE_KEYS_fields,SQLFORE_KEYS_FIELDS);
DBUG_RETURN(SQL_SUCCESS);
}
// Have DBMS set up result set of Procedures.
RETCODE SQL_API SQLProcedures(HSTMT hstmt,
UCHAR FAR *szProcQualifier,SWORD cbProcQualifier,
UCHAR FAR *szProcOwner,SWORD cbProcOwner,
UCHAR FAR *szProcName,SWORD cbProcName)
{
return set_error(((STMT FAR*)hstmt)->dbc,"08002",
"MyODBC doesn't support this yet",4000);
}
// Have DBMS set up result set of ProcedureColumns.
RETCODE SQL_API SQLProcedureColumns(HSTMT hstmt,
UCHAR FAR *szProcQualifier,
SWORD cbProcQualifier,
UCHAR FAR *szProcOwner,SWORD cbProcOwner,
UCHAR FAR *szProcName,SWORD cbProcName,
UCHAR FAR *szColumnName,SWORD cbColumnName)
{
return set_error(((STMT FAR*)hstmt)->dbc,"08002",
"MyODBC doesn't support this yet",4000);
}
static int check_parameters(HSTMT hstmt,UCHAR FAR *szTableQualifier,
SWORD cbTableQualifier,UCHAR FAR *szTableOwner,
SWORD cbTableOwner, UCHAR FAR *szTableName,
SWORD *cbTableName,
char *table_name,bool no_wildcards)
{
#ifdef NOT_NEEDED
{
char buff[128],*res;
if ((szTableQualifier &&
strcmp(res=fix_str(buff,szTableQualifier,cbTableQualifier),"%") &&
res[0]) ||
(szTableOwner && strcmp(res=fix_str(buff,szTableOwner,cbTableOwner),"%") &&
res[0]))
{
DBUG_PRINT("error",("szTableQualifier: '%s' szTableOwner: '%s' res: '%s'",
szTableQualifier,szTableOwner,res));
return set_error(((STMT FAR*) hstmt)->dbc,
"S1C00","Can't use tablequalifer or owners",0);
}
}
#endif
/* Check table name and copy it to table_name */
if (!szTableName)
{
szTableName="";
*cbTableName=0;
}
if (*cbTableName == SQL_NTS)
*cbTableName=strlen(szTableName);
if ((uint) *cbTableName > NAME_LEN)
return set_error(((STMT FAR*) hstmt)->dbc,"SC1090","Invalid table name",0);
strmake(table_name,szTableName,*cbTableName);
if (no_wildcards && (!table_name[0] || strchr(table_name,'%')))
return(set_error(((STMT FAR*) hstmt)->dbc,"S1C00",
"Can't use wildcards in table name",0));
SQLFreeStmt(hstmt,MYSQL_RESET);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -