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

📄 glpsql.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 3 页
字号:
{      typedef SQLRETURN SQL_API ep_SQLNumResultCols (         SQLHSTMT              StatementHandle,         SQLSMALLINT          *ColumnCount);      ep_SQLNumResultCols *fn;      fn = (ep_SQLNumResultCols *) xdlsym(h_odbc, "SQLNumResultCols");      xassert(fn != NULL);      return (*fn)(StatementHandle, ColumnCount);}SQLRETURN SQL_API dl_SQLSetConnectAttr (   SQLHDBC               ConnectionHandle,   SQLINTEGER            Attribute,   SQLPOINTER            Value,   SQLINTEGER            StringLength){      typedef SQLRETURN SQL_API ep_SQLSetConnectAttr (         SQLHDBC               ConnectionHandle,         SQLINTEGER            Attribute,         SQLPOINTER            Value,         SQLINTEGER            StringLength);      ep_SQLSetConnectAttr *fn;     fn = (ep_SQLSetConnectAttr *) xdlsym(h_odbc, "SQLSetConnectAttr");      xassert(fn != NULL);      return (*fn)(ConnectionHandle, Attribute, Value, StringLength);}SQLRETURN SQL_API dl_SQLSetEnvAttr (   SQLHENV               EnvironmentHandle,   SQLINTEGER            Attribute,   SQLPOINTER            Value,   SQLINTEGER            StringLength){      typedef SQLRETURN SQL_API ep_SQLSetEnvAttr (         SQLHENV               EnvironmentHandle,         SQLINTEGER            Attribute,         SQLPOINTER            Value,         SQLINTEGER            StringLength);      ep_SQLSetEnvAttr *fn;      fn = (ep_SQLSetEnvAttr *) xdlsym(h_odbc, "SQLSetEnvAttr");      xassert(fn != NULL);      return (*fn)(EnvironmentHandle, Attribute, Value, StringLength);}static void extract_error(   char *fn,   SQLHANDLE handle,   SQLSMALLINT type);static int is_numeric(    SQLSMALLINT coltype);void *db_iodbc_open(TABDCA *dca, int mode){   struct db_odbc    *sql;   SQLRETURN          ret;   SQLCHAR FAR       *dsn;   SQLCHAR            info[256];   SQLSMALLINT        colnamelen;   SQLSMALLINT        nullable;   SQLSMALLINT        scale;   char              *arg;   int                narg;   int                i, j;   int                total;   if (libodbc == NULL)   {      xprintf("No loader for shared ODBC library available\n");      return NULL;   }   if (h_odbc == NULL)   {      h_odbc = xdlopen(libodbc);      if (h_odbc == NULL)      {  xprintf("unable to open library %s\n", libodbc);         xprintf("%s\n", xerrmsg());         return NULL;      }   }   sql = (struct db_odbc *) xmalloc(sizeof(struct db_odbc));   if (sql == NULL)         return NULL;   sql->mode  = mode;   sql->hdbc  = NULL;   sql->henv  = NULL;   sql->hstmt = NULL;   sql->query = NULL;   narg = mpl_tab_num_args(dca);   dsn = (SQLCHAR FAR *) mpl_tab_get_arg(dca, 2);   /* allocate an environment handle */ ret = dl_SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(sql->henv));   /* set attribute to enable application to run as ODBC 3.0      application */   ret = dl_SQLSetEnvAttr(sql->henv, SQL_ATTR_ODBC_VERSION,      (void *) SQL_OV_ODBC3, 0);   /* allocate a connection handle */   ret = dl_SQLAllocHandle(SQL_HANDLE_DBC, sql->henv, &(sql->hdbc));   /* connect */ ret = dl_SQLDriverConnect(sql->hdbc, NULL, dsn, SQL_NTS, NULL, 0, NULL,      SQL_DRIVER_COMPLETE);   if (SQL_SUCCEEDED(ret))   {      xprintf("Connected to ");      dl_SQLGetInfo(sql->hdbc, SQL_DBMS_NAME, (SQLPOINTER)info,         sizeof(info), NULL);      xprintf("%s ", info);      dl_SQLGetInfo(sql->hdbc, SQL_DBMS_VER, (SQLPOINTER)info,         sizeof(info), NULL);      xprintf("%s - ", info);      dl_SQLGetInfo(sql->hdbc, SQL_DATABASE_NAME, (SQLPOINTER)info,         sizeof(info), NULL);      xprintf("%s\n", info);   }   else   {      xprintf("Failed to connect\n");      extract_error("SQLDriverConnect", sql->hdbc, SQL_HANDLE_DBC);      dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc);      dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv);      xfree(sql);      return NULL;   }   /* set AUTOCOMMIT on*/   ret = dl_SQLSetConnectAttr(sql->hdbc, SQL_ATTR_AUTOCOMMIT,      (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0);   /* allocate a statement handle */   ret = dl_SQLAllocHandle(SQL_HANDLE_STMT, sql->hdbc, &(sql->hstmt));   /* initialization queries */   for (j = 3; j < narg; j++)   {      sql->query = (SQLCHAR *) mpl_tab_get_arg(dca, j);      xprintf("%s\n", sql->query);      ret = dl_SQLExecDirect(sql->hstmt, sql->query, SQL_NTS);      switch (ret)      {         case SQL_SUCCESS:         case SQL_SUCCESS_WITH_INFO:         case SQL_NO_DATA_FOUND:            break;         default:            xprintf("db_iodbc_open: Query\n\"%s\"\nfailed.\n",               sql->query);            extract_error("SQLExecDirect", sql->hstmt, SQL_HANDLE_STMT);            dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt);            dl_SQLDisconnect(sql->hdbc);            dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc);            dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv);            xfree(sql);            return NULL;      }      /* commit statement */      dl_SQLEndTran(SQL_HANDLE_ENV, sql->henv, SQL_COMMIT);   }   if ( sql->mode == 'R' )   {      sql->nf = mpl_tab_num_flds(dca);      arg = (char *) mpl_tab_get_arg(dca, narg);      total = strlen(arg);      if (total > 7 && 0 == strncmp(arg, "SELECT ", 7))      {         total = strlen(arg);         sql->query = xmalloc( (total+1) * sizeof(char));         strcpy (sql->query, arg);      }      else      {         sql->query = db_generate_select_stmt(dca);      }      xprintf("%s\n", sql->query);      if (dl_SQLExecDirect(sql->hstmt, sql->query, SQL_NTS) !=         SQL_SUCCESS)      {         xprintf("db_iodbc_open: Query\n\"%s\"\nfailed.\n", sql->query);         extract_error("SQLExecDirect", sql->hstmt, SQL_HANDLE_STMT);         dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt);         dl_SQLDisconnect(sql->hdbc);         dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc);         dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv);         xfree(sql->query);            xfree(sql);         return NULL;      }      xfree(sql->query);      /* determine number of result columns */      ret = dl_SQLNumResultCols(sql->hstmt, &sql->nresultcols);      total = sql->nresultcols;      if (total > SQL_FIELD_MAX)      {    xprintf("db_iodbc_open: Too many fields (> %d) in query.\n\"%s\"\n",         SQL_FIELD_MAX, sql->query);         dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt);         dl_SQLDisconnect(sql->hdbc);         dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc);         dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv);         xfree(sql->query);         return NULL;      }      for (i = 1; i <= total; i++)      {      /* return a set of attributes for a column */   ret = dl_SQLDescribeCol(sql->hstmt, (SQLSMALLINT) i, sql->colname[i],            SQL_FDLEN_MAX,            &colnamelen, &(sql->coltype[i]), &(sql->collen[i]), &scale,            &nullable);      sql->isnumeric[i] = is_numeric(sql->coltype[i]);      /* bind columns to program vars, converting all types to CHAR */     dl_SQLBindCol(sql->hstmt, i, SQL_CHAR, sql->data[i], SQL_FDLEN_MAX,         &(sql->outlen[i]));      for (j = sql->nf; j >= 1; j--)         {            if (strcmp(mpl_tab_get_name(dca, j), sql->colname[i]) == 0)            break;         }         sql->ref[i] = j;      }   }   else if ( sql->mode == 'W' )   {      arg = (char *) mpl_tab_get_arg(dca, narg);      if (  NULL != strchr(arg, '?') )      {         total = strlen(arg);         sql->query = xmalloc( (total+1) * sizeof(char));         strcpy (sql->query, arg);         }      else      {         sql->query = db_generate_insert_stmt(dca);      }      xprintf("%s\n", sql->query);   }   return sql;}int db_iodbc_read(TABDCA *dca, void *link){   struct db_odbc  *sql;   SQLRETURN        ret;   char             buf[SQL_FDLEN_MAX+1];   int              i;   int              len;   double           num;   sql = (struct db_odbc *) link;   xassert(sql != NULL);   xassert(sql->mode == 'R');   ret=dl_SQLFetch(sql->hstmt);   if (ret== SQL_ERROR)      return -1;   if (ret== SQL_NO_DATA_FOUND)      return -1; /*EOF*/   for (i=1; i <= sql->nresultcols; i++)   {      if (sql->ref[i] > 0)      {         len = sql->outlen[i];         if (len > SQL_FDLEN_MAX)            len = SQL_FDLEN_MAX;         else if (len < 0)            len = 0;         strncpy(buf, (const char *) sql->data[i], len);         buf[len] = 0x00;         if (0 != (sql->isnumeric[i]))         {            strspx(buf); /* remove spaces*/            xassert(str2num(buf, &num) == 0);            mpl_tab_set_num(dca, sql->ref[i], num);         }         else         {            mpl_tab_set_str(dca, sql->ref[i], strtrim(buf));         }      }   }   return 0;}int db_iodbc_write(TABDCA *dca, void *link){   struct db_odbc  *sql;   char            *part;   char            *query;   char            *template;   char             num[50];   int              k;   int              len;   int              nf;   sql = (struct db_odbc *) link;   xassert(sql != NULL);   xassert(sql->mode == 'W');   len      = strlen(sql->query);   template = (char *) xmalloc( (len + 1) * sizeof(char) );   strcpy(template, sql->query);   nf = mpl_tab_num_flds(dca);   for (k = 1; k <= nf; k++)   {     switch (mpl_tab_get_type(dca, k))      {  case 'N':            len += 20;            break;         case 'S':            len += db_escaped_string_length(mpl_tab_get_str(dca, k));            len += 2;            break;              default:                        xassert(dca != dca);         }   }   query = xmalloc( (len + 1 ) * sizeof(char) );   query[0] = 0x00;   for (k = 1, part = strtok (template, "?"); (part != NULL);      part = strtok (NULL, "?"), k++)   {      if (k > nf) break;      strcat( query, part );      switch (mpl_tab_get_type(dca, k))      {  case 'N':            sprintf(num, "%-18g",mpl_tab_get_num(dca, k));            strcat( query, num );            break;         case 'S':            strcat( query, "'");            db_escape_string( query + strlen(query),               mpl_tab_get_str(dca, k) );            strcat( query, "'");            break;              default:                        xassert(dca != dca);         }   }   if (part != NULL)      strcat(query, part);   if (dl_SQLExecDirect(sql->hstmt, (SQLCHAR *) query, SQL_NTS)      != SQL_SUCCESS)   {      xprintf("db_iodbc_write: Query\n\"%s\"\nfailed.\n", query);      extract_error("SQLExecDirect", sql->hdbc, SQL_HANDLE_DBC);      xfree(query);      xfree(template);      return 1;      }   xfree(query);   xfree(template);   return 0;}int db_iodbc_close(TABDCA *dca, void *link){   struct db_odbc *sql;   sql = (struct db_odbc *) link;   xassert(sql != NULL);   /* Commit */   if ( sql->mode == 'W' )      dl_SQLEndTran(SQL_HANDLE_ENV, sql->henv, SQL_COMMIT);   if ( sql->mode == 'R' )      dl_SQLCloseCursor(sql->hstmt);   dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt);   dl_SQLDisconnect(sql->hdbc);   dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc);   dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv);   if ( sql->mode == 'W' )      xfree(sql->query);   xfree(sql);   dca->link = NULL;   return 0;}static void extract_error(   char *fn,   SQLHANDLE handle,   SQLSMALLINT type){   SQLINTEGER   i = 0;   SQLINTEGER   native;   SQLCHAR   state[ 7 ];   SQLCHAR   text[256];   SQLSMALLINT  len;   SQLRETURN    ret;   xprintf("\nThe driver reported the following diagnostics whilst "      "running %s\n", fn);   do   {      ret = dl_SQLGetDiagRec(type, handle, ++i, state, &native, text,         sizeof(text), &len );      if (SQL_SUCCEEDED(ret))         xprintf("%s:%ld:%ld:%s\n", state, i, native, text);   }   while( ret == SQL_SUCCESS );}static int is_numeric(SQLSMALLINT coltype){   int ret = 0;   switch (coltype)   {      case SQL_DECIMAL:      case SQL_NUMERIC:      case SQL_SMALLINT:      case SQL_INTEGER:      case SQL_REAL:      case SQL_FLOAT:      case SQL_DOUBLE:      case SQL_TINYINT:      case SQL_BIGINT:         ret = 1;         break;   }   return ret;}#endif/**********************************************************************/#ifndef HAVE_MYSQLvoid *db_mysql_open(TABDCA *dca, int mode){     xassert(dca == dca);      xassert(mode == mode);      xprintf("MySQL table driver not supported\n");      return NULL;}int db_mysql_read(TABDCA *dca, void *link){     xassert(dca != dca);      xassert(link != link);      return 0;}int db_mysql_write(TABDCA *dca, void *link){     xassert(dca != dca);      xassert(link != link);      return 0;}int db_mysql_close(TABDCA *dca, void *link){     xassert(dca != dca);      xassert(link != link);      return 0;}#else#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WOE__)#include <windows.h>#endif#ifdef __CYGWIN__#define byte_defined 1#endif#include <my_global.h>#include <my_sys.h>#include <mysql.h>struct db_mysql{   int              mode;  /*'R' = Read, 'W' = Write*/

⌨️ 快捷键说明

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