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

📄 glpsql.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 3 页
字号:
   MYSQL           *con;   /*connection*/   MYSQL_RES       *res;    /*result*/   int              nf;   /* number of fields in the csv file */   int              ref[1+SQL_FIELD_MAX];   /* ref[k] = k', if k-th field of the csv file corresponds to      k'-th field in the table statement; if ref[k] = 0, k-th field      of the csv file is ignored */   char            *query;   /* query generated by db_mysql_open */};void STDCALL dl_mysql_close(MYSQL *sock){      typedef void STDCALL ep_mysql_close(MYSQL *sock);      ep_mysql_close *fn;      fn = (ep_mysql_close *) xdlsym(h_mysql, "mysql_close");      xassert(fn != NULL);      return (*fn)(sock);}const char * STDCALL dl_mysql_error(MYSQL *mysql){      typedef const char * STDCALL ep_mysql_error(MYSQL *mysql);      ep_mysql_error *fn;      fn = (ep_mysql_error *) xdlsym(h_mysql, "mysql_error");      xassert(fn != NULL);      return (*fn)(mysql);}MYSQL_FIELD * STDCALL dl_mysql_fetch_fields(MYSQL_RES *res){      typedef MYSQL_FIELD * STDCALL         ep_mysql_fetch_fields(MYSQL_RES *res);      ep_mysql_fetch_fields *fn;   fn = (ep_mysql_fetch_fields *) xdlsym(h_mysql, "mysql_fetch_fields");      xassert(fn != NULL);      return (*fn)(res);}unsigned long * STDCALL dl_mysql_fetch_lengths(MYSQL_RES *result){      typedef unsigned long * STDCALL         ep_mysql_fetch_lengths(MYSQL_RES *result);      ep_mysql_fetch_lengths *fn;      fn = (ep_mysql_fetch_lengths *) xdlsym(h_mysql,         "mysql_fetch_lengths");      xassert(fn != NULL);      return (*fn)(result);}MYSQL_ROW STDCALL dl_mysql_fetch_row(MYSQL_RES *result){      typedef MYSQL_ROW STDCALL ep_mysql_fetch_row(MYSQL_RES *result);      ep_mysql_fetch_row *fn;      fn = (ep_mysql_fetch_row *) xdlsym(h_mysql, "mysql_fetch_row");      xassert(fn != NULL);      return (*fn)(result);}unsigned int STDCALL dl_mysql_field_count(MYSQL *mysql){      typedef unsigned int STDCALL ep_mysql_field_count(MYSQL *mysql);      ep_mysql_field_count *fn;     fn = (ep_mysql_field_count *) xdlsym(h_mysql, "mysql_field_count");      xassert(fn != NULL);      return (*fn)(mysql);}MYSQL * STDCALL dl_mysql_init(MYSQL *mysql){      typedef MYSQL * STDCALL ep_mysql_init(MYSQL *mysql);      ep_mysql_init *fn;      fn = (ep_mysql_init *) xdlsym(h_mysql, "mysql_init");      xassert(fn != NULL);      return (*fn)(mysql);}unsigned int STDCALL dl_mysql_num_fields(MYSQL_RES *res){      typedef unsigned int STDCALL ep_mysql_num_fields(MYSQL_RES *res);      ep_mysql_num_fields *fn;      fn = (ep_mysql_num_fields *) xdlsym(h_mysql, "mysql_num_fields");      xassert(fn != NULL);      return (*fn)(res);}int STDCALL dl_mysql_query(MYSQL *mysql, const char *q){      typedef int STDCALL ep_mysql_query(MYSQL *mysql, const char *q);      ep_mysql_query *fn;      fn = (ep_mysql_query *) xdlsym(h_mysql, "mysql_query");      xassert(fn != NULL);      return (*fn)(mysql, q);}MYSQL * STDCALL dl_mysql_real_connect(MYSQL *mysql, const char *host,                                           const char *user,                                           const char *passwd,                                           const char *db,                                           unsigned int port,                                           const char *unix_socket,                                           unsigned long clientflag){      typedef MYSQL * STDCALL ep_mysql_real_connect(MYSQL *mysql,            const char *host,            const char *user,            const char *passwd,            const char *db,            unsigned int port,            const char *unix_socket,            unsigned long clientflag);      ep_mysql_real_connect *fn;      fn = (ep_mysql_real_connect *) xdlsym(h_mysql,         "mysql_real_connect");      xassert(fn != NULL);      return (*fn)(mysql, host, user, passwd, db, port, unix_socket,         clientflag);}MYSQL_RES * STDCALL dl_mysql_use_result(MYSQL *mysql){      typedef MYSQL_RES * STDCALL ep_mysql_use_result(MYSQL *mysql);      ep_mysql_use_result *fn;      fn = (ep_mysql_use_result *) xdlsym(h_mysql, "mysql_use_result");      xassert(fn != NULL);      return (*fn)(mysql);}void *db_mysql_open(TABDCA *dca, int mode){   struct db_mysql *sql = NULL;   char            *arg = NULL;   const char      *field;   MYSQL_FIELD     *fields;   char            *keyword;   char            *value;   char            *query;   char            *dsn;/* "Server=[server_name];Database=[database_name];UID=[username];*//* PWD=[password];Port=[port]"*/   char            *server   = NULL;        /* Server */   char            *user     = NULL;        /* UID */   char            *password = NULL;        /* PWD */   char            *database = NULL;        /* Database */   unsigned int     port = 0;               /* Port */   int              narg;   int              i, j, total;   if (libmysql == NULL)   {      xprintf("No loader for shared MySQL library available\n");      return NULL;   }   if (h_mysql == NULL)   {      h_mysql = xdlopen(libmysql);      if (h_mysql == NULL)      {  xprintf("unable to open library %s\n", libmysql);         xprintf("%s\n", xerrmsg());         return NULL;      }   }   sql = (struct db_mysql *) xmalloc(sizeof(struct db_mysql));   if (sql == NULL)         return NULL;   sql->mode = mode;   sql->res = NULL;   sql->query = NULL;   sql->nf = mpl_tab_num_flds(dca);   narg = mpl_tab_num_args(dca);   if (narg < 3 )      xprintf("MySQL driver: string list too short \n");   /* get connection string*/   dsn = (char *) mpl_tab_get_arg(dca, 2);      /* copy connection string*/   i = strlen(dsn);   i++;   arg = xmalloc(i * sizeof(char));   strcpy(arg, dsn);   /*tokenize connection string*/   for (i = 1, keyword = strtok (arg, "="); (keyword != NULL);      keyword = strtok (NULL, "="), i++)   {         value = strtok (NULL, ";");      if (value==NULL)         {            xprintf("db_mysql_open: Missing value for keyword %s\n",               keyword);            xfree(arg);            xfree(sql);            return NULL;      }      if (0 == strcmp(keyword, "Server"))            server = value;      else if (0 == strcmp(keyword, "Database"))             database = value;      else if (0 == strcmp(keyword, "UID"))             user = value;      else if (0 == strcmp(keyword, "PWD"))             password = value;      else if (0 == strcmp(keyword, "Port"))             port = (unsigned int) atol(value);   }   /* Connect to database */   sql->con = dl_mysql_init(NULL);  if (!dl_mysql_real_connect(sql->con, server, user, password, database,      port, NULL, 0))   {      xprintf("db_mysql_open: Connect failed\n");      xprintf("%s\n", dl_mysql_error(sql->con));      xfree(arg);      xfree(sql);      return NULL;   }   xfree(arg);   for (j = 3; j < narg; j++)   {      query = (char *) mpl_tab_get_arg(dca, j);      xprintf("%s\n", query);      if (dl_mysql_query(sql->con, query))      {         xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query);         xprintf("%s\n",dl_mysql_error(sql->con));         dl_mysql_close(sql->con);         xfree(sql);         return NULL;      }   }   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);         query = xmalloc( (total+1) * sizeof(char));         strcpy (query, arg);      }      else      {         query = db_generate_select_stmt(dca);      }      xprintf("%s\n", query);      if (dl_mysql_query(sql->con, query))      {         xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query);         xprintf("%s\n",dl_mysql_error(sql->con));         dl_mysql_close(sql->con);         xfree(query);         xfree(sql);         return NULL;      }      xfree(query);      sql->res = dl_mysql_use_result(sql->con);      if (sql->res)      {         /* create references between query results and table fields*/         total = dl_mysql_num_fields(sql->res);         if (total > SQL_FIELD_MAX)         {    xprintf("db_mysql_open: Too many fields (> %d) in query.\n\"%s\"\n",               SQL_FIELD_MAX, query);            xprintf("%s\n",dl_mysql_error(sql->con));            dl_mysql_close(sql->con);            xfree(query);                 xfree(sql);            return NULL;         }         fields = dl_mysql_fetch_fields(sql->res);         for (i = 1; i <= total; i++)         {               for (j = sql->nf; j >= 1; j--)            {               if (strcmp(mpl_tab_get_name(dca, j), fields[i-1].name)                  == 0)               break;            }            sql->ref[i] = j;         }      }      else      {         if(dl_mysql_field_count(sql->con) == 0)            {            xprintf("db_mysql_open: Query was not a SELECT\n\"%s\"\n",               query);            xprintf("%s\n",dl_mysql_error(sql->con));            xfree(query);            xfree(sql);            return NULL;         }         else         {            xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query);            xprintf("%s\n",dl_mysql_error(sql->con));            xfree(query);            xfree(sql);            return NULL;         }      }   }   else if ( sql->mode == 'W' )   {      arg = (char *) mpl_tab_get_arg(dca, narg);      if (  NULL != strchr(arg, '?') )      {         total = strlen(arg);         query = xmalloc( (total+1) * sizeof(char));         strcpy (query, arg);         }      else      {         query = db_generate_insert_stmt(dca);      }      sql->query = query;      xprintf("%s\n", query);   }   return sql;}int db_mysql_read(TABDCA *dca, void *link){   struct db_mysql *sql;   char            buf[255+1];   char            **row;   unsigned long   *lengths;   MYSQL_FIELD     *fields;   double          num;   int             len;   unsigned long   num_fields;   int             i;   sql = (struct db_mysql *) link;   xassert(sql != NULL);   xassert(sql->mode == 'R');   if (NULL == sql->res)   {      xprintf("db_mysql_read: no result set available");      return 1;   }   if (NULL==(row = (char **)dl_mysql_fetch_row(sql->res))) {       return -1; /*EOF*/   }   lengths = dl_mysql_fetch_lengths(sql->res);   fields = dl_mysql_fetch_fields(sql->res);   num_fields = dl_mysql_num_fields(sql->res);   for (i=1; i <= num_fields; i++)   {      len = (size_t) lengths[i-1];      if (len > 255)         len = 255;      strncpy(buf, (const char *) row[i-1], len);      buf[len] = 0x00;      if (0 != (fields[i-1].flags & NUM_FLAG))      {         strspx(buf); /* remove spaces*/         xassert(str2num(buf, &num) == 0);         if (sql->ref[i] > 0)            mpl_tab_set_num(dca, sql->ref[i], num);         }           else         {         if (sql->ref[i] > 0)            mpl_tab_set_str(dca, sql->ref[i], strtrim(buf));         }         }   return 0;   }int db_mysql_write(TABDCA *dca, void *link){   struct db_mysql *sql;   char            *part;   char            *query;   char            *template;   char             num[50];   int              k;   int              len;   int              nf;   sql = (struct db_mysql *) 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_mysql_query(sql->con, query))   {      xprintf("db_mysql_write: Query\n\"%s\"\nfailed.\n", query);      xprintf("%s\n",dl_mysql_error(sql->con));      xfree(query);      xfree(template);      return 1;      }   xfree(query);   xfree(template);   return 0;   }int db_mysql_close(TABDCA *dca, void *link){   struct db_mysql *sql;   sql = (struct db_mysql *) link;   xassert(sql != NULL);   dl_mysql_close(sql->con);   if ( sql->mode == 'W' )      xfree(sql->query);   xfree(sql);   dca->link = NULL;   return 0;}#endif/* eof */

⌨️ 快捷键说明

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