pbf_parser 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ea5dc0ea7ddbd1a9a7be824c3ed334094c700df
4
- data.tar.gz: d89de3d4d8f6db32de7dde3cf4a7035d4f9f751a
3
+ metadata.gz: 5341b491bdc9e0695a864bb7b190d226dc8ad2ca
4
+ data.tar.gz: 988771cfcd757689ceb0c4875722d9653b345720
5
5
  SHA512:
6
- metadata.gz: 7f3ed43da517eb4a534fb24b708645ceb23eadf9f41a51027f6215b982d7e01d21ad66d42a5936ab48fc1d27569efa58dd7fad236dcbfce65bde75227cbf20b8
7
- data.tar.gz: 1427c6766cc9cede1b9467514e88762e030bca6fcc267937fffa3a354d3757f2b6c52e00c1aab98030b876cfa4992f59ad8d3d9de81322c5f0538e04ec4f9809
6
+ metadata.gz: 4eebbaf35074633ae16866fa1d59b888159aa9f53425fc3ebb61ffa46bf501c6c4a7d6e1c1fbb0f4b7cd41b184bd563d2b4ab9a77f2f53b8c66694a4121c95ee
7
+ data.tar.gz: b036b89bbaaa41f986a79686d61fe116eeb838be457cad07041c936dcabeba0de1e2a48f1e7b1fd4736bc6971c3eb64bf99c51445e60e1b10e7d9c0043838985
@@ -590,9 +590,70 @@ static VALUE parse_osm_data(VALUE obj)
590
590
 
591
591
  primitive_block__free_unpacked(primitive_block, NULL);
592
592
 
593
+ // Increment position
594
+ rb_iv_set(obj, "@pos", INT2NUM(NUM2INT(rb_iv_get(obj, "@pos")) + 1));
595
+
593
596
  return Qtrue;
594
597
  }
595
598
 
599
+ // Find position and size of all data blobs in the file
600
+ static VALUE find_all_blobs(VALUE obj)
601
+ {
602
+ FILE *input = DATA_PTR(obj);
603
+ long old_pos = ftell(input);
604
+
605
+ if (0 != fseek(input, 0, SEEK_SET)) {
606
+ rb_raise(rb_eIOError, "Unable to seek to beginning of file");
607
+ }
608
+
609
+ BlobHeader *header;
610
+
611
+ VALUE blobs = rb_ary_new();
612
+ rb_iv_set(obj, "@blobs", blobs);
613
+
614
+ long pos = 0, data_pos = 0;
615
+ int32_t datasize;
616
+
617
+ while ((header = read_blob_header(input)) != NULL) {
618
+
619
+ datasize = header->datasize;
620
+
621
+ if (0 == strcmp(header->type, "OSMData")) {
622
+ VALUE blob_info = rb_hash_new();
623
+ data_pos = ftell(input);
624
+
625
+ // This is designed to be user-friendly, so I have chosen
626
+ // to make header_pos the position of the protobuf stream
627
+ // itself, in line with data_pos. However, internally, we
628
+ // subtract 4 when calling parse_osm_data().
629
+ rb_hash_aset(blob_info, STR2SYM("header_pos"),
630
+ LONG2NUM(pos + 4));
631
+ rb_hash_aset(blob_info, STR2SYM("header_size"),
632
+ LONG2NUM(data_pos - pos - 4));
633
+ rb_hash_aset(blob_info, STR2SYM("data_pos"),
634
+ LONG2NUM(data_pos));
635
+ rb_hash_aset(blob_info, STR2SYM("data_size"),
636
+ UINT2NUM(datasize));
637
+
638
+ rb_ary_push(blobs, blob_info);
639
+ }
640
+
641
+ blob_header__free_unpacked(header, NULL);
642
+
643
+ if (0 != fseek(input, datasize, SEEK_CUR)) {
644
+ break; // cut losses
645
+ }
646
+ pos = ftell(input);
647
+ }
648
+
649
+ // restore old position
650
+ if (0 != fseek(input, old_pos, SEEK_SET)) {
651
+ rb_raise(rb_eIOError, "Unable to restore old file position");
652
+ }
653
+
654
+ return blobs;
655
+ }
656
+
596
657
  static VALUE header_getter(VALUE obj)
597
658
  {
598
659
  return rb_iv_get(obj, "@header");
@@ -624,10 +685,63 @@ static VALUE relations_getter(VALUE obj)
624
685
  return rb_hash_aref(data, STR2SYM("relations"));
625
686
  }
626
687
 
688
+ static VALUE blobs_getter(VALUE obj)
689
+ {
690
+ VALUE blobs = rb_iv_get(obj, "@blobs");
691
+ if (blobs == Qnil) {
692
+ blobs = find_all_blobs(obj);
693
+ }
694
+ return blobs;
695
+ }
696
+
697
+ static VALUE size_getter(VALUE obj)
698
+ {
699
+ VALUE blobs = blobs_getter(obj);
700
+ return rb_funcall(blobs, rb_intern("size"), 0);
701
+ }
702
+
703
+ static VALUE pos_getter(VALUE obj)
704
+ {
705
+ return rb_iv_get(obj, "@pos");
706
+ }
707
+
708
+ static VALUE seek_to_osm_data(VALUE obj, VALUE index)
709
+ {
710
+ FILE *input = DATA_PTR(obj);
711
+ VALUE blobs = blobs_getter(obj);
712
+ int index_raw = NUM2INT(index);
713
+
714
+ // Normalise the index, otherwise #pos returns the wrong value
715
+ if (index_raw < 0) {
716
+ int size = NUM2INT(size_getter(obj));
717
+ // Only normalise if valid; otherwise, allow rb_ary_entry() to fail.
718
+ if (index_raw + size >= 0) {
719
+ index_raw += size;
720
+ }
721
+ }
722
+
723
+ if (NUM2INT(rb_iv_get(obj, "@pos")) == index_raw) {
724
+ return Qtrue; // already there
725
+ }
726
+ VALUE blob_info = rb_ary_entry(blobs, index_raw);
727
+ if (!RTEST(blob_info)) {
728
+ return Qfalse; // no such blob entry
729
+ }
730
+ long pos = NUM2LONG(rb_hash_aref(blob_info, STR2SYM("header_pos"))) - 4;
731
+ if (0 != fseek(input, pos, SEEK_SET)) {
732
+ rb_raise(rb_eIOError, "Unable to seek to file position");
733
+ }
734
+
735
+ // Set position - incremented by parse_osm_data
736
+ rb_iv_set(obj, "@pos", INT2NUM(index_raw - 1));
737
+
738
+ return parse_osm_data(obj);
739
+ }
740
+
627
741
  static VALUE iterate(VALUE obj)
628
742
  {
629
743
  if (!rb_block_given_p())
630
- rb_raise(rb_eArgError, "A block is expected");
744
+ return rb_funcall(obj, rb_intern("to_enum"), 0);
631
745
 
632
746
  do
633
747
  {
@@ -637,7 +751,7 @@ static VALUE iterate(VALUE obj)
637
751
 
638
752
  rb_yield_values(3, nodes, ways, relations);
639
753
 
640
- } while(parse_osm_data(obj) != Qfalse);
754
+ } while(RTEST(parse_osm_data(obj)));
641
755
 
642
756
  return Qnil;
643
757
  }
@@ -658,6 +772,9 @@ static VALUE initialize(VALUE obj, VALUE filename)
658
772
  // Store the filename
659
773
  rb_iv_set(obj, "@filename", filename);
660
774
 
775
+ // Set initial position - incremented by parse_osm_data
776
+ rb_iv_set(obj, "@pos", INT2NUM(-1));
777
+
661
778
  // Every osm.pbf file must have an OSMHeader at the beginning.
662
779
  // Failing to find it means that the file is corrupt or invalid.
663
780
  parse_osm_header(obj, DATA_PTR(obj));
@@ -689,6 +806,8 @@ void Init_pbf_parser(void)
689
806
  rb_define_method(klass, "initialize", initialize, 1);
690
807
  rb_define_method(klass, "inspect", inspect, 0);
691
808
  rb_define_method(klass, "next", parse_osm_data, 0);
809
+ rb_define_method(klass, "seek", seek_to_osm_data, 1);
810
+ rb_define_method(klass, "pos=", seek_to_osm_data, 1);
692
811
  rb_define_method(klass, "each", iterate, 0);
693
812
 
694
813
  // Getters
@@ -697,4 +816,7 @@ void Init_pbf_parser(void)
697
816
  rb_define_method(klass, "nodes", nodes_getter, 0);
698
817
  rb_define_method(klass, "ways", ways_getter, 0);
699
818
  rb_define_method(klass, "relations", relations_getter, 0);
819
+ rb_define_method(klass, "blobs", blobs_getter, 0);
820
+ rb_define_method(klass, "size", size_getter, 0);
821
+ rb_define_method(klass, "pos", pos_getter, 0);
700
822
  }
metadata CHANGED
@@ -1,45 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbf_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrià Planas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-08 00:00:00.000000000 Z
11
+ date: 2014-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: Parse Open Street Map PBF files with ease. Take a look at the readme
42
- on GitHub for installation instructions.
41
+ description:
43
42
  email:
44
43
  - adriaplanas@liquidcodeworks.com
45
44
  executables: []
@@ -47,14 +46,13 @@ extensions:
47
46
  - ext/pbf_parser/extconf.rb
48
47
  extra_rdoc_files: []
49
48
  files:
50
- - lib/pbf_parser.rb
49
+ - ext/pbf_parser/extconf.rb
51
50
  - ext/pbf_parser/fileformat.pb-c.c
52
- - ext/pbf_parser/osmformat.pb-c.c
53
- - ext/pbf_parser/pbf_parser.c
54
51
  - ext/pbf_parser/fileformat.pb-c.h
52
+ - ext/pbf_parser/osmformat.pb-c.c
55
53
  - ext/pbf_parser/osmformat.pb-c.h
54
+ - ext/pbf_parser/pbf_parser.c
56
55
  - ext/pbf_parser/pbf_parser.h
57
- - ext/pbf_parser/extconf.rb
58
56
  homepage: https://github.com/planas/pbf_parser
59
57
  licenses:
60
58
  - MIT
@@ -65,18 +63,18 @@ require_paths:
65
63
  - lib
66
64
  required_ruby_version: !ruby/object:Gem::Requirement
67
65
  requirements:
68
- - - '>='
66
+ - - ">="
69
67
  - !ruby/object:Gem::Version
70
68
  version: '0'
71
69
  required_rubygems_version: !ruby/object:Gem::Requirement
72
70
  requirements:
73
- - - '>='
71
+ - - ">="
74
72
  - !ruby/object:Gem::Version
75
73
  version: '0'
76
74
  requirements: []
77
75
  rubyforge_project:
78
- rubygems_version: 2.0.3
76
+ rubygems_version: 2.2.2
79
77
  signing_key:
80
78
  specification_version: 4
81
- summary: Just an Open Street Map PBF parser.
79
+ summary: Parse Open Street Map PBF files with ease
82
80
  test_files: []
data/lib/pbf_parser.rb DELETED
@@ -1 +0,0 @@
1
- require 'pbf_parser/pbf_parser'