+if (!Blerg::Database::init()) {
+ die "Could not initialize C library";
+}
+
+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);
+}
+