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

📄 inf_cli.c

📁 站长以前写的informix通用开发包源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* informix.ec
 * last update: 1999.02.27
 * by lgd/Paladin/蟑螂:netcom@163.net
 */
#include <stdio.h>
#include <stdlib.h>

#include "informix.h"

#ifndef NO_LOG
void log_err_no_warning(char *);
#endif

int g_db_rc =0;  /* informix 返回的sql错误码 */
int db_bind_params(DB_BIND_DATA *pbind_data);

#ifndef GDB
#define GFB
HENV henv =NULL;
HDBC hdbc =NULL;
short collen[255];
short coltype[255];
#endif
/* db_login: 登录informix */
int db_login(char *dbname, char *user, char *pass)
{
   int ret;
   ret=SQLAllocEnv(&henv);
   if(ret!=SQL_SUCCESS&&ret !=SQL_SUCCESS_WITH_INFO)
   {
     db_err(NULL, "SQLAllocEnv");
     return -1;
   }
   ret=SQLAllocConnect(henv, &hdbc);
   if(ret!=SQL_SUCCESS&&ret !=SQL_SUCCESS_WITH_INFO)
   {
     db_err(NULL, "SQLAllocConnect");
     return -2;
   }
   ret = SQLConnect(hdbc, (UCHAR *)dbname, SQL_NTS, (UCHAR *)user, SQL_NTS, (UCHAR*)pass, SQL_NTS);
   if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
   {
     db_err(NULL, "SQLConnect");
     return -3;
   }
   set_lock(-1);
   return 0;
}

int set_lock(int timeout)
{
  char sqlstm[100];

  if(timeout <0)
    strcpy(sqlstm, "set lock mode to wait");
  /*else if(timeout ==0)
    strcpy(sqlstm, "set lock mode to no wait");*/
  else sprintf(sqlstm, "set lock mode to wait %d", timeout);
  
  if(db_exec_sql(sqlstm) <0)
  {
    printf(" !: db_exec_sql: set_lock failed! sqlstm:%s\n", sqlstm);
    return -1;
  }
  return 0;
}

/* db_logout:退出informix */
void db_logout()
{
  static int f_ok =0;

  if(f_ok ==1) return;
  if(hdbc)
  {
    SQLDisconnect(hdbc);
    SQLFreeConnect(hdbc);
  }
  if(henv) SQLFreeEnv(henv);
  f_ok =1;
}

int g_trans =0;
/* db_begin_trans: */
void db_begin_trans()
{
  if(g_trans ==1) return;
  g_trans =1;
  SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF);
}

void db_commit()
{
  if(g_trans ==0) return;
  g_trans =0;
  SQLTransact(henv,hdbc,SQL_COMMIT);
}

void db_rollback()
{
  if(g_trans ==0) return;
  g_trans =0;
  SQLTransact(henv,hdbc,SQL_ROLLBACK);
}

int db_exec_sql(char *stm)
{
  int ret =0;
  SDWORD num;
  HSTMT hstmt;

  ret=SQLAllocStmt(hdbc,&hstmt);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
     return -1;
  ret=SQLExecDirect(hstmt,(UCHAR *)stm,SQL_NTS);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
  {
    db_err(hstmt, "SQLExecDirect");
    SQLFreeStmt(hstmt,SQL_DROP);
printf("stm:%s\n", stm);
    return -1;
  }
  SQLRowCount(hstmt,&num);
  SQLFreeStmt(hstmt,SQL_DROP);
  return num;
}

int db_exec_sql_opt(char *stm, int opt)
{
  int ret =0;
  SDWORD num;
  HSTMT hstmt;

  if(opt ==SQL_OPT_GET_ROWID)
    opt =SQL_GET_ROWID;
  else if(opt ==SQL_OPT_GET_SERIAL)
    opt =SQL_GET_SERIAL_VALUE;
  else return -1;

  ret=SQLAllocStmt(hdbc,&hstmt);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
     return -1;
  ret=SQLExecDirect(hstmt,(UCHAR *)stm,SQL_NTS);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
  {
    db_err(hstmt, "SQLExecDirect");
    SQLFreeStmt(hstmt,SQL_DROP);
    return -1;
  }
  if((ret =SQLGetStmtOption(hstmt, opt, &num)) !=SQL_SUCCESS 
      && ret !=SQL_SUCCESS_WITH_INFO)
  {
    db_err(hstmt, "SQLGetStmtOption");
    SQLFreeStmt(hstmt, SQL_DROP);
    return -1;
  }
  SQLFreeStmt(hstmt,SQL_DROP);
  return num;
}

int db_get_count(char *sqlstm)
{
  int count;
  DB_SEL_DATA sel_data;
  
  memset(&sel_data, 0, sizeof(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;
}

int db_select(DB_SEL_DATA *psel_data)
{
  int count =0, i;

  if(psel_data->buf_count <=0)
  {
    return -10;
  }
  for(i =0; i<psel_data->buf_count; i++)
    if(psel_data->bufs[i] ==NULL) return -11;

  if(db_sel_run(psel_data) <0)
  {
    db_sel_free(psel_data);
    return -1;
  }
  if(psel_data->col_count !=psel_data->buf_count)
  {
    db_sel_free(psel_data);
    return -12;
  }
  if((count =db_sel_fetch(psel_data)) <0)
  {
    db_sel_free(psel_data);
    return -2;
  }
  if(count ==0)
  {
    db_sel_free(psel_data);
    return 0;
  }
  for(i =0; i<psel_data->buf_count; i++)
    memcpy(psel_data->bufs[i], psel_data->pbufs[i], psel_data->col_defs[i].size+1);
  db_sel_free(psel_data);
  return 1;
}

int db_sel_run(DB_SEL_DATA *psel_data)
{
  if(db_sel_init(psel_data) <0)
    return -1;
  if(db_sel_exec(psel_data) <0)
    return -1;
  return 0;
}

int db_sel_init(DB_SEL_DATA *psel_data)
{
  int ret;
  
  if(psel_data ==NULL) return 0;

  psel_data->row_count =psel_data->col_count =0;
  psel_data->hstmt =NULL;
  ret=SQLAllocStmt(hdbc,&psel_data->hstmt);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
     return -1;
  ret=SQLPrepare(psel_data->hstmt, (UCHAR *)psel_data->sqlstm,SQL_NTS);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
  {
    db_err(psel_data->hstmt, "SQLPrepare");
printf(psel_data->sqlstm);
    return -2;
  }
  return 0;
}

int db_sel_exec(DB_SEL_DATA *psel_data)
{
  int ret, i, len;
  SWORD type;
  UDWORD size;
  SWORD msglen, namelen, scale, nullabel;
  char name[50], name1[50], temp[50];
  long ind =SQL_NTS;

  for(i =1; i<=psel_data->param_count; i++)
  {
    len =psel_data->param_defs[i-1].size;
    switch(psel_data->param_defs[i-1].type)
    {
    case SQLT_DATETIME:
    case SQLT_STR:
      ret =SQLBindParameter(psel_data->hstmt, i, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, len+1, 0, psel_data->pbufs_param[i-1], 0, &ind);
      break;
    case SQLT_FLT:
      ret =SQLBindParameter(psel_data->hstmt, i, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, len, 0, psel_data->pbufs_param[i-1], 0, 0);
      break;
    case SQLT_INT:
      ret =SQLBindParameter(psel_data->hstmt, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_DECIMAL, len, 0, psel_data->pbufs_param[i-1], 0, 0);
      break;
    default:
printf("invalid param type:%d\n", psel_data->param_defs[i-1].type);
      return -1;
    }
    if(ret !=SQL_SUCCESS && ret !=SQL_SUCCESS_WITH_INFO)
    {
printf("db_sel_init:SQLBindParameter failed! i=%d\n", i);
      db_err(psel_data->hstmt, "SQLBindParameter");
      return -1;
    }
  }
  SQLFreeStmt(psel_data->hstmt, SQL_CLOSE);
  ret=SQLExecute(psel_data->hstmt);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
  {
    db_err(psel_data->hstmt, "SQLExecute");
    SQLFreeStmt(psel_data->hstmt, SQL_CLOSE);
    return -3;
  }
  ret=SQLNumResultCols(psel_data->hstmt,&psel_data->col_count);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
  {
    SQLFreeStmt(psel_data->hstmt, SQL_CLOSE);
    return -4;
  }
  if((psel_data->pbufs =(char **)malloc(sizeof(char *)*psel_data->col_count)) ==NULL)
  {
    SQLFreeStmt(psel_data->hstmt, SQL_CLOSE);
#ifndef NO_LOG
    log_err_no_warning("sel: alloc pbufs failed!\n");
#endif
    return -5;
  }
  memset(psel_data->pbufs, 0, sizeof(char *)*psel_data->col_count);
  for(i =1; i<=psel_data->col_count; i++)
  {
    SQLDescribeCol(psel_data->hstmt, i, (PTR)name, sizeof(name), &namelen, (SWORD *)&type, (UDWORD *)&size, &scale, &nullabel);
    switch(type)
    {
    case SQL_DECIMAL:
      if(scale ==0 || scale ==255)
      {
        type =SQL_C_LONG;
        size =4;
      }
      else
      {
        type =SQL_C_DOUBLE;
        size =8;
      }
/*printf("sel_col:name:%s, type:%d, size:%d, scale:%d\n", name, type, size, scale);*/
      break;
    case SQL_CHAR:
    case SQL_VARCHAR:
      type =SQL_C_CHAR;
      size++;
      break;
    case SQL_DATE:
    case SQL_TIME:
    case SQL_TIMESTAMP:
      type =SQL_C_CHAR;
      size =20;
      break;
    default: break;
    }
    if((psel_data->pbufs[i-1] =(char *)malloc(size+1)) ==NULL)
    {
      printf("malloc size failed!\n");
      return -6;
    }
    memset(psel_data->pbufs[i-1], 0, size+1);
    ret =SQLBindCol(psel_data->hstmt, i, type, psel_data->pbufs[i-1], size, &psel_data->is_null[i-1]);

⌨️ 快捷键说明

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