Exemple #1
0
bool command::process(term & t)
{
	bool ret = false;
	term resp;
#ifdef PRINTCMD
	char * tmpbuf = print_term(command);
	REMOTE_LOG(DBG, "========================================\nCOMMAND : %s %s\n========================================\n",
		CMD_NAME_STR(ERL_INT_VALUE(cmd)),
		tmpbuf);
	delete tmpbuf;
#endif

	if(t.is_tuple() && t[1].is_integer()) {
        int cmd = t[1].v.i;
		resp.tuple();
		resp.add(t[0]);
		resp.insert().integer(cmd);
        if((t.length() - 1) != (size_t)CMD_ARGS_COUNT(cmd)) {
			term & _t = resp.insert().tuple();
	    	_t.insert().atom("error");
	    	_t.insert().atom("badarg");
	    	if(resp.is_undef())
                REMOTE_LOG(ERR, "ERROR badarg %s expected %d, got %d\n", CMD_NAME_STR(cmd)
                    , CMD_ARGS_COUNT(cmd), (t.length() - 1));
	        if(resp.is_undef()) REMOTE_LOG(CRT, "driver error: no resp generated, shutting down port\n");
            vector<unsigned char> respv = tc.encode(resp);
            p.write_cmd(respv);
	    } else {
		    switch(cmd) {
            case RMOTE_MSG:	ret = change_log_flag(t, resp);	break;
            case GET_SESSN:	ret = get_session(t, resp);		break;
            case PUT_SESSN:	ret = release_conn(t, resp);	break;
		    case CMT_SESSN:	ret = commit(t, resp);			break;
            case RBK_SESSN:	ret = rollback(t, resp);		break;
            case CMD_DSCRB:	ret = describe(t, resp);		break;
            case PREP_STMT:	ret = prep_sql(t, resp);		break;
            case BIND_ARGS:	ret = bind_args(t, resp);		break;
            case EXEC_STMT:	ret = exec_stmt(t, resp);		break;
            case FTCH_ROWS:	ret = fetch_rows(t, resp);		break;
            case CLSE_STMT:	ret = close_stmt(t, resp);		break;
            case GET_LOBDA:	ret = get_lob_data(t, resp);	break;
            case CMD_ECHOT:	ret = echo(t, resp);			break;
		    case SESN_PING:	ret = ping(t, resp);			break;
            default:
		    	ret = true;
                break;
            }
        }
    }

	return ret;
}
Exemple #2
0
// START FUNC DECL
int ylc_check(
    )
// STOP FUNC DECL
{
  int status =  0;
  char *mode = NULL;
  int num_lists = 0; char **lists = NULL;
  FLD_REC_TYPE fld_rec;    int fld_id;
  FLD_REC_TYPE nn_fld_rec; int nn_fld_id;
#define NUM_MODES 4
  long long mode_cnt[NUM_MODES];
  int mode_fld_id[NUM_MODES];

  mode = malloc(16); 
  /* Make sure that all flds referenced are Q fields */
  status = fetch_rows(g_db, "list", "name", "", "order by id", 
		      (void **)&lists, &num_lists);
  cBYE(status);
  if ( num_lists == 0 ) { fprintf(stderr, "Nothing to check\n"); goto BYE; } 
  for ( int i = 0; i < num_lists; i++ ) {
    int tbl_id, xlist_id, list_id, num_in_list;
    status = get_list_id(lists[i], &list_id, &tbl_id, &xlist_id); cBYE(status);
    char *list_name = lists[i];
    status = get_num_in_list(list_id, &num_in_list); cBYE(status);
    if ( num_in_list == 0 ) { continue; } 
    for ( int position = 1; position <= num_in_list; position++ ) {
      for ( int mode_idx = 0; mode_idx < NUM_MODES; mode_idx++ ) {
	switch ( mode_idx ) { 
	case 0 : strcpy(mode, ""); break; 
	case 1 : strcpy(mode, "new_"); break; 
	case 2 : strcpy(mode, "xcl_"); break; 
	case 3 : strcpy(mode, "lmt_"); break; 
	default : go_BYE(-1); break;
	}
	char *fld = NULL; long long cnt; int fld_id;
	status = get_fld_name(list_id, position, mode, &fld); cBYE(status);
	if ( fld == NULL ) { go_BYE(-1); }
        status = get_fld_cnt(list_id, position, mode, &cnt); cBYE(status);
        mode_cnt[mode_idx] = cnt;
        status = get_fld_id(list_id, position, mode, &fld_id); cBYE(status);
        mode_fld_id[mode_idx] = fld_id;
	status = is_fld(NULL, tbl_id, fld, &fld_id, &fld_rec, &nn_fld_id, 
			&nn_fld_rec);
	cBYE(status);
	if ( fld_id < 0 ) { 
	  fprintf(stderr, "MISSING! List %s, Pos = %d, Mode = %s, Fld [%s]\n", 
		  lists[i], position, mode, fld); 
	  continue;
	}
	if ( fld_rec.fldtype != B ) { go_BYE(-1); }
	free_if_non_null(fld); 
      }
      for ( int i = 1; i < NUM_MODES; i++ ) {
	if ( ( mode_cnt[i] > 0 ) && ( mode_cnt[i-1] > 0 ) ) {
	  if ( mode_cnt[i] == mode_cnt[i-1] ) { 
	    if ( mode_fld_id[i] != mode_fld_id[i-1] ) {
	    fprintf(stderr, "Error for List %s Position %d Mode %d \n",
		list_name, position, i); 
	    fprintf(stderr, "cnt[%d] = %lld, cnt[%d] = %lld \n",
		i, mode_cnt[i], i-1, mode_cnt[i-1]);
	    fprintf(stderr, "fld_id[%d] = %d, fld_id[%d] = %d \n",
		i, mode_fld_id[i], i-1, mode_fld_id[i-1]);
	    }
	  }
	  else if ( mode_cnt[i] > mode_cnt[i-1] ) { 
	    fprintf(stderr, "Error for List %s Position %d Mode %d \n",
		list_name, position, i); 
	    fprintf(stderr, "cnt[%d] = %lld, cnt[%d] = %lld \n",
		i, mode_cnt[i], i-1, mode_cnt[i-1]);
	    fprintf(stderr, "fld_id[%d] = %d, fld_id[%d] = %d \n",
		i, mode_fld_id[i], i-1, mode_fld_id[i-1]);
	    go_BYE(-1); 
	  }
	}
      }
    }
  }
  fprintf(stderr, "All checks passed\n");
 BYE:
  if ( num_lists > 0 ) { 
    for ( int i = 0; i < num_lists; i++ ) { 
      if ( lists != NULL ) { free_if_non_null(lists[i]); }
    }
  }
  free_if_non_null(lists);
  free_if_non_null(mode);
  return(status);
}