Ejemplo n.º 1
0
static void
class_referenced_by_domain (MOP referenced_class,
			    TP_DOMAIN * const domain,
			    bool * const class_can_be_referenced,
			    bool * const any_class_can_be_referenced)
{
  TP_DOMAIN *crt_domain = NULL;

  assert (domain != NULL);

  for (crt_domain = domain; crt_domain != NULL;
       crt_domain = db_domain_next (crt_domain))
    {
      const DB_TYPE type = db_domain_type (crt_domain);

      if (type == DB_TYPE_OBJECT)
	{
	  DB_OBJECT *class_ = db_domain_class (crt_domain);
	  if (class_ == NULL)
	    {
	      *any_class_can_be_referenced = true;
	    }
	  else if (referenced_class == class_ ||
		   db_is_subclass (referenced_class, class_))
	    {
	      *class_can_be_referenced = true;
	    }
	  else
	    {
	      /* Cannot reference instances of the given class. */
	    }
	}
      else if (pr_is_set_type (type))
	{
	  class_referenced_by_domain (referenced_class,
				      db_domain_set (crt_domain),
				      class_can_be_referenced,
				      any_class_can_be_referenced);
	}
      else
	{
	  /* Cannot reference an object. */
	}

      if (*any_class_can_be_referenced)
	{
	  return;
	}
    }
}
Ejemplo n.º 2
0
/*
 * cursor_fixup_set_vobjs() - if val is a set/seq of vobjs then
 * 			    turn it into a set/seq of vmops
 *   return: NO_ERROR on all ok, ER status( or ER_FAILED) otherwise
 *   val(in/out): a db_value
 */
static int
cursor_fixup_set_vobjs (DB_VALUE * value_p)
{
  DB_TYPE type;
  int rc, i, size;
  DB_VALUE element;
  DB_SET *set, *new_set;

  type = DB_VALUE_TYPE (value_p);
  if (!pr_is_set_type (type))
    {
      return ER_FAILED;
    }

  set = DB_GET_SET (value_p);
  size = db_set_size (set);

  if (cursor_has_set_vobjs (set) == false)
    {
      return set_convert_oids_to_objects (set);
    }

  switch (type)
    {
    case DB_TYPE_SET:
      new_set = db_set_create_basic (NULL, NULL);
      break;
    case DB_TYPE_MULTISET:
      new_set = db_set_create_multi (NULL, NULL);
      break;
    case DB_TYPE_SEQUENCE:
      new_set = db_seq_create (NULL, NULL, size);
      break;
    default:
      return ER_FAILED;
    }

  /* fixup element vobjs into vmops and add them to new */
  for (i = 0; i < size; i++)
    {
      if (db_set_get (set, i, &element) != NO_ERROR)
	{
	  db_set_free (new_set);
	  return ER_FAILED;
	}

      if (cursor_fixup_vobjs (&element) != NO_ERROR)
	{
	  db_set_free (new_set);
	  return ER_FAILED;
	}

      if (type == DB_TYPE_SEQUENCE)
	{
	  rc = db_seq_put (new_set, i, &element);
	}
      else
	{
	  rc = db_set_add (new_set, &element);
	}

      if (rc != NO_ERROR)
	{
	  db_set_free (new_set);
	  return ER_FAILED;
	}
    }

  pr_clear_value (value_p);

  switch (type)
    {
    case DB_TYPE_SET:
      DB_MAKE_SET (value_p, new_set);
      break;
    case DB_TYPE_MULTISET:
      DB_MAKE_MULTISET (value_p, new_set);
      break;
    case DB_TYPE_SEQUENCE:
      DB_MAKE_SEQUENCE (value_p, new_set);
      break;
    default:
      db_set_free (new_set);
      return ER_FAILED;
    }

  return NO_ERROR;
}