Class: Archive_r::Entry
- Inherits:
-
Object
- Object
- Archive_r::Entry
- Defined in:
- lib/archive_r.rb,
ext/archive_r/archive_r_ext.cc
Instance Method Summary collapse
-
#depth ⇒ Object
Entry#depth -> Integer.
-
#directory? ⇒ Boolean
Entry#directory? -> Boolean.
-
#file? ⇒ Boolean
Entry#file? -> Boolean.
- #inspect ⇒ Object
-
#metadata ⇒ Object
Entry#metadata -> Hash.
-
#metadata_value(key) ⇒ Object
Entry#metadata_value(key) -> Object or nil.
-
#name ⇒ Object
Entry#name -> String.
-
#path ⇒ Object
Entry#path -> String.
-
#path_hierarchy ⇒ Object
Entry#path_hierarchy -> Array.
-
#read(*args) ⇒ Object
Entry#read(length = nil) -> String.
-
#set_descent(enabled) ⇒ Object
Entry#set_descent(enabled) -> self.
-
#set_multi_volume_group(*args) ⇒ Object
Entry#set_multi_volume_group(base_name, order: :natural) -> nil.
-
#size ⇒ Object
Entry#size -> Integer.
-
#to_s ⇒ Object
Additional helper methods can be added here.
Instance Method Details
#depth ⇒ Object
Entry#depth -> Integer
820 821 822 823 |
# File 'ext/archive_r/archive_r_ext.cc', line 820
static VALUE entry_depth(VALUE self) {
Entry *entry = entry_for_read(self);
return INT2NUM(entry->depth());
}
|
#directory? ⇒ Boolean
Entry#directory? -> Boolean
814 815 816 817 |
# File 'ext/archive_r/archive_r_ext.cc', line 814
static VALUE entry_is_directory(VALUE self) {
Entry *entry = entry_for_read(self);
return entry->is_directory() ? Qtrue : Qfalse;
}
|
#file? ⇒ Boolean
Entry#file? -> Boolean
808 809 810 811 |
# File 'ext/archive_r/archive_r_ext.cc', line 808
static VALUE entry_is_file(VALUE self) {
Entry *entry = entry_for_read(self);
return entry->is_file() ? Qtrue : Qfalse;
}
|
#inspect ⇒ Object
76 77 78 |
# File 'lib/archive_r.rb', line 76 def inspect "#<Archive_r::Entry path=#{path.inspect} size=#{size} depth=#{depth}>" end |
#metadata ⇒ Object
Entry#metadata -> Hash
938 939 940 941 942 943 944 945 946 |
# File 'ext/archive_r/archive_r_ext.cc', line 938
static VALUE entry_metadata(VALUE self) {
Entry *entry = entry_for_read(self);
VALUE hash = rb_hash_new();
const EntryMetadataMap &metadata = entry->metadata();
for (const auto &kv : metadata) {
rb_hash_aset(hash, cpp_string_to_rb(kv.first), metadata_value_to_rb(kv.second));
}
return hash;
}
|
#metadata_value(key) ⇒ Object
Entry#metadata_value(key) -> Object or nil
949 950 951 952 953 954 955 956 957 |
# File 'ext/archive_r/archive_r_ext.cc', line 949
static VALUE entry_metadata_value(VALUE self, VALUE key) {
Entry *entry = entry_for_read(self);
std::string key_str = rb_string_to_cpp(StringValue(key));
const EntryMetadataValue *value = entry->find_metadata(key_str);
if (!value) {
return Qnil;
}
return metadata_value_to_rb(*value);
}
|
#name ⇒ Object
Entry#name -> String
796 797 798 799 |
# File 'ext/archive_r/archive_r_ext.cc', line 796
static VALUE entry_name(VALUE self) {
Entry *entry = entry_for_read(self);
return cpp_string_to_rb(entry->name());
}
|
#path ⇒ Object
Entry#path -> String
783 784 785 786 787 |
# File 'ext/archive_r/archive_r_ext.cc', line 783
static VALUE entry_path(VALUE self) {
Entry *entry = entry_for_read(self);
const std::string entry_path_str = entry->path();
return cpp_string_to_rb(entry->path());
}
|
#path_hierarchy ⇒ Object
Entry#path_hierarchy -> Array
790 791 792 793 |
# File 'ext/archive_r/archive_r_ext.cc', line 790
static VALUE entry_path_hierarchy(VALUE self) {
Entry *entry = entry_for_read(self);
return path_hierarchy_to_rb(entry->path_hierarchy());
}
|
#read(*args) ⇒ Object
Entry#read(length = nil) -> String
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 |
# File 'ext/archive_r/archive_r_ext.cc', line 878
static VALUE entry_read(int argc, VALUE *argv, VALUE self) {
VALUE length_val = Qnil;
rb_scan_args(argc, argv, "01", &length_val);
bool bounded_read = false;
size_t requested_size = 0;
if (!NIL_P(length_val)) {
long long length_long = NUM2LL(length_val);
if (length_long == 0) {
return rb_str_new("", 0);
} else if (length_long > 0) {
const auto max_allowed = std::numeric_limits<size_t>::max();
if (static_cast<unsigned long long>(length_long) > max_allowed) {
rb_raise(rb_eRangeError, "requested length exceeds platform limits");
}
requested_size = static_cast<size_t>(length_long);
bounded_read = true;
}
// Negative values fall through to the streaming path (full read)
}
Entry *entry = entry_for_read(self);
const std::string entry_path_str = entry->path();
try {
if (bounded_read) {
std::vector<uint8_t> buffer(requested_size);
const ssize_t bytes_read = entry->read(buffer.data(), buffer.size());
if (bytes_read < 0) {
rb_raise(rb_eRuntimeError, "Failed to read entry payload at %s", entry_path_str.c_str());
}
return rb_str_new(reinterpret_cast<const char *>(buffer.data()), static_cast<long>(bytes_read));
}
std::string aggregate;
const uint64_t reported_size = entry->size();
if (reported_size > 0 && reported_size <= static_cast<uint64_t>(std::numeric_limits<size_t>::max())) {
aggregate.reserve(static_cast<size_t>(reported_size));
}
std::vector<uint8_t> chunk(64 * 1024);
while (true) {
const ssize_t bytes_read = entry->read(chunk.data(), chunk.size());
if (bytes_read < 0) {
rb_raise(rb_eRuntimeError, "Failed to read entry payload at %s", entry_path_str.c_str());
}
if (bytes_read == 0) {
break;
}
aggregate.append(reinterpret_cast<const char *>(chunk.data()), static_cast<size_t>(bytes_read));
}
return rb_str_new(aggregate.data(), static_cast<long>(aggregate.size()));
} catch (const std::exception &e) {
rb_raise(rb_eRuntimeError, "Failed to read entry at %s: %s", entry_path_str.c_str(), e.what());
return Qnil;
}
}
|
#set_descent(enabled) ⇒ Object
Entry#set_descent(enabled) -> self
826 827 828 829 830 |
# File 'ext/archive_r/archive_r_ext.cc', line 826
static VALUE entry_set_descent(VALUE self, VALUE enabled) {
Entry *entry = entry_for_live(self);
entry->set_descent(RTEST(enabled));
return self;
}
|
#set_multi_volume_group(*args) ⇒ Object
Entry#set_multi_volume_group(base_name, order: :natural) -> nil
833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 |
# File 'ext/archive_r/archive_r_ext.cc', line 833
static VALUE entry_set_multi_volume_group(int argc, VALUE *argv, VALUE self) {
VALUE base_name_val;
VALUE options_val = Qnil;
rb_scan_args(argc, argv, "11", &base_name_val, &options_val);
MultiVolumeGroupOptions options;
if (!NIL_P(options_val)) {
VALUE hash = rb_check_hash_type(options_val);
if (NIL_P(hash)) {
rb_raise(rb_eTypeError, "options must be a Hash");
}
static ID id_order = rb_intern("order");
VALUE order_val = rb_hash_aref(hash, ID2SYM(id_order));
if (!NIL_P(order_val)) {
std::string order_str;
if (SYMBOL_P(order_val)) {
order_str = rb_id2name(SYM2ID(order_val));
} else {
order_str = rb_string_to_cpp(StringValue(order_val));
}
for (char &ch : order_str) {
ch = static_cast<char>(std::tolower(static_cast<unsigned char>(ch)));
}
if (order_str == "given") {
options.ordering = PathEntry::Parts::Ordering::Given;
} else if (order_str == "natural") {
options.ordering = PathEntry::Parts::Ordering::Natural;
} else {
rb_raise(rb_eArgError, "order must be :natural or :given");
}
}
}
Entry *entry = entry_for_live(self);
try {
entry->set_multi_volume_group(rb_string_to_cpp(StringValue(base_name_val)), options);
} catch (const std::exception &e) {
rb_raise(rb_eRuntimeError, "Failed to set multi-volume group: %s", e.what());
}
return Qnil;
}
|
#size ⇒ Object
Entry#size -> Integer
802 803 804 805 |
# File 'ext/archive_r/archive_r_ext.cc', line 802
static VALUE entry_size(VALUE self) {
Entry *entry = entry_for_read(self);
return LONG2NUM(entry->size());
}
|
#to_s ⇒ Object
Additional helper methods can be added here
72 73 74 |
# File 'lib/archive_r.rb', line 72 def to_s path end |