self& operator()(std::vector<char>& val) { uint16_t len; (*this)(len); if (len == 0) return *this; if (bytes_left() < len) throw serialize_error("end of array reached"); val.resize(len); std::copy(cursor_, cursor_ + len, &*val.begin()); std::advance(cursor_, len); return *this; }
self& operator()(std::string& val) { uint16_t len; (*this)(len); if (len == 0) return *this; if (bytes_left() < len) { assert(false); throw std::runtime_error("end of string reached"); } val.resize(len); std::copy(cursor_, cursor_ + len, val.begin()); std::advance(cursor_, len); return *this; }
inline bool is_eob() const { return bytes_left()==0; }
bool full() const { return bytes_left() == 0; }
/* * TDS 5 style result sets */ static int read_result(TDS_POOL_MEMBER * pmbr, const unsigned char *buf, int maxlen, int *bytes_read) { TDS_SMALLINT hdrsize; int pos = 0; int namelen; int col; TDSSOCKET *tds = pmbr->tds; int num_cols; TDSCOLUMN *curcol; TDSRESULTINFO *info; if (bytes_left(pmbr, buf, pos, maxlen, 3)) { *bytes_read = maxlen; return 0; } /* FIX ME -- endian */ hdrsize = buf[1] + buf[2] * 256; pos += 3; /* read number of columns and allocate the columns structure */ num_cols = buf[pos] + buf[pos+1] * 256; pos += 2; tds_free_all_results(tds); tds->res_info = tds_alloc_results(num_cols); info = pmbr->tds->res_info; /* * loop through the columns populating COLINFO struct from * server response */ for (col = 0; col < info->num_cols; col++) { curcol = info->columns[col]; namelen = buf[pos++]; strncpy(curcol->column_name, (char *) &buf[pos], namelen); curcol->column_name[namelen] = '\0'; pos += namelen; curcol->column_namelen = namelen; pos++; /* flags */ pos += 4; /* user type */ tds_set_column_type(tds->conn, curcol, (int)buf[pos]); switch(curcol->column_varint_size) { /* FIX ME - endian */ case 2: curcol->column_size = buf[pos] + buf[pos+1]*256; break; case 1: curcol->column_size = buf[pos]; break; case 0: break; } pos+=curcol->column_varint_size; if (is_numeric_type(curcol->column_type)) pos+=2; /* skip locale information */ pos += buf[pos]; } return tds_alloc_row(info); }
static int read_col_name(TDS_POOL_MEMBER * pmbr, const unsigned char *buf, int maxlen, int *bytes_read) { TDS_SMALLINT hdrsize; int pos = 0; int num_cols = 0; int namelen; struct tmp_col_struct *head = NULL, *cur = NULL, *prev; int col; TDSCOLUMN *curcol; TDSRESULTINFO *info; /* header size */ if (bytes_left(pmbr, buf, pos, maxlen, 3)) { *bytes_read = maxlen; return 0; } /* FIXME -- endian */ hdrsize = buf[1] + buf[2] * 256; pos += 3; for (;;) { prev = cur; cur = (struct tmp_col_struct *) malloc(sizeof(struct tmp_col_struct)); cur->next = NULL; cur->column_name = NULL; if (prev) prev->next = cur; if (!head) head = cur; if (bytes_left(pmbr, buf, pos, maxlen, 1)) { *bytes_read = maxlen; free_col_struct(head); return 0; } namelen = buf[pos++]; if (bytes_left(pmbr, buf, pos, maxlen, namelen)) { *bytes_read = maxlen; free_col_struct(head); return 0; } cur->column_name = (char *) malloc(namelen + 1); strncpy(cur->column_name, (char *) &buf[pos], namelen); cur->column_name[namelen] = '\0'; pos += namelen; num_cols++; if (pos >= hdrsize) break; } tds_free_all_results(pmbr->tds); pmbr->tds->res_info = tds_alloc_results(num_cols); info = pmbr->tds->res_info; cur = head; for (col = 0; col < info->num_cols; col++) { curcol = info->columns[col]; strncpy(curcol->column_name, cur->column_name, sizeof(curcol->column_name)); /* FIXME ucs2 client and others */ curcol->column_name[sizeof(curcol->column_name) - 1] = 0; curcol->column_namelen = strlen(curcol->column_name); prev = cur; cur = cur->next; free(prev->column_name); free(prev); } *bytes_read = pos; return 1; }