📄 dblib.c
字号:
return SUCCEED; break; case DBSETUSER: tds_set_user(login->tds_login, value); return SUCCEED; break; case DBSETPWD: tds_set_passwd(login->tds_login, value); return SUCCEED; break; case DBSETAPP: tds_set_app(login->tds_login, value); return SUCCEED; break; case DBSETCHARSET: tds_set_charset(login->tds_login, value); return SUCCEED; break; case DBSETNATLANG: tds_set_language(login->tds_login, value); return SUCCEED; break; case DBSETHID: default: tdsdump_log(TDS_DBG_FUNC, "%L UNIMPLEMENTED dbsetlname() which = %d\n", which); return FAIL; break; }}RETCODE dbsetllong(LOGINREC *login, long value, int which){ switch (which) { case DBSETPACKET: tds_set_packet(login->tds_login, (short) value); /* XXX */ return SUCCEED; break; default: tdsdump_log(TDS_DBG_FUNC, "%L UNIMPLEMENTED dbsetllong() which = %d\n", which); return FAIL; break; }}RETCODE dbsetlshort(LOGINREC *login, int value, int which){ switch (which) { case DBSETHIER: default: tdsdump_log(TDS_DBG_FUNC, "%L UNIMPLEMENTED dbsetlshort() which = %d\n", which); return FAIL; break; }}RETCODE dbsetlbool(LOGINREC *login, int value, int which){ switch (which) { case DBSETBCP: tds_set_bulk(login->tds_login, (TDS_TINYINT) value); return SUCCEED; break; case DBSETNOSHORT: case DBSETENCRYPT: case DBSETLABELED: default: tdsdump_log(TDS_DBG_FUNC, "%L UNIMPLEMENTED dbsetlbool() which = %d\n", which); return FAIL; break; } }DBPROCESS *tdsdbopen(LOGINREC *login,char *server){DBPROCESS *dbproc; dbproc = (DBPROCESS *) malloc(sizeof(DBPROCESS)); memset(dbproc,'\0',sizeof(DBPROCESS)); dbproc->avail_flag = TRUE; tds_set_server(login->tds_login,server); dbproc->tds_socket = (void *) tds_connect(login->tds_login, g_dblib_ctx->tds_ctx, (void *)dbproc); dbproc->dbbuf = NULL; dbproc->dbbufsz = 0; if(dbproc->tds_socket) { /* tds_set_parent( dbproc->tds_socket, dbproc); */ dblib_add_connection(g_dblib_ctx, dbproc->tds_socket); } else { fprintf(stderr,"DB-Library: Login incorrect.\n"); free(dbproc); /* memory leak fix (mlilback, 11/17/01) */ return NULL; } buffer_init(&(dbproc->row_buf)); return dbproc;}RETCODE dbfcmd(DBPROCESS *dbproc, char *fmt, ...){va_list ap;char *s;int len;RETCODE ret; va_start(ap, fmt); len = vasprintf(&s, fmt, ap); va_end(ap); if (len < 0) return FAIL; ret = dbcmd(dbproc, s); free(s); return ret;}RETCODE dbcmd(DBPROCESS *dbproc, char *cmdstring){int newsz;void *p; if(dbproc == NULL) { return FAIL; } dbproc->avail_flag = FALSE; if(dbproc->dbbufsz == 0) { dbproc->dbbuf = (unsigned char *) malloc(strlen(cmdstring)+1); if(dbproc->dbbuf == NULL) { return FAIL; } strcpy((char *)dbproc->dbbuf, cmdstring); dbproc->dbbufsz = strlen(cmdstring) + 1; } else { newsz = strlen(cmdstring) + dbproc->dbbufsz; if((p=realloc(dbproc->dbbuf,newsz)) == NULL) { return FAIL; } dbproc->dbbuf = (unsigned char *)p; strcat((char *)dbproc->dbbuf, cmdstring); dbproc->dbbufsz = newsz; } return SUCCEED;}RETCODE dbsqlexec(DBPROCESS *dbproc){RETCODE rc = FAIL;TDSSOCKET *tds; if (dbproc == NULL) { return FAIL; } tds = (TDSSOCKET *) dbproc->tds_socket; if (!tds || !tds->s) return FAIL; if (tds->res_info && tds->res_info->more_results) /* if (dbproc->more_results && tds_is_end_of_results(dbproc->tds_socket)) */ { dbresults(dbproc); } if (SUCCEED == (rc = dbsqlsend(dbproc))) { /* * XXX We need to observe the timeout value and abort * if this times out. */ rc = dbsqlok(dbproc); } dbproc->empty_res_hack = 0; return rc;}RETCODEdbuse(DBPROCESS *dbproc, char *dbname){ /* FIXME quote dbname if needed */ if ((dbproc == NULL) || (dbfcmd(dbproc, "use %s", dbname) == FAIL) || (dbsqlexec(dbproc) == FAIL) || (dbcanquery(dbproc) == FAIL)) return FAIL; return SUCCEED;}voiddbclose(DBPROCESS *dbproc){TDSSOCKET *tds;int i; tds = (TDSSOCKET *) dbproc->tds_socket; if (tds) { buffer_free(&(dbproc->row_buf)); tds_free_socket(tds); } if (dbproc->bcp_tablename) free(dbproc->bcp_tablename); if (dbproc->bcp_hostfile) free(dbproc->bcp_hostfile); if (dbproc->bcp_errorfile) free(dbproc->bcp_errorfile); if (dbproc->bcp_columns) { for (i=0;i<dbproc->bcp_colcount;i++) {#ifdef NCBI_FTDS if(dbproc->bcp_hostfile)#endif if (dbproc->bcp_columns[i]->data) free(dbproc->bcp_columns[i]->data); free(dbproc->bcp_columns[i]); } free(dbproc->bcp_columns); } if (dbproc->host_columns) { for (i=0;i<dbproc->host_colcount;i++) { if (dbproc->host_columns[i]->terminator) free(dbproc->host_columns[i]->terminator); free(dbproc->host_columns[i]); } free(dbproc->host_columns); }#ifdef NCBI_FTDS if(dbproc->bcp_hint) free(dbproc->bcp_hint);#endif dbfreebuf(dbproc); dblib_del_connection(g_dblib_ctx, dbproc->tds_socket); free(dbproc); return;}voiddbexit(){TDSSOCKET *tds;DBPROCESS *dbproc;int i; /* FIX ME -- this breaks if ctlib/dblib used in same process */ for (i=0;i<TDS_MAX_CONN;i++) { tds = g_dblib_ctx->connection_list[i]; if (tds) { dbproc = (DBPROCESS *) tds->parent; dbclose(dbproc); } } tds_free_context(g_dblib_ctx->tds_ctx);}RETCODE dbresults_r(DBPROCESS *dbproc, int recursive){RETCODE retcode = FAIL;TDSSOCKET *tds; /* * For now let's assume we have only 5 possible classes of tokens * at the next byte in the TDS stream * 1) The start of a result set, either TDS_RESULT_TOKEN (tds ver 5.0) * or TDS_COL_NAME_TOKEN (tds ver 4.2). * 2) A row token (TDS_ROW_TOKEN) * 3) An end token (either 0xFD or 0xFE) * 4) A done in proc token (0xFF) * 5) A message or error token */ if (dbproc == NULL) return FAIL; buffer_clear(&(dbproc->row_buf)); tds = dbproc->tds_socket; if (!tds || !tds->s) return FAIL; retcode = tds_process_result_tokens(tds); if (retcode == TDS_NO_MORE_RESULTS) { if (tds->res_info && tds->res_info->rows_exist) { return NO_MORE_RESULTS; } else { if (!dbproc->empty_res_hack) { dbproc->empty_res_hack = 1; return SUCCEED; } else { dbproc->empty_res_hack = 0; return NO_MORE_RESULTS; } } } if (retcode == TDS_SUCCEED) { retcode = buffer_start_resultset(&(dbproc->row_buf), tds->res_info->row_size); } return retcode;} /* =============================== dbresults() =============================== * * Def: * * Ret: SUCCEED, FAIL, NO_MORE_RESULTS, or NO_MORE_RPC_RESULTS * * =========================================================================== */RETCODE dbresults(DBPROCESS *dbproc){RETCODE rc; tdsdump_log(TDS_DBG_FUNC, "%L inside dbresults()\n"); if (dbproc == NULL) return FAIL; rc = dbresults_r(dbproc, 0); tdsdump_log(TDS_DBG_FUNC, "%L leaving dbresults() returning %d\n",rc); return rc;}int dbnumcols(DBPROCESS *dbproc){TDSRESULTINFO *resinfo;TDSSOCKET *tds; tds = (TDSSOCKET *) dbproc->tds_socket; resinfo = tds->res_info; if (resinfo) return resinfo->num_cols; return 0;}char *dbcolname(DBPROCESS *dbproc, int column){#ifdef NCBI_FTDS TDSRESULTINFO *resinfo; TDSSOCKET *tds; tds = (TDSSOCKET *) dbproc->tds_socket; resinfo = tds->res_info; if (column < 1 || column > resinfo->num_cols || !resinfo->columns[column-1]) return NULL; return resinfo->columns[column-1]->column_name;#else static char buf[255];TDSRESULTINFO *resinfo;TDSSOCKET *tds; tds = (TDSSOCKET *) dbproc->tds_socket; resinfo = tds->res_info; if (column < 1 || column > resinfo->num_cols) return NULL; strcpy (buf,resinfo->columns[column-1]->column_name); return buf;#endif}RETCODE dbgetrow( DBPROCESS *dbproc, DBINT row){ RETCODE result = FAIL; int index = buffer_index_of_resultset_row(&(dbproc->row_buf), row); if (-1 == index) { result = NO_MORE_ROWS; } else { dbproc->row_buf.next_row = row; buffer_transfer_bound_data(&(dbproc->row_buf), dbproc, row); dbproc->row_buf.next_row++; result = REG_ROW; } return result;}RETCODE dbnextrow(DBPROCESS *dbproc){ TDSRESULTINFO *resinfo; TDSSOCKET *tds; int rc; RETCODE result = FAIL; tdsdump_log(TDS_DBG_FUNC, "%L inside dbnextrow()\n"); if (dbproc == NULL) return FAIL; tds = (TDSSOCKET *) dbproc->tds_socket; if (!tds || !tds->s) { tdsdump_log(TDS_DBG_FUNC, "%L leaving dbnextrow() returning %d\n",FAIL); return FAIL; } resinfo = tds->res_info; if (!resinfo) { tdsdump_log(TDS_DBG_FUNC, "%L leaving dbnextrow() returning %d\n",NO_MORE_ROWS); return NO_MORE_ROWS; } if (dbproc->row_buf.buffering_on && buffer_is_full(&(dbproc->row_buf)) && (-1 == buffer_index_of_resultset_row(&(dbproc->row_buf), dbproc->row_buf.next_row))) { result = BUF_FULL; } else { /* * Now try to get the dbproc->row_buf.next_row item into the row * buffer */ if (-1 != buffer_index_of_resultset_row(&(dbproc->row_buf), dbproc->row_buf.next_row)) { /* * Cool, the item we want is already there */ rc = TDS_SUCCEED; result = REG_ROW; } else { /* * XXX Note- we need to handle "compute" results as well. * I don't believe the current src/tds/token.c handles those * so we don't handle them yet either. */ /* * Get the row from the TDS stream. */ rc = tds_process_row_tokens(dbproc->tds_socket); if (rc == TDS_SUCCEED) { /* * Add the row to the row buffer */ buffer_add_row(&(dbproc->row_buf), resinfo->current_row, resinfo->row_size); result = REG_ROW; } else if (rc == TDS_NO_MORE_ROWS) { result = NO_MORE_ROWS; } else { result = FAIL; } } if (result == REG_ROW) { /* * The data is in the row buffer, now transfer it to the * bound variables */ buffer_transfer_bound_data(&(dbproc->row_buf), dbproc, dbproc->row_buf.next_row); dbproc->row_buf.next_row++; } } tdsdump_log(TDS_DBG_FUNC, "%L leaving dbnextrow() returning %d\n",result); return result;} /* dbnextrow() */static int _db_get_server_type(int bindtype){ switch (bindtype) { case CHARBIND: case STRINGBIND: case NTBSTRINGBIND: return SYBCHAR; break; case FLT8BIND: return SYBFLT8; break; case REALBIND: return SYBREAL; break; case INTBIND: return SYBINT4; break; case SMALLBIND: return SYBINT2; break; case TINYBIND: return SYBINT1; break; case DATETIMEBIND: return SYBDATETIME; break; case SMALLDATETIMEBIND: return SYBDATETIME4; break; case MONEYBIND: return SYBMONEY; break; case SMALLMONEYBIND: return SYBMONEY4; break; case BINARYBIND: return SYBBINARY; break; case VARYCHARBIND: return SYBVARCHAR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -