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

📄 informix.ec

📁 站长以前写的informix通用开发包源码
💻 EC
📖 第 1 页 / 共 2 页
字号:
/* informix.ec * last update: 1999.02.27 * by lgd/Paladin/蟑螂.InetSoft, netcom@163.net */#include <stdio.h>#include <stdlib.h>#include "/export/home/caiji/share/informix/informix.h" /* ec is so bad that you must include full path of include file*/EXEC SQL include sqltypes;EXEC SQL include datetime;EXEC SQL include decimal;#ifndef NO_LOGvoid log_err_no_warning(char *);#endifint g_db_rc =0;  /* informix 返回的sql错误码 */extern int delspaces(char *);/* db_login: 登录informix */int db_login(char *dbname, char *user, char *pass){  EXEC SQL BEGIN DECLARE SECTION;  char *db_name, *db_user, *db_pass;  EXEC SQL END DECLARE SECTION;    db_name =dbname;  db_user =user;  db_pass =pass;  EXEC SQL connect to :db_name; /* user :db_user */  if(sqlca.sqlcode <0)  {    db_err("dbconnect");    return -1;  }  EXEC SQL set lock mode to wait 10;  return 0;}/* db_logout:退出informix */void db_logout(){  static int f_ok =0;    if(f_ok ==1) return;  EXEC SQL disconnect current;  f_ok =1;}/* db_begin_trans: 开始事务 */void db_begin_trans(){  EXEC SQL begin work;}/* db_commit: 确认事务 */void db_commit(){  EXEC SQL commit work;}/* db_rollback: 回滚事务 */void db_rollback(){  EXEC SQL rollback work;}int db_get_count(char *sqlstm){  int count;  DB_SEL_DATA sel_data;    strcpy(sel_data.sqlstm, sqlstm);  if(db_sel_run(&sel_data) <0){db_sel_free(&sel_data); return -1;}  if(db_sel_fetch(&sel_data) <=0){db_sel_free(&sel_data); return -2;}  count =*(int *)sel_data.pbufs[0];  db_sel_free(&sel_data);  return count;}/* db_exec_sql: 执行sql语句, 返回操作成功的行数 */int db_exec_sql(char *stm){  char *func =NULL;  EXEC SQL BEGIN DECLARE SECTION;  char *pstm =stm;  EXEC SQL END DECLARE SECTION;  EXEC SQL whenever sqlerror goto err_ret;  func ="prepare exec_stmt";  EXEC SQL prepare exec_stmt from :pstm;  func ="execute exec_stmt";  EXEC SQL execute exec_stmt;  EXEC SQL free exec_stmt;  return (int)sqlca.sqlerrd[2];err_ret:    EXEC SQL whenever sqlerror continue;    EXEC SQL free exec_stmt;    db_err(func);    log_err_no_warning(stm);    return -1;}/* db_sel_run: 执行查询语句 */int db_sel_run(DB_SEL_DATA *psel_data){  static int stmt_num =0;  static int cursor_num =0;  static int desc_num =0;  char *func =NULL;  EXEC SQL BEGIN DECLARE SECTION;  int i, scale;  char sel_stmt[15];  char sel_cursor[15];  char sel_desc[15];  char *sel_sqlstm;  int colcount =0;  short type, len;  char name[40];  EXEC SQL END DECLARE SECTION;    if(stmt_num++>10000) stmt_num =0;  if(cursor_num++>10000) cursor_num =0;  if(desc_num++>10000) desc_num =0;  psel_data->stmt_num =stmt_num;  psel_data->cursor_num =cursor_num;  psel_data->desc_num =desc_num;  sprintf(sel_stmt, "stmt%d", psel_data->stmt_num);  sprintf(sel_cursor, "curs%d", psel_data->cursor_num);  sprintf(sel_desc, "desc%d", psel_data->desc_num);  sel_sqlstm =psel_data->sqlstm;  EXEC SQL whenever sqlerror goto err_ret;  func ="prepare sel_stmt";  EXEC SQL prepare :sel_stmt from :sel_sqlstm;  func ="declare sel_cursor";  EXEC SQL declare :sel_cursor cursor for :sel_stmt;  func ="allocate sel_desc";  EXEC SQL allocate descriptor :sel_desc;  func ="describe sel_stmt";  EXEC SQL describe :sel_stmt using sql descriptor :sel_desc;  func ="get describe colcount";  EXEC SQL get descriptor :sel_desc :colcount =COUNT;  func ="open sel_cursor";  EXEC SQL open :sel_cursor;  psel_data->col_count =colcount;  if((psel_data->pbufs =(char **)malloc(colcount*sizeof(char *))) ==NULL)  {    log_err_no_warning("alloc psel_data->pbufs failed!\n");    return -1;  }  for(i =1; i<=colcount; i++)  {    EXEC SQL get descriptor :sel_desc VALUE :i :type=TYPE, :name=NAME, :len=LENGTH;    switch(type)    {    case SQLSERIAL:    case SQLINT:    case SQLSMINT:      len =sizeof(int);      break;    case SQLFLOAT:    case SQLSMFLOAT:      len =sizeof(double);      break;    case SQLDTIME:      len =19;      break;    case SQLDECIMAL:      EXEC SQL get descriptor :sel_desc VALUE :i :scale=SCALE;      if(scale ==0 || scale ==255)      {        len =sizeof(int);      }      else      {        len =sizeof(double);      }      break;    }    if((psel_data->pbufs[i-1] =(char *)malloc(len+1)) ==NULL)    {      printf("malloc pbufs i failed!\n");      return -6;    }    psel_data->col_defs[i-1].size =len;    psel_data->col_defs[i-1].type =type;    name[38] =0;    delspaces(name);    strcpy(psel_data->col_defs[i-1].name, name);  }  return 0;err_ret:  EXEC SQL whenever sqlerror continue;  db_err(func/*"db_sel_run"*/);  return -1;}/* 查询结果取一行, 返回实际取得的行数, -1错误 */int db_sel_fetch(DB_SEL_DATA *psel_data){  EXEC SQL BEGIN DECLARE SECTION;    char sel_stmt[15];    char sel_cursor[15];    char sel_desc[15];    char buf[256];    int i;    short type, ind;    int int_data, scale;    short short_data;    float sm_float_data;    double float_data;    datetime year to second dt_data;    decimal dec_data;    char char_data[256];  EXEC SQL END DECLARE SECTION;  sprintf(sel_stmt, "stmt%d", psel_data->stmt_num);  sprintf(sel_cursor, "curs%d", psel_data->cursor_num);  sprintf(sel_desc, "desc%d", psel_data->desc_num);  EXEC SQL whenever sqlerror goto err_ret;  EXEC SQL fetch :sel_cursor using sql descriptor :sel_desc;  if(sqlca.sqlcode ==100) return 0;  for(i = 1; i <= psel_data->col_count; i++)  {    EXEC SQL get descriptor :sel_desc VALUE :i           :type = TYPE;     switch(type)    {    case SQLSERIAL:    case SQLINT:      EXEC SQL get descriptor :sel_desc VALUE :i		   :ind = INDICATOR,		   :int_data = DATA;      if(ind != -1)      {        if(!strncmp(psel_data->col_defs[i-1].name, "rowid", 5)) sprintf(psel_data->pbufs[i-1], "%d", int_data);        else *(int *)psel_data->pbufs[i-1] =int_data;      }      break;    case SQLSMINT:      EXEC SQL get descriptor :sel_desc VALUE :i                :ind = INDICATOR,                :short_data = DATA;      if(ind != -1)        *(int *)psel_data->pbufs[i-1] =short_data;      break;    case SQLFLOAT:      EXEC SQL get descriptor :sel_desc VALUE :i		   :ind = INDICATOR,		   :float_data = DATA;      if(ind != -1)        *(double *)psel_data->pbufs[i-1] =float_data;      break;    case SQLSMFLOAT:      EXEC SQL get descriptor :sel_desc VALUE :i                :ind = INDICATOR,                :sm_float_data = DATA;      if(ind != -1)        *(double *)psel_data->pbufs[i-1] =sm_float_data;      break;   case SQLDTIME:      EXEC SQL get descriptor :sel_desc VALUE :i                :ind = INDICATOR,                :dt_data = DATA;      if(ind != -1)         dttoasc(&dt_data, psel_data->pbufs[i-1]);      break;   case SQLDECIMAL:      EXEC SQL get descriptor :sel_desc VALUE :i                :ind = INDICATOR,                :scale =SCALE,                :dec_data = DATA;      if(ind != -1)      {         if(scale ==0 || scale ==255)         {           dectoint(&dec_data, (int *)psel_data->pbufs[i-1]);         }         else         {           dectodbl(&dec_data, (double *)psel_data->pbufs[i-1]);

⌨️ 快捷键说明

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