46 #include <freetds/tds.h>
47 #include <freetds/bytes.h>
48 #include <freetds/iconv.h>
49 #include <freetds/replacements.h>
50 #include <freetds/checks.h>
51 #include <freetds/tls.h>
54 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
73 while ((packet =
conn->packet_cache) !=
NULL) {
74 --
conn->num_cached_packets;
88 packet->
next = to_free;
112 if (
conn->num_cached_packets >= 8) {
121 conn->packet_cache = packet;
122 conn->num_cached_packets += count;
124 #if ENABLE_EXTRA_CHECKS
126 for (packet =
conn->packet_cache; packet; packet = packet->
next)
143 if (!packet)
goto Memory_Error;
149 assert(packet->data_start == 0);
167 if (
conn->recv_pos <
sizeof(mars_header)) {
168 packet->
data_len =
sizeof(mars_header);
172 memcpy(&mars_header, packet->
buf,
sizeof(mars_header));
179 if (sid < conn->num_sessions) {
185 if (
tds == BUSY_SOCKET) {
210 if (
size !=
sizeof(mars_header))
213 if (size < 0x18 || size > 0xffffu +
sizeof(mars_header))
227 if (
size !=
sizeof(mars_header))
240 conn->recv_packet = packet;
253 if (
conn->recv_pos >= 8) {
259 if (!packet)
goto Memory_Error;
260 conn->recv_packet = packet;
291 tds->recv_wnd =
tds->recv_seq + 4;
296 start = (
char*) p - (
char *) mars;
300 memcpy(packet->
buf, mars, start);
311 p_packet = &((*p_packet)->next);
318 unsigned char buf[8];
328 packet = tds_build_packet(
tds,
buf, 8);
333 tds_append_packet(&
tds->
conn->send_packets, packet);
380 int sid = tds_packet_write(
conn);
388 if (sid < conn->num_sessions) {
389 s =
conn->sessions[sid];
390 if (TDSSOCKET_VALID(s))
404 if (!tds_packet_read(
conn,
tds))
406 packet =
conn->recv_packet;
413 if (packet->
sid <
conn->num_sessions) {
414 s =
conn->sessions[packet->
sid];
415 if (TDSSOCKET_VALID(s)) {
420 tds_append_packet(&
conn->packets, packet);
447 tds->sending_packet = packet;
448 while (
tds->sending_packet) {
457 if (packet && (
int32_t) (
tds->send_seq -
tds->send_wnd) < 0) {
471 tds->recv_wnd =
tds->recv_seq + 4;
476 tds_append_packet(&
conn->send_packets, packet);
481 if (!
conn->in_net_tds) {
482 tds_connection_network(
conn,
tds, packet ? 0 : 1);
483 if (
tds->sending_packet)
495 if (wait_res != ETIMEDOUT)
544 for (p_packet = &
conn->packets; *p_packet; p_packet = &(*p_packet)->
next)
545 if ((*p_packet)->sid ==
tds->sid)
551 *p_packet = packet->
next;
565 tds_update_recv_wnd(
tds,
tds->recv_seq + 4);
571 if (!
conn->in_net_tds) {
572 tds_connection_network(
conn,
tds, 0);
578 if (wait_res != ETIMEDOUT)
592 unsigned char *pkt =
tds->
in_buf, *p, *end;
601 for (p = pkt, end = p+8; p < end;) {
666 tds->recv_wnd = new_recv_wnd;
670 tds_append_packet(&
tds->
conn->send_packets, packet);
690 tds->recv_wnd =
tds->recv_seq + 4;
700 tds_append_packet(&
tds->
conn->send_packets, packet);
743 unsigned int left = 0;
748 #if !ENABLE_ODBC_MARS
792 res = tds_connection_put_packet(
tds, pkt);
813 #if !ENABLE_ODBC_MARS
817 unsigned char out_buf[8];
851 if (
conn->send_pos == 0)
859 final = packet->
buf[1] & 1;
864 packet->data_start + packet->
data_len -
conn->send_pos,
final);
873 conn->send_pos += sent;
875 if (
conn->send_pos >= packet->data_start + packet->
data_len) {
880 if (TDSSOCKET_VALID(
tds) &&
tds->sending_packet == packet)
1005 unsigned pos = freeze->
pkt_pos;
1006 unsigned size_len = freeze->
size_len;
1017 }
while (--size_len);
1035 #if !ENABLE_ODBC_MARS
1054 #if ENABLE_ODBC_MARS
1058 rc = tds_connection_put_packet(
tds, pkt);
1062 last_pkt_sent = pkt;
1065 while (
next->next) {
1084 #if !ENABLE_ODBC_MARS
1085 if (last_pkt_sent) {
static CS_CONNECTION * conn
#define TDS_PUT_A4LE(ptr, val)
#define TDS_GET_A2BE(ptr)
#define TDS_GET_A2LE(ptr)
#define TDS_GET_A4LE(ptr)
#define TDS_PUT_A2LE(ptr, val)
#define TDS_PUT_A2BE(ptr, val)
#define TDS_PUT_A4(ptr, val)
#define TDS_PUT_A2(ptr, val)
#define CHECK_TDS_EXTRA(tds)
#define TDS_MARK_UNDEFINED(ptr, len)
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
#define TDS_ADDITIONAL_SPACE
tds_sysdep_uint32_type TDS_UINT
#define tds_mutex_lock(x)
#define tds_mutex_unlock(x)
static void tds_ssl_deinit(TDSCONNECTION *conn)
#define tds_connection_write
#define tds_connection_close
#define tds_connection_read
#define tds_realloc_packet
#define tds_extra_assert(cond)
#define CHECK_FREEZE_EXTRA(freeze)
#define tds_packet_zero_data_start(pkt)
#define tds_packet_get_data_start(pkt)
static void tds_set_current_send_packet(TDSSOCKET *tds, TDSPACKET *pkt)
#define tds_cond_timedwait
#define tds_mutex_check_owned(mtx)
#define tds_append_cancel
unsigned int
A callback function used to compare two keys in a database.
unsigned int tds_freeze_written(TDSFREEZE *freeze)
Compute how many bytes has been written from freeze.
TDSRET tds_freeze_close_len(TDSFREEZE *freeze, int32_t size)
Stop keeping data for this specific freeze.
static void tds_freeze_update_size(const TDSFREEZE *freeze, int32_t size)
int tds_read_packet(TDSSOCKET *tds)
Read in one 'packet' from the server.
TDSRET tds_write_packet(TDSSOCKET *tds, unsigned char final)
TDSRET tds_freeze_close(TDSFREEZE *freeze)
Stop keeping data for this specific freeze.
void tds_freeze(TDSSOCKET *tds, TDSFREEZE *freeze, unsigned size_len)
Stop writing to server and cache every packet not sending them to server.
TDSRET tds_freeze_abort(TDSFREEZE *freeze)
Discard all data written after the freeze.
int tds_put_cancel(TDSSOCKET *tds)
static void tds_packet_cache_add(TDSCONNECTION *conn, TDSPACKET *packet)
TDS_COMPILE_CHECK(additional, TDS_ADDITIONAL_SPACE !=0)
static TDSPACKET * tds_get_packet(TDSCONNECTION *conn, unsigned len)
const struct ncbi::grid::netcache::search::fields::SIZE size
unsigned int encrypt_single_packet
TDSSOCKET * tds
which socket we refer to
unsigned pkt_pos
position in pkt
unsigned size_len
length size (0, 1, 2 or 4)
TDSPACKET * pkt
first packet frozen
unsigned data_len
data length, this does not account SMP header, only TDS part
Information for a server connection.
unsigned in_len
input buffer length
TDSPACKET * frozen_packets
list of packets frozen, points to first one.
TDSLOGIN * login
config for login stuff.
unsigned out_pos
current position in out_buf
unsigned char * out_buf
Output buffer.
unsigned char in_flag
input buffer type
TDSPACKET * send_packet
packet we are preparing to send
unsigned char * in_buf
Input buffer.
unsigned char out_flag
output buffer type
unsigned in_pos
current position in in_buf
volatile unsigned char in_cancel
indicate we are waiting a cancel reply; discard tokens till acknowledge; 1 mean we have to send cance...
unsigned int out_buf_max
Maximum size of packet pointed by out_buf.