/** * Used to release database resources occupied by a material record. */ void color_zaprec(struct ged *gedp, struct mater *mp) { struct directory dir; /* we get here only if database is NOT read-only */ if (mp->mt_daddr == MATER_NO_ADDR) return; dir.d_magic = RT_DIR_MAGIC; RT_DIR_SET_NAMEP(&dir, "color_zaprec"); dir.d_len = 1; dir.d_addr = mp->mt_daddr; dir.d_flags = 0; if (db_delete(gedp->ged_wdbp->dbip, &dir) != 0) { bu_vls_printf(gedp->ged_result_str, "Database delete error, aborting"); return; } mp->mt_daddr = MATER_NO_ADDR; }
/** * Used to create a database record and get it written out to a granule. * In some cases, storage will need to be allocated. */ void color_putrec(struct ged *gedp, struct mater *mp) { struct directory dir; union record rec; /* we get here only if database is NOT read-only */ rec.md.md_id = ID_MATERIAL; rec.md.md_low = mp->mt_low; rec.md.md_hi = mp->mt_high; rec.md.md_r = mp->mt_r; rec.md.md_g = mp->mt_g; rec.md.md_b = mp->mt_b; /* Fake up a directory entry for db_* routines */ RT_DIR_SET_NAMEP(&dir, "color_putrec"); dir.d_magic = RT_DIR_MAGIC; dir.d_flags = 0; if (mp->mt_daddr == MATER_NO_ADDR) { /* Need to allocate new database space */ if (db_alloc(gedp->ged_wdbp->dbip, &dir, 1)) { bu_vls_printf(gedp->ged_result_str, "Database alloc error, aborting"); return; } mp->mt_daddr = dir.d_addr; } else { dir.d_addr = mp->mt_daddr; dir.d_len = 1; } if (db_put(gedp->ged_wdbp->dbip, &dir, &rec, 0, 1)) { bu_vls_printf(gedp->ged_result_str, "Database write error, aborting"); return; } }
int db_rename(struct db_i *dbip, struct directory *dp, const char *newname) { struct directory *findp; struct directory **headp; RT_CK_DBI(dbip); RT_CK_DIR(dp); /* Remove from linked list */ headp = &(dbip->dbi_Head[db_dirhash(dp->d_namep)]); if (*headp == dp) { /* Was first on list, dequeue */ *headp = dp->d_forw; } else { for (findp = *headp; findp != RT_DIR_NULL; findp = findp->d_forw) { if (findp->d_forw != dp) continue; /* Dequeue */ findp->d_forw = dp->d_forw; goto out; } return -1; /* ERROR: can't find */ } out: /* Effect new name */ RT_DIR_FREE_NAMEP(dp); /* frees d_namep */ RT_DIR_SET_NAMEP(dp, newname); /* sets d_namep */ /* Add to new linked list */ headp = &(dbip->dbi_Head[db_dirhash(newname)]); dp->d_forw = *headp; *headp = dp; return 0; }
struct directory * db_diradd(struct db_i *dbip, const char *name, off_t laddr, size_t len, int flags, void *ptr) { struct directory **headp; struct directory *dp; const char *tmp_ptr; struct bu_vls local = BU_VLS_INIT_ZERO; RT_CK_DBI(dbip); if (RT_G_DEBUG&DEBUG_DB) { bu_log("db_diradd(dbip=%p, name='%s', addr=%ld, len=%zu, flags=0x%x, ptr=%p)\n", (void *)dbip, name, laddr, len, flags, ptr); } if ((tmp_ptr = strchr(name, '/')) != NULL) { /* if this is a version 4 database and the offending char is beyond NAMESIZE * then it is not really a problem */ if (db_version(dbip) < 5 && (tmp_ptr - name) < NAMESIZE) { bu_log("db_diradd() object named '%s' is illegal, ignored\n", name); return RT_DIR_NULL; } } if (db_version(dbip) < 5) { bu_vls_strncpy(&local, name, NAMESIZE); } else { /* must provide a valid minor type */ if (!ptr) { bu_log("WARNING: db_diradd() called with a null minor type pointer for object %s\nIgnoring %s\n", name, name); bu_vls_free(&local); return RT_DIR_NULL; } bu_vls_strcpy(&local, name); } if (db_dircheck(dbip, &local, 0, &headp) < 0) { bu_vls_free(&local); return RT_DIR_NULL; } /* 'name' not found in directory, add it */ RT_GET_DIRECTORY(dp, &rt_uniresource); RT_CK_DIR(dp); RT_DIR_SET_NAMEP(dp, bu_vls_addr(&local)); /* sets d_namep */ dp->d_addr = laddr; dp->d_flags = flags & ~(RT_DIR_INMEM); dp->d_len = len; dp->d_forw = *headp; BU_LIST_INIT(&dp->d_use_hd); *headp = dp; dp->d_animate = NULL; dp->d_nref = 0; dp->d_uses = 0; /* v4 geometry databases do not use d_major/minor_type */ if (db_version(dbip) > 4) { dp->d_major_type = DB5_MAJORTYPE_BRLCAD; if (ptr) dp->d_minor_type = *(unsigned char *)ptr; else dp->d_minor_type = 0; } else { dp->d_major_type = 0; dp->d_minor_type = 0; } bu_vls_free(&local); return dp; }