示例#1
0
	/*}}}*/
};
int
xchar_length (xchar_t ch) /*{{{*/
{
	return utf8_length_tab[ch];
}/*}}}*/
int
xchar_strict_length (xchar_t ch) /*{{{*/
{
	return utf8_strict_length_tab[ch];
}/*}}}*/
int
xchar_valid_position (const xchar_t *s, int length) /*{{{*/
{
# define	VALID(ccc)	(((ccc) & 0xc0) == 0x80)
	int	len, n;
	
	if (((len = xchar_strict_length (*s)) > 0) && (length >= len))
		for (n = len; n > 1; ) {
			--n;
			if (! VALID (*(s + n))) {
				len = -1;
				break;
			}
		}
	else
		len = -1;
	return len;
# undef		VALID	
}/*}}}*/
bool_t
xchar_valid (const xchar_t *s, int length) /*{{{*/
{
	int	n;
	
	while (length > 0)
		if ((n = xchar_valid_position (s, length)) > 0) {
			s += n;
			length -= n;
		} else
			break;
	return length == 0 ? true : false;
}/*}}}*/
const char *
xchar_to_char (const xchar_t *s) /*{{{*/
{
	return (const char *) s;
}/*}}}*/
const xchar_t *
char_2_xchar (const char *s) /*{{{*/
{
	return (const xchar_t *) s;
}/*}}}*/
const char *
byte_to_char (const byte_t *b) /*{{{*/
{
	return (const char *) b;
}/*}}}*/
int
xstrlen (const xchar_t *s) /*{{{*/
{
	int	len, clen;
	
	for (len = 0; *s; ++len) {
		clen = xchar_length (*s);
		while ((clen-- > 0) && *s)
			++s;
	}
	return len;
}/*}}}*/
int
xstrcmp (const xchar_t *s1, const char *s2) /*{{{*/
{
	return strcmp (xchar_to_char (s1), s2);
}/*}}}*/
int
xstrncmp (const xchar_t *s1, const char *s2, size_t n) /*{{{*/
{
	return strncmp (xchar_to_char (s1), s2, n);
}/*}}}*/
bool_t
xmlbuf_equal (xmlbuf_t *b1, xmlbuf_t *b2) /*{{{*/
{
	if ((! b1) && (! b2))
		return true;
	if (b1 && b2 && (b1 -> length == b2 -> length) &&
	    ((! b1 -> length) || (! memcmp (b1 -> buffer, b2 -> buffer, b1 -> length))))
		return true;
	return false;
}/*}}}*/
char *
xmlbuf_to_string (xmlbuf_t *b) /*{{{*/
{
	return buffer_copystring ((buffer_t *) b);
}/*}}}*/
long
xmlbuf_to_long (xmlbuf_t *b) /*{{{*/
{
	const char	*s = b ? buffer_string (b) : NULL;

	return s ? strtol (s, NULL, 0) : -1;
}/*}}}*/
示例#2
0
uvmongo_message_t *
uvmongo_message_serialize_query(uvmongo_cursor_t * cursor) {
  char * data;
  char * ns = buffer_string(cursor->coll->fullname);
  size_t nslen = strlen(ns) + 1;
  size_t bslen = bson_size(cursor->query) + bson_size(cursor->fields);
  size_t msglen = 16 + 4 + nslen + 4 + 4 + bslen;
  uvmongo_message_t * msg = uvmongo_message_new(msglen, 0, 0, OP_QUERY);
  msg->privdata = NULL;
  msg->cursor = cursor;
 
  data = &msg->data;
  data = uvmongo_message_append32(data, &cursor->flag);
  data = uvmongo_message_append(data, ns, nslen);
  data = uvmongo_message_append32(data, &cursor->skip);
  data = uvmongo_message_append32(data, &cursor->limit);
  data = uvmongo_message_append(data, cursor->query->data, bson_size(cursor->query));
  if (cursor->fields) {
    data = uvmongo_message_append(data, cursor->fields->data, bson_size(cursor->fields));
  }
 
  assert(data == ((char*)msg) + sizeof(uvmongo_cursor_t*)
                              + sizeof(uvmongo_document_cb)
                              + sizeof(uvmongo_response_cb)
                              + sizeof(void*)
                              + msg->header.msglen);
  return msg;
}
示例#3
0
uvmongo_message_t *
uvmongo_message_serialize_more(uvmongo_cursor_t * cursor) {
  char * data;
  char * ns = buffer_string(cursor->coll->fullname);
  size_t nslen = strlen(ns) + 1;
  size_t msglen = 16 + 4 + nslen + 4 + 8;
  uvmongo_message_t * msg = uvmongo_message_new(msglen, 0, 0, OP_GET_MORE);
 
  data = &msg->data;
  data = uvmongo_message_append32(data, &ZERO);
  data = uvmongo_message_append(data, ns, nslen);
  data = uvmongo_message_append32(data, &cursor->limit);
  data = uvmongo_message_append64(data, &cursor->id);
  return msg;  
}
示例#4
0
uvmongo_message_t *
uvmongo_message_serialize_delete(buffer_t * fullname, bson * selector) {
  char * data;
  char * ns = buffer_string(fullname);
  size_t nslen = strlen(ns) + 1;
  size_t bslen = bson_size(selector);
  size_t msglen = 16 + 4 + nslen + 4 + bslen;
  uvmongo_message_t * msg = uvmongo_message_new(msglen, 0, 0, OP_DELETE);
 
  data = &msg->data;
  data = uvmongo_message_append32(data, &ZERO);
  data = uvmongo_message_append(data, ns, nslen);
  data = uvmongo_message_append32(data, &ONE);
  data = uvmongo_message_append(data, selector->data, bson_size(selector));
  return msg;
}
示例#5
0
uvmongo_message_t *
uvmongo_message_serialize_insert(buffer_t * fullname, bson * obj) {
  /*
   * FIXME(Yorkie): support batch insert
   */
  char * data;
  char * ns = buffer_string(fullname);
  size_t nslen = strlen(ns) + 1;
  size_t bslen = bson_size(obj);
  size_t msglen = 16 + 4 + nslen + bslen;
  uvmongo_message_t * msg = uvmongo_message_new(msglen, 0, 0, OP_INSERT);
 
  data = &msg->data;
  data = uvmongo_message_append32(data, &ZERO);
  data = uvmongo_message_append(data, ns, nslen);
  data = uvmongo_message_append(data, obj->data, bslen);
  data = &msg->data;
  return msg;
}
示例#6
0
uvmongo_message_t *
uvmongo_message_serialize_update(buffer_t * fullname, bson * selector, 
                                                      bson * setup, 
                                                      uvmongo_update_flags_t flag) {
  char * data;
  char * ns = buffer_string(fullname);
  size_t nslen = strlen(ns) + 1;
  size_t bslen = bson_size(selector) + bson_size(setup);
  size_t msglen = 16 + 4 + nslen + 4 + bslen;
  uvmongo_message_t * msg = uvmongo_message_new(msglen, 0, 0, OP_UPDATE);
 
  data = &msg->data;
  data = uvmongo_message_append32(data, &ZERO);
  data = uvmongo_message_append(data, ns, nslen);
  data = uvmongo_message_append32(data, &flag);
  data = uvmongo_message_append(data, selector->data, bson_size(selector));
  data = uvmongo_message_append(data, setup->data, bson_size(setup));
  return msg;
}
示例#7
0
文件: net.c 项目: flybird119/uv-mongo
void
net_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t buf) {
  net_t * net = (net_t *) handle->data;
  err_t err;

  if (nread < 0) {
    err = uv_last_error(net->loop);
    if (net->error_cb) {
      net->error_cb(net, err, (char *) uv_strerror(err));
    } else {
      printf("error(%s:%d) %s", net->hostname, net->port, (char *) uv_strerror(err));
      net_free(net);
    }
    return;
  }

  /* 
   * BIO Return rule:
   * All these functions return either the amount of data successfully
   * read or written (if the return value is positive) or that no data 
   * was successfully read or written if the result is 0 or -1. If the 
   * return value is -2 then the operation is not implemented in the specific BIO type.
   */
  if (net->use_ssl) {
    net->tls->data = malloc(1);

    tls_bio_write(net->tls, buf.base, nread);
    free(buf.base);

    int read = 0;
    int stat = tls_read(net->tls);
    if (stat == 1) {
      /* 
       * continue: Say hello
       */
      do {
        read = tls_bio_read(net->tls, 0);
        if (read > 0) {
          uv_write_t req;
          uv_buf_t uvbuf = uv_buf_init(net->tls->buf, read);
          uv_write(&req, (uv_stream_t*)net->handle, &uvbuf, 1, NULL);
        }
      } while (read > 0);

    } else if (stat == 0) {
      /*
       * SSL Connection is created
       * Here need to call user-land callback
       */
      uv_read_stop((uv_stream_t*)net->handle);
      if (net->read_cb != NULL) {
        net->read_cb(net, buffer_length(net->tls->buffer),
                          buffer_string(net->tls->buffer));
      }

    } else if (stat == -1) {
      /*
       * Just connection in SSL
       * call `conn_cb`, the ssl connection has been 
       *   established in user-land.
       */
      if (net->conn_cb != NULL) {
        net->conn_cb(net);
      }

    } else {
      /*
       * TODO(Yorkie): HOWTO
       */
    }
    return;
  }

  /*
   * TCP Part, no SSL, just proxy of uv.
   */
  uv_read_stop(handle);
  buf.base[nread] = 0;
  if (net->read_cb != NULL) {
    net->read_cb(net, nread, buf.base);
  }
}