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; } } }
/* * 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; }