From: Browder, T. <Tom...@fw...> - 2005-08-31 17:53:00
|
Thanks, Sean, that's very helpful--just what the doctor ordered. -Tom=20 > -----Original Message----- > From: Christopher Sean Morrison [mailto:br...@ma...]=20 > Sent: Wednesday, August 31, 2005 11:42 AM > To: Browder, Tom > Cc: Brl...@li...;=20 > 'brl...@li...' > Subject: Re: [Brlcad-users] Mk_* and Friends >=20 > Tom, >=20 > I'd consider that artifact that it leave an object a bug=20 > myself. If an mk_ function fails, the database should not be=20 > modified. That said, as you noted it does now so you need=20 > some sort of failure recovery. =20 > Libwdb doesn't handle that functionality directly, librt=20 > does. For what it's worth, libwdb is actually spawned off of=20 > librt so there is a lot of cross-over between the two and as=20 > soon as you cross the line of doing anything more than simply=20 > writing out geometry, librt takes over. >=20 > So, the routine you need from librt that you can call is the=20 > same command that mged ultimately uses for the kill command: =20 > db_delete(). =20 > The command is defined in src/librt/db_alloc.c as follows: >=20 > int db_delete(struct db_i *dbip, struct directory *dp); >=20 > That db_i pointer is actually stashed inside the struct=20 > rt_wdb * that you opened, and all you need to acquire is a=20 > handle on the object in the database directory. This is done=20 > via db_lookup(). Since you probably also then want to remove=20 > the object from the in-memory directory, a call to=20 > db_dirdelete() is also in order. To put it all together into=20 > an example snippet: >=20 > struct rt_wdb *fp =3D wdb_fopen("blah.g"); struct directory *dp=20 > =3D db_lookup(fp->dbip, "blah.r", 0); > /* third argument to db_lookup is a verbose flag */ >=20 > if (dp) { > bu_log("couldn't find object blah.r\n"); } >=20 > if (db_delete(fp->dbip, dp) || db_dirdelete(fp->dbip, dp)) { > bu_log("delete failed\n"); > } else { > bu_log("delete succeeded\n"); > } > wdb_close(fp); >=20 > These is definitely a thread more suited to the brlcad-devel=20 > mailing list instead of the brlcad-users list.. ;-) >=20 > Cheers! > Sean >=20 >=20 > On Aug 30, 2005, at 4:40 PM, Browder, Tom wrote: >=20 > > When using libwdb in a C program and a mk_* function fails,=20 > the name=20 > > of the object remains in the db. How does one remove it using C=20 > > functions? > > > > Thanks. > > > > Tom Browder >=20 >=20 |