📄 data.c
字号:
/* FreeTDS - Library of routines accessing Sybase and Microsoft databases * Copyright (C) 2003, 2004, 2005 Frediano Ziglio * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#if HAVE_CONFIG_H#include <config.h>#endif /* HAVE_CONFIG_H */#include <stdarg.h>#include <stdio.h>#include <assert.h>#if HAVE_STRING_H#include <string.h>#endif /* HAVE_STRING_H */#include "tds.h"#include "tds_checks.h"#ifdef DMALLOC#include <dmalloc.h>#endifTDS_RCSID(var, "$Id: data.c,v 1.18 2007/06/21 07:21:21 freddy77 Exp $");#if !ENABLE_EXTRA_CHECKSstatic int tds_get_cardinal_type(int datatype);static int tds_get_varint_size(TDSSOCKET * tds, int datatype);#endif/** * Set type of column initializing all dependency * @param curcol column to set * @param type type to set */voidtds_set_column_type(TDSSOCKET * tds, TDSCOLUMN * curcol, int type){ /* set type */ curcol->on_server.column_type = type; curcol->column_type = tds_get_cardinal_type(type); /* set size */ curcol->column_cur_size = -1; curcol->column_varint_size = tds_get_varint_size(tds, type); if (curcol->column_varint_size == 0) curcol->column_cur_size = curcol->on_server.column_size = curcol->column_size = tds_get_size_by_type(type);}/** * Set type of column initializing all dependency * \param tds state information for the socket and the TDS protocol * \param curcol column to set * \param type type to set */voidtds_set_param_type(TDSSOCKET * tds, TDSCOLUMN * curcol, TDS_SERVER_TYPE type){ if (IS_TDS7_PLUS(tds)) { switch (type) { case SYBVARCHAR: type = XSYBVARCHAR; break; case SYBCHAR: type = XSYBCHAR; break; case SYBVARBINARY: type = XSYBVARBINARY; break; case SYBBINARY: type = XSYBBINARY; break; /* avoid warning on other types */ default: break; } } tds_set_column_type(tds, curcol, type); if (is_collate_type(type)) { curcol->char_conv = tds->char_convs[is_unicode_type(type) ? client2ucs2 : client2server_chardata]; memcpy(curcol->column_collation, tds->collation, sizeof(tds->collation)); } /* special case, GUID, varint != 0 but only a size */ /* TODO VARIANT, when supported */ switch (type) { case SYBUNIQUE: curcol->on_server.column_size = curcol->column_size = sizeof(TDS_UNIQUE); break; case SYBBITN: curcol->on_server.column_size = curcol->column_size = sizeof(TDS_TINYINT); break; /* mssql 2005 don't like SYBINT4 as parameter closing connection */ case SYBINT1: case SYBINT2: case SYBINT4: case SYBINT8: curcol->on_server.column_type = SYBINTN; curcol->column_varint_size = 1; curcol->column_cur_size = -1; break; case SYBMONEY4: case SYBMONEY: curcol->on_server.column_type = SYBMONEYN; curcol->column_varint_size = 1; curcol->column_cur_size = -1; break; case SYBDATETIME: case SYBDATETIME4: curcol->on_server.column_type = SYBDATETIMN; curcol->column_varint_size = 1; curcol->column_cur_size = -1; break; case SYBFLT8: case SYBREAL: curcol->on_server.column_type = SYBFLTN; curcol->column_varint_size = 1; curcol->column_cur_size = -1; break; default: break; }}#if !ENABLE_EXTRA_CHECKSstatic#endifinttds_get_cardinal_type(int datatype){ switch (datatype) { case XSYBVARBINARY: return SYBVARBINARY; case XSYBBINARY: return SYBBINARY; case SYBNTEXT: return SYBTEXT; case XSYBNVARCHAR: case XSYBVARCHAR: return SYBVARCHAR; case XSYBNCHAR: case XSYBCHAR: return SYBCHAR; case SYB5INT8: return SYBINT8; } return datatype;}/** * tds_get_varint_size() returns the size of a variable length integer * returned in a TDS 7.0 result string */#if !ENABLE_EXTRA_CHECKSstatic#endifinttds_get_varint_size(TDSSOCKET * tds, int datatype){ switch (datatype) { case SYBTEXT: case SYBNTEXT: case SYBIMAGE: return 4; case SYBVOID: case SYBINT1: case SYBBIT: case SYBINT2: case SYBINT4: case SYBINT8: case SYBDATETIME4: case SYBREAL: case SYBMONEY: case SYBDATETIME: case SYBFLT8: case SYBMONEY4: case SYBSINT1: case SYBUINT2: case SYBUINT4: case SYBUINT8: return 0; } if (IS_TDS7_PLUS(tds)) { switch (datatype) { /* TODO support this strange type */ case SYBVARIANT: return 4; case XSYBCHAR: case XSYBNCHAR: case XSYBNVARCHAR: case XSYBVARCHAR: case XSYBBINARY: case XSYBVARBINARY: return 2; } } else if (IS_TDS50(tds)) { switch (datatype) { case SYBLONGBINARY: case SYBLONGCHAR: return 5; case SYB5INT8: return 0; } } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -