/* * disk_reserve_instance - This is used to reserve space for an instance that * was referenced in the load file but has not yet been defined. * return: NO_ERROR if successful, error code otherwise * classop(in): class * oid(in): returned instance OID */ int disk_reserve_instance (MOP classop, OID * oid) { int error = NO_ERROR; SM_CLASS *class_; HFID *hfid; int expected; class_ = (SM_CLASS *) locator_fetch_class (classop, DB_FETCH_READ); if (class_ == NULL) { error = er_errid (); } else { expected = estimate_object_size (class_); hfid = get_class_heap (classop, class_); if (hfid == NULL) { error = er_errid (); } else { if (heap_assign_address_with_class_oid (NULL, hfid, oid, expected, ws_oid (classop)) != NO_ERROR) { error = ER_LDR_CANT_INSERT; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } } } return error; }
/* * disk_insert_instance - This inserts a new object in the database given a * "descriptor" for the object. * return: NO_ERROR if successful, error code otherwise * classop(in): class object * obj(in): object description * oid(in): oid of the destination */ int disk_insert_instance (MOP classop, DESC_OBJ * obj, OID * oid) { int error = NO_ERROR; HFID *hfid; int newsize; bool has_indexes; Diskrec->length = 0; if (desc_obj_to_disk (obj, Diskrec, &has_indexes)) { /* make the record larger */ newsize = -Diskrec->length + DB_PAGESIZE; free_recdes (Diskrec); Diskrec = alloc_recdes (newsize); /* try one more time */ if (Diskrec == NULL || desc_obj_to_disk (obj, Diskrec, &has_indexes) != 0) { error = ER_LDR_CANT_TRANSFORM; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } } if (!error) { hfid = get_class_heap (classop, obj->class_); if (hfid == NULL) { assert (er_errid () != NO_ERROR); error = er_errid (); } else { HEAP_OPERATION_CONTEXT context; /* set up context */ heap_create_insert_context (&context, hfid, WS_OID (classop), Diskrec, NULL, false); /* oid is set here as a side effect */ if (heap_insert_logical (NULL, &context) != NO_ERROR) { assert (er_errid () != NO_ERROR); error = er_errid (); } else if (has_indexes) { COPY_OID (oid, &context.res_oid); error = update_indexes (WS_OID (classop), oid, Diskrec); } else { COPY_OID (oid, &context.res_oid); } } } return (error); }
/* * disk_update_instance - This updates an object that had previously been * reserved with the actual contents. * return: NO_ERROR if successful, error code otherwise * classop(in): class object * obj(in): description of object * oid(in): destination oid */ int disk_update_instance (MOP classop, DESC_OBJ * obj, OID * oid) { int error = NO_ERROR; HFID *hfid; int newsize; bool has_indexes = false; Diskrec->length = 0; if (desc_obj_to_disk (obj, Diskrec, &has_indexes)) { /* make the record larger */ newsize = -Diskrec->length + DB_PAGESIZE; free_recdes (Diskrec); Diskrec = alloc_recdes (newsize); /* try one more time */ if (Diskrec == NULL || desc_obj_to_disk (obj, Diskrec, &has_indexes) != 0) { error = ER_LDR_CANT_TRANSFORM; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } } if (!error) { hfid = get_class_heap (classop, obj->class_); if (hfid == NULL) { assert (er_errid () != NO_ERROR); error = er_errid (); } else { HEAP_OPERATION_CONTEXT update_context; heap_create_update_context (&update_context, hfid, oid, WS_OID (classop), Diskrec, NULL, UPDATE_INPLACE_NONE); if (heap_update_logical (NULL, &update_context) != NO_ERROR) { assert (er_errid () != NO_ERROR); error = er_errid (); } if (update_context.is_logical_old) { fprintf (stdout, msgcat_message (MSGCAT_CATALOG_UTILS, MSGCAT_UTIL_SET_LOADDB, LOADDB_MSG_UPDATE_WARNING)); } else if (has_indexes) { error = update_indexes (WS_OID (classop), oid, Diskrec); } } } return (error); }
/* * disk_update_instance - This updates an object that had previously been * reserved with the acutal contents. * return: NO_ERROR if successful, error code otherwise * classop(in): class object * obj(in): description of object * oid(in): destination oid */ int disk_update_instance (MOP classop, DESC_OBJ * obj, OID * oid) { int error = NO_ERROR; HFID *hfid; int newsize; bool has_indexes = false, oldflag; Diskrec->length = 0; if (desc_obj_to_disk (obj, Diskrec, &has_indexes)) { /* make the record larger */ newsize = -Diskrec->length + DB_PAGESIZE; free_recdes (Diskrec); Diskrec = alloc_recdes (newsize); /* try one more time */ if (Diskrec == NULL || desc_obj_to_disk (obj, Diskrec, &has_indexes) != 0) { error = ER_LDR_CANT_TRANSFORM; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } } if (!error) { hfid = get_class_heap (classop, obj->class_); if (hfid == NULL) { error = er_errid (); } else if (heap_update (NULL, hfid, oid, Diskrec, &oldflag, NULL) != oid) { error = er_errid (); } else { if (oldflag) { fprintf (stdout, msgcat_message (MSGCAT_CATALOG_UTILS, MSGCAT_UTIL_SET_LOADDB, LOADDB_MSG_UPDATE_WARNING)); } else if (has_indexes) { error = update_indexes (WS_OID (classop), oid, Diskrec); } } } return (error); }
/* * disk_update_instance_using_mobj - updates an object that had previously * been reserved with the acutal contents. * return: NO_ERROR if successful, error code otherwise * classop(in): class object * classobj(in): class memory object * obj(in): object memory. * oid(in): oid of the destination */ int disk_update_instance_using_mobj (MOP classop, MOBJ classobj, MOBJ obj, OID * oid) { int error = NO_ERROR; HFID *hfid; bool has_indexes = false; volatile int newsize = 0; bool oldflag; TF_STATUS tf_status = TF_SUCCESS; Diskrec->length = 0; /* * tf_mem_to_disk() is used to get an estimate of the disk space requirements * for the object. When dealing with collections the estimate returned is * not always a good one, hence we need to enclose this block in a loop * increasing the space by increments of DB_PAGESIZE until we hit the correct * space requirement. */ while ((tf_status = tf_mem_to_disk (classop, classobj, obj, Diskrec, &has_indexes)) == TF_OUT_OF_SPACE) { /* make the record larger */ if (newsize) { newsize += DB_PAGESIZE; } else { newsize = -Diskrec->length + DB_PAGESIZE; } free_recdes (Diskrec); Diskrec = alloc_recdes (newsize); if (Diskrec == NULL) { error = er_errid (); break; } } if (tf_status != TF_SUCCESS) { error = ER_LDR_CANT_TRANSFORM; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } if (error == NO_ERROR && Diskrec != NULL) { hfid = get_class_heap (classop, (SM_CLASS *) classop->object); if (hfid == NULL) { error = er_errid (); } else if (heap_update (NULL, hfid, oid, Diskrec, &oldflag, NULL) != oid) { error = er_errid (); } else { if (oldflag) { fprintf (stdout, msgcat_message (MSGCAT_CATALOG_UTILS, MSGCAT_UTIL_SET_LOADDB, LOADDB_MSG_UPDATE_WARNING)); } else if (has_indexes) { error = update_indexes (WS_OID (classop), oid, Diskrec); } } } return (error); }
/* * disk_insert_instance_using_mobj - inserts a new object in the database * given a memory object and class object * return: NO_ERROR if successful, error code otherwise * classop(in): class object * classobj(in): class memory object * obj(in): object memory. * oid(out): oid of the destination */ int disk_insert_instance_using_mobj (MOP classop, MOBJ classobj, MOBJ obj, OID * oid) { int error = NO_ERROR; HFID *hfid; volatile int newsize = 0; bool has_indexes; TF_STATUS tf_status = TF_SUCCESS; Diskrec->length = 0; /* * tf_mem_to_disk() is used to get an estimate of the disk space requirements * for the object. When dealing with collections the estimate returned is * not always a good one, hence we need to enclose this block in a loop * increasing the space by increments of DB_PAGESIZE until we hit the correct * space requirement. */ while ((tf_status = tf_mem_to_disk (classop, classobj, obj, Diskrec, &has_indexes)) == TF_OUT_OF_SPACE) { /* make the record larger */ if (newsize) { newsize += DB_PAGESIZE; } else { newsize = -Diskrec->length + DB_PAGESIZE; } free_recdes (Diskrec); Diskrec = alloc_recdes (newsize); if (Diskrec == NULL) { assert (er_errid () != NO_ERROR); error = er_errid (); break; } } if (tf_status != TF_SUCCESS) { error = ER_LDR_CANT_TRANSFORM; er_set (ER_ERROR_SEVERITY, ARG_FILE_LINE, error, 0); } if (error == NO_ERROR && Diskrec != NULL) { hfid = get_class_heap (classop, (SM_CLASS *) classop->object); if (hfid == NULL) { assert (er_errid () != NO_ERROR); error = er_errid (); } else { HEAP_OPERATION_CONTEXT context; /* set up context */ heap_create_insert_context (&context, hfid, WS_OID (classop), Diskrec, NULL); /* oid is set here as a side effect */ if (heap_insert_logical (NULL, &context) != NO_ERROR) { assert (er_errid () != NO_ERROR); error = er_errid (); } else if (has_indexes) { COPY_OID (oid, &context.res_oid); error = update_indexes (WS_OID (classop), oid, Diskrec); } else { COPY_OID (oid, &context.res_oid); } } } return (error); }