static NEOERR *wdb_load_defn (WDB *wdb, const char *name)
{
  char path[_POSIX_PATH_MAX];
  char line[1024];
  FILE *fp;
  NEOERR *err = STATUS_OK;

  snprintf (path, sizeof(path), "%s.wdf", name);
  fp = fopen (path, "r");
  if (fp == NULL)
  {
    if (errno == ENOENT)
      return nerr_raise (NERR_NOT_FOUND, "Unable to open defn %s", name);
    return nerr_raise_errno (NERR_IO, "Unable to open defn %s", name);
  }

  /* Read Version string */
  if (fgets (line, sizeof(line), fp) == NULL)
  {
    fclose(fp);
    return nerr_raise_errno (NERR_IO, "Unable to read defn %s", name);
  }
  string_rstrip(line);

  if (!strcmp(line, DEFN_VERSION_1))
  {
    err = wdb_load_defn_v1(wdb, fp);
    fclose(fp);
    if (err) return nerr_pass(err);
  }
  else
  {
    fclose(fp);
    return nerr_raise (NERR_ASSERT, "Unknown defn version %s: %s", line, name);
  }

  wdb->table_version = rand();

  return STATUS_OK;
}
static NEOERR *wdb_load_defn_v1 (WDB *wdb, FILE *fp)
{
  char line[1024];
  int state = 1;
  char *k, *v;
  NEOERR *err = STATUS_OK;
  int colindex = 1;
  WDBColumn *col;

  while (fgets(line, sizeof(line), fp) != NULL)
  {
    string_rstrip(line);
    switch (state)
    {
      case STATE_REQUIRED:
	if (!strcmp(line, "attributes"))
	  state = STATE_ATTRIBUTES;
	else if (!strcmp(line, "columns"))
	  state = STATE_COLUMN_DEF;
	else
	{
	  k = line;
	  v = strchr(line, ':');
	  /* HACK */
	  if (!strcmp(k, "name") && ((v == NULL) || (v[1] == '\0')))
	  {
	    v = "dNone";
	  }
	  else 
	  {
	    if (v == NULL)
	      return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	    if (v[1] == '\0')
	      return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	  }
	  v[0] = '\0';
	  v++;
	  if (!strcmp(k, "key"))
	  { 
	    err = wdb_decode_str_alloc (v, &(wdb->key));
	    if (err) return nerr_pass(err);
	  } 
	  else if (!strcmp(k, "name"))
	  {
	    err = wdb_decode_str_alloc (v, &(wdb->name));
	    if (err) return nerr_pass(err);
	  }
	  else if (!strcmp(k, "ondisk"))
	  {
	    wdb->last_ondisk = atoi (v);
	  }
	}
	break;
      case STATE_ATTRIBUTES:
	if (!strcmp(line, "columns"))
	  state = STATE_COLUMN_DEF;
	else
	{
	  k = line;
	  v = strchr(line, ':');
	  if (v == NULL)
	    return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	  v[0] = '\0';
	  v++;
	  err = wdb_decode_str_alloc (k, &k);
	  if (err) return nerr_pass(err);
	  err = wdb_decode_str_alloc (v, &v);
	  if (err) return nerr_pass(err);
	  err = dictSetValue(wdb->attrs, k, v);
	  free(k);
	  if (err)
	    return nerr_pass_ctx(err, "Error parsing %s", line);
	}
	break;
      case STATE_COLUMN_DEF:
	k = line;
	v = strchr(line, ':');
	if (v == NULL)
	  return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	if (v[1] == '\0')
	  return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	v[0] = '\0';
	v++;
	err = wdb_decode_str_alloc (k, &k);
	if (err) return nerr_pass(err);
	col = (WDBColumn *) calloc (1, sizeof (WDBColumn));
	col->name = k;
	col->inmem_index = colindex++;
	col->type = *v;
	v+=2;
	col->ondisk_index = atoi(v);
	err = dictSetValue(wdb->cols, k, col);
	if (err)
	  return nerr_raise (NERR_PARSE, "Error parsing %s", line);
	err = uListAppend(wdb->cols_l, col);
	if (err) return nerr_pass(err);
	/* stupid skiplist will assert */
	if (col->ondisk_index == 0)
	{
	  return nerr_raise (NERR_ASSERT, "Invalid ondisk mapping for %s", k);
	}
	err = skipInsert (wdb->ondisk, col->ondisk_index, 
	    (void *)(col->inmem_index), 0);
	if (err)
	  return nerr_pass_ctx(err, "Unable to update ondisk mapping for %s", k);
	break;
      default:
	return nerr_raise (NERR_ASSERT, "Invalid state %d", state);
    }
  }
  return STATUS_OK;
}
Example #3
0
/* TCP ACCEPT後の処理 */
static void
rpc_accept_main(int sd, short event, void *info) {
	tcp_accept_info_t *acceptinfo = info;
	struct rpc *rpc = acceptinfo->args;
	FILE *sp = acceptinfo->accept_sp;
	char buffer[128] = "";

	if (event == EV_READ) {
		if (fgets(buffer, sizeof(buffer), sp) == NULL) {
			tcp_server_accept_clear(acceptinfo);
			return;
		}
		if (string_rstrip(buffer, "\r\n \t")) {
			fprintf(sp, RESPONSE_INTERNAL_ERROR);
			goto end;
		}
		if (strncmp(
		    buffer,
		    COMMAND_STOP_MONITOR,
		    sizeof(COMMAND_STOP_MONITOR) - 1) == 0 ) {
			alert_cancel(rpc->alert);
			sensor_monitor_stop(rpc->sensor);
			fprintf(sp, RESPONSE_OK);
		} else if (strncmp(
		    buffer,
		    COMMAND_START_MONITOR,
		    sizeof(COMMAND_START_MONITOR) - 1) == 0 ) {
			sensor_monitor_start(rpc->sensor);
			fprintf(sp, RESPONSE_OK);
		} else if (strncmp(
		    buffer,
		    COMMAND_GET_MONITOR_STATUS,
		    sizeof(COMMAND_GET_MONITOR_STATUS) - 1) == 0 ) {
			if (sensor_get_monitor_status(rpc->sensor)) {
				fprintf(sp, RESPONSE_RUNNING);
			} else {
				fprintf(sp, RESPONSE_STOPPING);
			}
		} else if (strncmp(
		    buffer,
		    COMMAND_CANCEL_ALERT,
		    sizeof(COMMAND_CANCEL_ALERT) - 1) == 0 ) {
			alert_cancel(rpc->alert);
			fprintf(sp, RESPONSE_OK);
		} else if (strncmp(
		    buffer,
		    COMMAND_GET_ALERT_STATUS,
		    sizeof(COMMAND_GET_ALERT_STATUS) - 1) == 0 ) {
			switch (alert_get_status(rpc->alert)) {
			case ALERT_STATUS_NO_ALERT:
				fprintf(sp, RESPONSE_GOOD);
				break;
			case ALERT_STATUS_FIRST_ALERT:
				fprintf(sp, RESPONSE_FIRST_ALERT);
				break;
			case ALERT_STATUS_SECOND_ALERT:
				fprintf(sp, RESPONSE_SECOND_ALERT);
				break;
			default:
				ABORT();
				/* NOT REACHED */
			}
		} else if (strncmp(buffer,
		     COMMAND_CLEAR_ALERT_STATUS,
		     sizeof(COMMAND_CLEAR_ALERT_STATUS) - 1) == 0 ) {
			alert_clear_status(rpc->alert);
			fprintf(sp, RESPONSE_OK);
		} else {
			fprintf(stderr, "rpc unknown command.\n");
			fprintf(sp, RESPONSE_UNKNOWN_COMMAND);
		}
	} else if (event == EV_TIMEOUT) {
		fprintf(stderr, "rpc timeout.\n");
		fprintf(sp, RESPONSE_TIMEOUT);
	} else {
		ABORT();        
                /* NOT REACHED */
	}
end:
	fflush(sp);
	tcp_server_accept_clear(acceptinfo);
	return;
}