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

📄 dblib.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -