📄 informix.ec
字号:
/* 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 + -