# HG changeset patch # User Bryan Kearney <[EMAIL PROTECTED]> # Date 1218109620 14400 # Node ID 0bd266ecddcf8fd93cbbb44f3638d7d9c07943e3 # Parent 762841fb5355baff008291ba569882f126aa3cb7 added close method to the ruby bindings. This will close the augeas handle, and therefor the object is unusable after calling close. Added a new structure to hold augeas and the state of the handle (open, closed). Nothing is done to mark the object for garbage collection, only when gc is run.
diff -r 762841fb5355 -r 0bd266ecddcf README.rdoc --- a/README.rdoc Thu May 01 14:23:42 2008 -0700 +++ b/README.rdoc Thu Aug 07 07:47:00 2008 -0400 @@ -1,3 +1,22 @@ = Ruby bindings for augeas -The class Augeas provides bindings to augeas [http://augeas.net] library +The class Augeas provides bindings to augeas [http://augeas.net] library. + +== Usage: Setting Data + aug = Augeas.open("/", "", 0) + aug.set("/files/etc/sysconfig/firstboot/RUN_FIRSTBOOT", "YES") + aug.save() + aug.close() + +== Usage: Accessing Data + aug = Augeas.open("/", "", 0) + aug.get("/files/etc/sysconfig/firstboot/RUN_FIRSTBOOT") + aug.close + +== Usage: Removing Data + aug = Augeas.open("/", "", 0) + aug.rm("/files/etc/sysconfig/firstboot/RUN_FIRSTBOOT") + aug.save() + aug.close + + diff -r 762841fb5355 -r 0bd266ecddcf ext/augeas/_augeas.c --- a/ext/augeas/_augeas.c Thu May 01 14:23:42 2008 -0700 +++ b/ext/augeas/_augeas.c Thu Aug 07 07:47:00 2008 -0400 @@ -24,18 +24,33 @@ static VALUE c_augeas; +typedef struct augeas_wrapper { + augeas *aug; + int open ; +} augeas_wrapper ; + static augeas *aug_handle(VALUE s) { - augeas *aug; + augeas *aug = NULL; + augeas_wrapper *wrapper ; - Data_Get_Struct(s, struct augeas, aug); - if (aug == NULL) { + Data_Get_Struct(s, struct augeas_wrapper, wrapper); + if (wrapper == NULL) { rb_raise(rb_eSystemCallError, "Failed to retrieve connection"); + } else if (wrapper->open == 1){ + aug = wrapper->aug ; + } else { + rb_raise(rb_eSystemCallError, "Close has been called"); } + return aug; } -static void augeas_close(void *aug) { - aug_close(aug); +static void augeas_free(augeas_wrapper *wrapper) { + if (wrapper->open == 1){ + aug_close(wrapper->aug); + wrapper->open = 0 ; + /*free(wrapper);*/ + } } /* @@ -176,19 +191,39 @@ * call-seq: * open(ROOT, LOADPATH, FLAGS) -> Augeas * - * Create a new instance and return it + * Create a new instance of and return it. The ROOT is the location for + * from which files are referenced. LOADPATH is used to locate lenses. + * FLAGS controls how augeas treats the changes. */ VALUE augeas_init(VALUE m, VALUE r, VALUE l, VALUE f) { unsigned int flags = NUM2UINT(f); const char *root = (r == Qnil) ? NULL : StringValueCStr(r); const char *loadpath = (l == Qnil) ? NULL : StringValueCStr(l); augeas *aug = NULL; + augeas_wrapper *wrapper = NULL; + VALUE obj ; aug = aug_init(root, loadpath, flags); if (aug == NULL) { rb_raise(rb_eSystemCallError, "Failed to initialize Augeas"); } - return Data_Wrap_Struct(c_augeas, NULL, augeas_close, aug); + obj = Data_Make_Struct(c_augeas, struct augeas_wrapper, + NULL, augeas_free, wrapper) ; + + wrapper->aug = aug ; + wrapper->open = 1 ; + return obj ; +} + +VALUE augeas_close (VALUE m) { + augeas_wrapper *wrapper ; + Data_Get_Struct(m, struct augeas_wrapper, wrapper); + + // Check to see if we have been closed already + if (wrapper->open == 1) { + augeas_free(wrapper) ; + } + return m ; } void Init__augeas() { @@ -214,6 +249,7 @@ rb_define_method(c_augeas, "match", augeas_match, 1); rb_define_method(c_augeas, "save", augeas_save, 0); rb_define_method(c_augeas, "set", augeas_set, 2); + rb_define_method(c_augeas, "close", augeas_close, 0); } /* _______________________________________________ augeas-devel mailing list [email protected] https://www.redhat.com/mailman/listinfo/augeas-devel
