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

📄 catalog.c

📁 MySQL的ODBC接口程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

//  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 + -