Fix OO-style subscription
[blerg.git] / lib / perl / Blerg-Database / lib / Blerg / Database.pm
index 74481d2..b05c7f9 100644 (file)
@@ -57,6 +57,115 @@ XSLoader::load('Blerg::Database', $VERSION);
 
 # Preloaded methods go here.
 
+sub open {
+    my ($class, $name) = @_;
+    my $ptr = Blerg::Database::_open($name);
+    my $obj = {
+        ptr => $ptr,
+        name => $name,
+    };
+    return bless $obj, $class;
+}
+
+sub open_existing {
+    my ($class, $name) = @_;
+
+    if (Blerg::Database::exists($name)) {
+        return Blerg::Database->open($name);
+    }
+    return undef;
+}
+
+sub _ensure_pointer {
+    my ($obj) = @_;
+    if (!defined $obj->{ptr}) {
+        croak "Attempted to use closed Blerg::Database";
+    }
+}
+
+sub close {
+    my ($obj) = @_;
+    if (!(defined $obj && defined $obj->{ptr})) {
+        # Welp, nothing to do here!
+        return;
+    }
+    Blerg::Database::_close($obj->{ptr});
+    delete $obj->{ptr};
+}
+
+DESTROY {
+    my ($obj) = @_;
+    $obj->close;
+}
+
+sub record_count {
+    my ($obj) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_get_record_count($obj->{ptr});
+}
+
+sub set_subscription_mark {
+    my ($obj) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_set_subscription_mark($obj->{ptr});
+}
+
+sub get_subscription_mark {
+    my ($obj) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_get_subscription_mark($obj->{ptr});
+}
+
+sub subscription_list {
+    my ($obj) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_subscription_list($obj->{name}, 0, 1);
+}
+
+sub mute {
+    my ($obj, $v) = @_;
+    $obj->_ensure_pointer;
+    if (defined $v) {
+        return Blerg::Database::_set_mute($obj->{ptr}, $v);
+    } else {
+        return Blerg::Database::_get_mute($obj->{ptr});
+    }
+}
+
+sub refs {
+    my ($obj) = @_;
+    return Blerg::Database::tag_list('@' . $obj->{name}, 50, -1);
+}
+
+sub store {
+    my ($obj, $data) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_store($obj->{ptr}, $data);
+}
+
+sub fetch {
+    my ($obj, $record) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_fetch($obj->{ptr}, $record);
+}
+
+sub timestamp {
+    my ($obj, $record) = @_;
+    $obj->_ensure_pointer;
+    return Blerg::Database::_get_timestamp($obj->{ptr}, $record);
+}
+
+# Convenience shortcuts
+sub hash_tag_list {
+    my ($name, $str_offset, $direction) = @_;
+    return Blerg::Database::tag_list("#$name", $str_offset, $direction);
+}
+
+sub ref_tag_list {
+    my ($name, $str_offset, $direction) = @_;
+    return Blerg::Database::tag_list("@$name", $str_offset, $direction);
+}
+
 # Autoload methods go after =cut, and are processed by the autosplit program.
 
 1;
@@ -118,7 +227,7 @@ If you have a web site set up for your module, mention it here.
 
 =head1 AUTHOR
 
-Chip Black, E<lt>chip@slackware.lanE<gt>
+Chip Black, E<lt>bytex64@bytex64.netE<gt>
 
 =head1 COPYRIGHT AND LICENSE