示例#1
0
    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;
    }
示例#2
0
    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;
    }
示例#3
0
	inline bool is_eob() const { return bytes_left()==0; }
 bool full() const 
 {
     return bytes_left() == 0;
 }
示例#5
0
文件: stream.c 项目: RQZeng/freetds
/*
 * 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);
}
示例#6
0
文件: stream.c 项目: RQZeng/freetds
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;
}