Beispiel #1
0
static void handle_get(tcp_client* c, struct evbuffer* buffer) {
	int ksize;
	char k[MAX_TRANSACTION_SIZE];
	val* v;
	struct evbuffer* b = evbuffer_copy(buffer);
	evbuffer_remove(b, &ksize, sizeof(int));
	evbuffer_remove(b, k, ksize);
	transaction_set_get_cb(c->t, on_get, c);
	v = execute_get(c->t, k, ksize);
	if (v != NULL) {
		evbuffer_drain(buffer, evbuffer_get_length(buffer));
		send_get_result(c, v);
		val_free(v);
	}
	evbuffer_free(b);
}
Beispiel #2
0
/**
 ** rockse <path_to_tbl> <path_to_log>
 **/
int main(int argc, char **argv) {
  rockse * ptr;

  ETERM *from_erl;
  ETERM *cmd;
  ETERM *key;
  ETERM *value;

  char *ret;
  ETERM *to_send;

  byte buf[1024];
  int length;

  log = fopen(argv[2], "a+");

  erl_init(NULL, 0);
  fprintf(log, "*** rockse opening table %s\n", argv[1]);
  ptr = open(argv[1]);

  while (read_cmd(buf) > 0) {

    from_erl = erl_decode(buf);
    fprintf(log, "  rockse command type %d\n", ERL_TYPE(from_erl));
 
    if (match_close(from_erl)) {
      send_bok();
      fprintf(log, "   rockse command +close+ sent\n");
      break; 
    }

    if (ERL_IS_TUPLE(from_erl) && ERL_TUPLE_SIZE(from_erl) == 3) {
      /* can only be a {put, key, val} */
      cmd = ERL_TUPLE_ELEMENT(from_erl, 0);

      if (match_put(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);
	value = ERL_TUPLE_ELEMENT(from_erl, 2);

	fprintf(log, "   rockse command +put+ %s %s sent\n", erl_iolist_to_string(key), erl_iolist_to_string(value));

	put(ptr, erl_iolist_to_string(key), erl_iolist_to_string(value));
	send_put_ok();
      }
      erl_free_term(from_erl);
      erl_free_term(cmd);
      erl_free_term(key);
      erl_free_term(value);
    }
    if (ERL_IS_TUPLE(from_erl) && ERL_TUPLE_SIZE(from_erl) == 2) {
      /* can only be a {get, key} or {delete, key} */
      cmd = ERL_TUPLE_ELEMENT(from_erl, 0);
      if (match_get(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);

	fprintf(log, "   rockse command +get+ %s sent\n", erl_iolist_to_string(key));

	ret = get(ptr, erl_iolist_to_string(key));
	if (ret == NULL) {
	  send_nok();
	}
	else {
	  length = strlen(ret);

	  fprintf(log, "   rockse command +get+ found %s of size %d\n", ret, length);

	  to_send = erl_format("{ok, get, ~s}", ret);
	  send_get_result(to_send);
	  free(ret);
	}
      }
      else if (match_delete(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);

	fprintf(log, "   rockse command +delete+ %s sent\n", erl_iolist_to_string(key));

	delete(ptr, erl_iolist_to_string(key));
	send_delete_ok();
      }

      erl_free_term(from_erl);
      erl_free_term(cmd);
      erl_free_term(key);
    }


    fflush(log);
  }

  close_and_destroy(ptr);
  fprintf(log, "*** rockse closing table %s\n", argv[1]);

  erl_free_term(from_erl);

  fclose(log);

  return 0;
}