コード例 #1
0
caddr_t
arithm_dt_subtract (ccaddr_t box1, ccaddr_t box2, caddr_t *err_ret)
{
  dtp_t dtp1 = DV_TYPE_OF (box1), dtp2 = DV_TYPE_OF (box2);
  if ((DV_DATETIME == dtp1) && (DV_DATETIME == dtp2))
    {
      boxint s1 = DT_CAST_TO_TOTAL_SECONDS(box1);
      boxint s2 = DT_CAST_TO_TOTAL_SECONDS(box2);
      int frac1 = DT_FRACTION(box1);
      int frac2 = DT_FRACTION(box2);
      if (frac1 == frac2)
        return box_num (s1 - s2);
      else
        {
          numeric_t res = numeric_allocate ();
          numeric_from_int64 (res, ((s1 - s2) * 1000000000L) + (frac1 - frac2));
          res->n_len -= 9;
          res->n_scale += 9;
          return (caddr_t)res;
        }
    }
  if ((DV_DATETIME == dtp1) && ((DV_LONG_INT == dtp2) || (DV_DOUBLE_FLOAT == dtp2) || (DV_NUMERIC == dtp2)))
    {
      caddr_t res = arithm_dt_add_num (box1, box2, 1, err_ret);
      if (NULL != err_ret)
        return res;
      if (NULL == res)
        goto generic_err;
      return res;
    }
generic_err:
  err_ret[0] = srv_make_new_error ("22003", "SR087", "Wrong arguments for datetime arithmetic, can not subtract value of type %d (%s) from value type %d (%s).",
    dtp2, dv_type_title (dtp2), dtp1, dv_type_title (dtp1) );
  return NULL;
}
コード例 #2
0
caddr_t
arithm_dt_add (ccaddr_t box1, ccaddr_t box2, caddr_t *err_ret)
{
  dtp_t dtp1 = DV_TYPE_OF (box1), dtp2 = DV_TYPE_OF (box2);
  if ((DV_DATETIME == dtp1) && ((DV_LONG_INT == dtp2) || (DV_DOUBLE_FLOAT == dtp2) || (DV_NUMERIC == dtp2)))
    {
      caddr_t res = arithm_dt_add_num (box1, box2, 0, err_ret);
      if (NULL != err_ret)
        return res;
      if (NULL == res)
        goto generic_err;
      return res;
    }
  if ((DV_DATETIME == dtp2) && ((DV_LONG_INT == dtp1) || (DV_DOUBLE_FLOAT == dtp1) || (DV_NUMERIC == dtp1)))
    {
      caddr_t res = arithm_dt_add_num (box2, box1, 0, err_ret);
      if (NULL != err_ret)
        return res;
      if (NULL == res)
        goto generic_err;
      return res;
    }
generic_err:
  err_ret[0] = srv_make_new_error ("22003", "SR087", "Wrong arguments for datetime arithmetic, can not add values of type %d (%s) and type %d (%s).",
    dtp1, dv_type_title (dtp1), dtp2, dv_type_title (dtp2) );
  return NULL;
}
コード例 #3
0
caddr_t
bif_date_arg (caddr_t * qst, state_slot_t ** args, int nth, char *func)
{
  caddr_t arg = bif_arg (qst, args, nth, func);
  dtp_t dtp = DV_TYPE_OF (arg);
  if (dtp != DV_DATETIME && dtp != DV_BIN)
    sqlr_new_error ("22007", "DT001",
	"Function %s needs a datetime, date or time as argument %d, not an arg of type %s (%d)",
	func, nth + 1, dv_type_title (dtp), dtp);
  return arg;
}
コード例 #4
0
void
row_print_wide (caddr_t thing, dk_session_t * ses, dbe_column_t * col,
    caddr_t * err_ret, dtp_t dtp, wcharset_t * wcharset)
{
  switch (dtp)
    {
      case DV_STRING:
	  if (0 > print_narrow_string_as_wide (ses, (unsigned char *) thing, wcharset))
	    {
	      caddr_t err = NULL;
	      err = srv_make_new_error ("22005", "IN009",
		 "Bad value for wide string column %s, dtp = %d.",
		 col->col_name, dtp);
	      if (err_ret)
		*err_ret = err;
	      else
		sqlr_resignal (err);
	      return;
	    }
	  break;
      case DV_WIDE:
          wide_serialize (thing, ses);
	  break;
      default:
	    {
	      caddr_t err = NULL;
	      err = srv_make_new_error ("22005", "IN011",
		 "Bad value for wide string column %s, type=%s.", col->col_name, dv_type_title (dtp));
	      if (err_ret)
		*err_ret = err;
	      else
		sqlr_resignal (err);
	    }
	  break;

    }
}