Exemplo n.º 1
0
char *CACObject :: GetExtent (int32 indx0 )
{
  char       *extentnames = NULL;
  char       *results     = NULL;
#ifndef IF_Class  // client version

  if ( IsValid() )
  {
    if ( !csconnection )                                 
      SDBSET(517)
    else
    {
      LockSendParms().Fill(indx0);
    
      if ( !CConnection()->SendCSMessage(this,S_CACObject,SF_CACObject_GetExtent_ci) )
        if ( extentnames = (char *)Get_rec_result()[0].GetString() )
          results = set_result_string(extentnames,RET_STR_LEN);
      UnlockSendParms();
    }
  }
  return(results);
  
#else             // server version
  
  extentnames = ((SC_DBObject *)cso_ptr)->GetExtent(
                  (*parms)[0].GetLong(connection->get_conversion())
               );
   
  result->Fill(extentnames);

  return(NO);

#endif

}
Exemplo n.º 2
0
static int do_concat(interp_t *interp, expr_t *e1, expr_t *e2)
{
    char *out;
    unsigned int len = 0;
    int result = 0;
    var_t v1, v2;
    
    v1.type = v2.type = VAR_NULL;

    if (!cgc_eval_expression(interp, e1))
        goto fail;

    move_var(&v1, &interp->result);

    if (!cgc_eval_expression(interp, e2))
        goto fail;

    move_var(&v2, &interp->result);

    if (v1.type == VAR_STRING)
        len += cgc_strlen(v1.v_string.value) + 1;
    else if (v1.type == VAR_NUMBER || v1.type == VAR_NULL)
        len += 20;
    else
        goto fail;

    if (v2.type == VAR_STRING)
        len += cgc_strlen(v2.v_string.value) + 1;
    else if (v2.type == VAR_NUMBER || v2.type == VAR_NULL)
        len += 20;
    else
        goto fail;

    out = cgc_malloc(len);
    if (out == NULL)
        goto fail;

    if (v1.type == VAR_STRING)
        cgc_sprintf(out, "%s", v1.v_string.value);
    else if (v1.type == VAR_NUMBER)
        cgc_sprintf(out, "%d", v1.type == VAR_NUMBER ? v1.v_number.value : 0);
    else
        out[0] = 0;

    if (v2.type == VAR_STRING)
        cgc_sprintf(out + cgc_strlen(out), "%s", v2.v_string.value);
    else if (v2.type == VAR_NUMBER)
        cgc_sprintf(out + cgc_strlen(out), "%d", v2.type == VAR_NUMBER ? v2.v_number.value : 0);

    result = set_result_string(interp, out);

fail:
    cgc_free_var(&v1);
    cgc_free_var(&v2);
    return result;
}
Exemplo n.º 3
0
logical CACObject :: ExecObjCtxFunc (char *fnames, char *w_parms )
{
  logical      term = YES;
#ifndef IF_Class  // client version

  if ( IsValid() )
  {
    if ( !csconnection )                                 
      SDBSET(517)
    else
    {
      LockSendParms().Fill(fnames,w_parms);
      if ( !CConnection()->SendCSMessage(this,S_CACObject,SF_CACObject_ExecObjCtxFunc_ci) )
        if ( !(term = Get_rec_result()[0].GetUChar()) )
        {
          set_result_string(Get_rec_result()[1].GetString(),UNDEF);
          term = ACObject::ExecObjCtxFunc(fnames,w_parms);  // Client kann Ergebnis überschreiben
        }
      UnlockSendParms();
    }
  }
  return(term);
  
#else             // server version
  
  SC_DBObject    *sc_dbo     = (SC_DBObject *)cso_ptr;
  char           *result_str = NULL;
  
  if ( !(term =  sc_dbo->ExecuteDBObjectAction(
                      (*parms)[0].GetString(),
                      (*parms)[0].GetString()   )) )
    result_str = sc_dbo->GetActionResult();
   
  result->Fill(term,result_str);

  return(NO);

#endif

}
Exemplo n.º 4
0
static int cgc_eval_expression(interp_t *interp, expr_t *expr)
{
    const char *s;
    int i, t1, t2;
    var_t tmp;

#ifdef PATCHED
    if (expr == NULL)
        return 0;
#endif

    switch(expr->op)
    {
    case OP_CONST_STRING:
        if (!set_result_string(interp, cgc_strdup(expr->e_cstring.value)))
            return 0;
        break;
    case OP_CONST_INT:
        if (!set_result_number(interp, expr->e_cint.value))
            return 0;
        break;
    case OP_FIELD:
        s = cgc_get_field(interp, expr->e_cint.value);
        if (s == NULL)
            return 0;
        if (!set_result_string(interp, cgc_strdup(s)))
            return 0;
        break;
    case OP_FIELD_VAR:
        if (!get_number(interp, expr->e_var.name, &i))
            return 0;
        s = cgc_get_field(interp, i);
        if (s == NULL)
            return 0;
        if (!set_result_string(interp, cgc_strdup(s)))
            return 0;
        break;
    case OP_VAR:
        if (!set_result_var(interp, get_var(interp, expr->e_var.name)))
            return 0;
        break;
    case OP_ASSIGN:
        if (!cgc_eval_expression(interp, expr->e_binop.rhs))
            return 0;
        // set lhs to interp->result
        if (!cgc_assign_result(interp, expr->e_binop.lhs))
            return 0;
        break;
    case OP_CONDITIONAL:
        if (!cgc_eval_expression(interp, expr->e_cond.cond))
            return 0;
        if (coerce_bool(interp, &interp->result))
        {
            if (!cgc_eval_expression(interp, expr->e_cond.vtrue))
                return 0;
        }
        else
        {
            if (!cgc_eval_expression(interp, expr->e_cond.vfalse))
                return 0;
        }
        break;
    case OP_OR:
        if (!cgc_eval_expression(interp, expr->e_binop.lhs))
            return 0;
        if (coerce_bool(interp, &interp->result))
        {
            if (!set_result_number(interp, TRUE))
                return 0;
        }
        else
        {
            if (!cgc_eval_expression(interp, expr->e_binop.rhs))
                return 0;
            if (!set_result_number(interp,
                    coerce_bool(interp, &interp->result) ? TRUE : FALSE))
                return 0;
        }
        break; 
    case OP_AND:
        if (!cgc_eval_expression(interp, expr->e_binop.lhs))
            return 0;
        if (!coerce_bool(interp, &interp->result))
        {
            if (!set_result_number(interp, FALSE))
                return 0;
        }
        else
        {
            if (!cgc_eval_expression(interp, expr->e_binop.rhs))
                return 0;
            if (!set_result_number(interp,
                    coerce_bool(interp, &interp->result) ? TRUE : FALSE))
                return 0;
        }
        break; 
    case OP_MATCH:
    case OP_NOT_MATCH:
        if (!cgc_do_match(interp, expr->e_binop.lhs, expr->e_binop.rhs))
            return 0;
        if (expr->op == OP_NOT_MATCH)
            interp->result.v_number.value = interp->result.v_number.value == TRUE ? FALSE : TRUE;
        break;
    case OP_CONST_REGEXP:
        if (!cgc_do_match(interp, NULL, expr))
            return 0;
        break;
    case OP_LT:
    case OP_GT:
    case OP_LTE:
    case OP_GTE:
    case OP_EQ:
    case OP_NEQ:
        if (!cgc_eval_expression(interp, expr->e_binop.lhs))
            return 0;
        move_var(&tmp, &interp->result);
        if (!cgc_eval_expression(interp, expr->e_binop.rhs))
            return 0;
        t1 = compare_value(&tmp, &interp->result);
        if ((expr->op == OP_LT && t1 < 0) ||
            (expr->op == OP_GT && t1 > 0) ||
            (expr->op == OP_LTE && t1 <= 0) ||
            (expr->op == OP_GTE && t1 >= 0) ||
            (expr->op == OP_EQ && t1 == 0) ||
            (expr->op == OP_NEQ && t1 != 0))
        {
            if (!set_result_number(interp, TRUE))
                return 0;
        }
        else
        {
            if (!set_result_number(interp, FALSE))
                return 0;
        }
        cgc_free_var(&tmp);
        break;
    case OP_ADD:
    case OP_ASSIGN_ADD:
    case OP_SUB:
    case OP_ASSIGN_SUB:
    case OP_MUL:
    case OP_ASSIGN_MUL:
    case OP_DIV:
    case OP_ASSIGN_DIV:
    case OP_MOD:
    case OP_ASSIGN_MOD:
        if (!cgc_eval_expression(interp, expr->e_binop.lhs))
            return 0;
        t1 = coerce_number(interp, &interp->result);
        if (!cgc_eval_expression(interp, expr->e_binop.rhs))
            return 0;
        t2 = coerce_number(interp, &interp->result);
        if (expr->op == OP_ADD || expr->op == OP_ASSIGN_ADD)
            t1 = t1 + t2;
        else if (expr->op == OP_SUB || expr->op == OP_ASSIGN_SUB)
            t1 = t1 - t2;
        else if (expr->op == OP_MUL || expr->op == OP_ASSIGN_MUL)
            t1 = t1 * t2;
        else if (expr->op == OP_DIV || expr->op == OP_ASSIGN_DIV)
        {
            if (t2 == 0)
                return 0;
            t1 = t1 / t2;
        }
        else if (expr->op == OP_MOD || expr->op == OP_ASSIGN_MOD)
        {
            if (t2 == 0)
                return 0;
            t1 = t1 % t2;
        }
        if (!set_result_number(interp, t1))
            return 0;

        if (expr->op == OP_ASSIGN_ADD ||
            expr->op == OP_ASSIGN_SUB ||
            expr->op == OP_ASSIGN_MUL ||
            expr->op == OP_ASSIGN_DIV ||
            expr->op == OP_ASSIGN_MOD)
        {
            if (!cgc_assign_result(interp, expr->e_binop.lhs))
                return 0;
        }
        break;
    case OP_INC_PRE:
    case OP_DEC_PRE:
    case OP_INC_POST:
    case OP_DEC_POST:
        if (!cgc_eval_expression(interp, expr->e_unop.expr))
            return 0;
        move_var(&tmp, &interp->result);
        t1 = coerce_number(interp, &tmp);
        if (expr->op == OP_INC_PRE || expr->op == OP_INC_POST)
            t2 = t1 + 1;
        else
            t2 = t1 - 1;
        if (!set_result_number(interp, t2))
            return 0;
        if (!cgc_assign_result(interp, expr->e_unop.expr))
            return 0;

        if (expr->op == OP_INC_POST || expr->op == OP_DEC_POST)
            move_var(&interp->result, &tmp);
        else
            cgc_free_var(&tmp);
        break;
    case OP_NEGATE:
    case OP_NOT:
        if (!cgc_eval_expression(interp, expr->e_unop.expr))
            return 0;
        t1 = coerce_number(interp, &interp->result);
        if (expr->op == OP_NEGATE)
            t2 = -t1;
        else
            t2 = coerce_bool(interp, &interp->result) == TRUE ? FALSE : TRUE;
        if (!set_result_number(interp, t2))
            return 0;
        break;
    case OP_CONCAT:
        if (!do_concat(interp, expr->e_binop.lhs, expr->e_binop.rhs))
            return 0;
        break;
    default:
        return 0;
    }

    return 1;
}