influxdb-lineprotocol-parser 0.0.3 → 0.0.4

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
  SHA256:
3
- metadata.gz: a8e433f4f34e310f1886a551df2e5673f8f3ca4831f786cb22bb490b31740dc5
4
- data.tar.gz: 5fd20ecf8b09f2fa682fff68dad78fdecd6c47c87f9cbe0d887ba57d4978565b
3
+ metadata.gz: e956120bd53a5f395ccc4fc687eb9a629a515930adbd3e87cdbd56baab31873a
4
+ data.tar.gz: 1d5dbe0f72cc134f389e4d0e09c6e969caf597218167d360042bad9ef0331061
5
5
  SHA512:
6
- metadata.gz: e0273635beaf425e9d284219ac2e513bb3bc467fd10f65e6e9600e368743bfa26ac5e22edba50a50778e20313355dd3a1c79b9ecc6e89b8157626c3db3efe627
7
- data.tar.gz: c8e24fde968761c85a6eecaa6d6a51bde1976a950b167bed45b53636e70644d5a18f9394bf857473d813df9bfa7915bd2f62a00d8e4f8257ec1173ce32b453cf
6
+ metadata.gz: cd0b6ef6ceb0dd5cc242e664f05dd4396a6b24f099315b2e57a2c97e3e71140ef9ccb10e603350c8c352737e0f426085b1f0d2b2768d99a8919e5d633e2123a9
7
+ data.tar.gz: ee0f7800da3759015a52d35e384cf13e7d88a0be34109cdbd2f569430a6204334724f10a06c1751b03122acdd57ae0b59374e7425c53c739135642e865d2bde9
@@ -27,16 +27,20 @@ module InfluxDB
27
27
  # Line Protocol parser.
28
28
  #
29
29
  class Parser
30
- def initialize(logger: nil, log_level: :warn, escapes: nil)
31
- @log = logger || ::Logger.new(STDERR)
32
- @log.level = log_level
30
+ def initialize(logger: nil, escapes: nil)
31
+ if logger
32
+ @log = logger
33
+ else
34
+ @log = ::Logger.new(STDERR)
35
+ @log.level = :warn
36
+ end
33
37
  case escapes
34
38
  when :compat
35
39
  @unescapes = InfluxDB::LineProtocol::CompatUnescapes.new
36
40
  else
37
41
  @unescapes = InfluxDB::LineProtocol::Unescapes.new
38
42
  end
39
- enter_initial
43
+ enter_whitespace0
40
44
  end
41
45
 
42
46
  ##
@@ -64,7 +68,7 @@ module InfluxDB
64
68
  else
65
69
  points << @point
66
70
  end
67
- enter_initial
71
+ enter_whitespace0
68
72
  end
69
73
  end
70
74
 
@@ -73,9 +77,9 @@ module InfluxDB
73
77
 
74
78
  private
75
79
 
76
- def enter_initial
80
+ def enter_whitespace0
77
81
  @point = nil
78
- @state = :initial
82
+ @state = :whitespace0
79
83
  @escaped = false
80
84
  @buf = nil
81
85
  @key = nil
@@ -114,7 +118,7 @@ module InfluxDB
114
118
 
115
119
 
116
120
 
117
- def initial(buf, i, len)
121
+ def whitespace0(buf, i, len)
118
122
  # whitespace consumes TAB, SPACE, and NULL.
119
123
  # This method consumes NEWLINE, HASH, and COMMA.
120
124
  # BACKSLASH and EQUAL (of the special bytes) are valid measurement starts; they are not consumed.
@@ -123,7 +127,7 @@ module InfluxDB
123
127
  when nil # just whitespace
124
128
  len
125
129
  when COMMA
126
- @log.error "initial: missing measurement"
130
+ @log.error "whitespace0: missing measurement"
127
131
  @state = :invalid
128
132
  i + 1
129
133
  when HASH # comment
@@ -133,7 +137,6 @@ module InfluxDB
133
137
  i + 1
134
138
  else
135
139
  # don't advance i because the byte belongs to measurement
136
- @log.info "initial: start measurement at offset #{i}"
137
140
  @state = :measurement
138
141
  i
139
142
  end
@@ -162,9 +165,8 @@ module InfluxDB
162
165
  return i
163
166
  when SPACE # start of field set
164
167
  @point = {series: decode(buf, start, i-1), values: {}}
165
- @state = :field_key
166
- i, _ = whitespace(buf, i + 1, len)
167
- return i
168
+ @state = :whitespace1
169
+ return i + 1
168
170
  else # part of measurement
169
171
  i += 1
170
172
  end
@@ -252,6 +254,21 @@ module InfluxDB
252
254
  i
253
255
  end
254
256
 
257
+ def whitespace1(buf, i, len)
258
+ i, c = whitespace(buf, i, len)
259
+ case c
260
+ when nil
261
+ len
262
+ when NEWLINE
263
+ @log.error("whitespace1: missing fields")
264
+ @state = :invalid
265
+ i
266
+ else
267
+ @state = :field_key
268
+ i
269
+ end
270
+ end
271
+
255
272
  def field_key(buf, i, len)
256
273
  start = i
257
274
  while i < len
@@ -340,7 +357,7 @@ module InfluxDB
340
357
  value = decode(buf, start, i-1)
341
358
  if value.nil?
342
359
  @log.error("field value boolean: invalid boolean")
343
- enter_initial
360
+ enter_whitespace0
344
361
  return i + 1
345
362
  end
346
363
  @point[:values][@key] = value
@@ -356,8 +373,7 @@ module InfluxDB
356
373
  end
357
374
  @point[:values][@key] = value
358
375
  @key = nil
359
- @state = :timestamp
360
- i, _ = whitespace(buf, i + 1, len)
376
+ @state = :whitespace2
361
377
  return i
362
378
  else
363
379
  i += 1
@@ -414,8 +430,7 @@ module InfluxDB
414
430
  end
415
431
  @point[:values][@key] = value
416
432
  @key = nil
417
- @state = :timestamp
418
- i, _ = whitespace(buf, i + 1, len)
433
+ @state = :whitespace2
419
434
  return i
420
435
  else
421
436
  i += 1
@@ -475,8 +490,7 @@ module InfluxDB
475
490
  @state = :complete
476
491
  i + 1
477
492
  when SPACE
478
- @state = :timestamp
479
- i, _ = whitespace(buf, i, len)
493
+ @state = :whitespace2
480
494
  i
481
495
  else
482
496
  @state = :invalid
@@ -487,6 +501,21 @@ module InfluxDB
487
501
  end
488
502
  end
489
503
 
504
+ def whitespace2(buf, i, len)
505
+ i, c = whitespace(buf, i, len)
506
+ case c
507
+ when nil
508
+ len
509
+ when NEWLINE
510
+ @log.error("whitespace2: missing timestamp")
511
+ @state = :invalid
512
+ i
513
+ else
514
+ @state = :timestamp
515
+ i
516
+ end
517
+ end
518
+
490
519
  def timestamp(buf, i, len)
491
520
  start = i
492
521
  while i < len
@@ -508,7 +537,6 @@ module InfluxDB
508
537
  return i
509
538
  end
510
539
  @point[:timestamp] = value
511
- @key = nil
512
540
  @state = :complete
513
541
  return i + 1
514
542
  else
@@ -525,7 +553,7 @@ module InfluxDB
525
553
  def comment(buf, i, len)
526
554
  i = line_end(buf, i, len)
527
555
  if i < len
528
- enter_initial
556
+ enter_whitespace0
529
557
  i += 1
530
558
  end
531
559
  i
@@ -534,7 +562,7 @@ module InfluxDB
534
562
  def invalid(buf, i, len)
535
563
  i = line_end(buf, i, len)
536
564
  if i < len
537
- enter_initial
565
+ enter_whitespace0
538
566
  i += 1
539
567
  end
540
568
  i
@@ -581,11 +609,11 @@ module InfluxDB
581
609
  when :measurement
582
610
  @unescapes.unescape(:measurement, str)
583
611
  when :tag_key
584
- str
612
+ @unescapes.unescape(:tag_key, str)
585
613
  when :tag_value
586
- str
614
+ @unescapes.unescape(:tag_value, str)
587
615
  when :field_key
588
- str
616
+ @unescapes.unescape(:field_key, str)
589
617
  when :field_value_boolean
590
618
  case str
591
619
  when 't', 'T', 'true', 'True'
@@ -598,7 +626,7 @@ module InfluxDB
598
626
  end
599
627
  when :field_value_numeric
600
628
  case str
601
- when /^[+-]?[0-9]*\.[0-9]*([eE][+-]?[0-9]+)?$/
629
+ when /^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/
602
630
  str.to_f
603
631
  when /^[+-]?[0-9]+[ui]$/
604
632
  str.to_i
@@ -607,7 +635,7 @@ module InfluxDB
607
635
  nil
608
636
  end
609
637
  when :field_value_string
610
- str
638
+ @unescapes.unescape(:string, str)
611
639
  when :timestamp
612
640
  case str
613
641
  when /^-?[0-9]+$/
@@ -639,27 +667,49 @@ module InfluxDB
639
667
  end # Parser
640
668
 
641
669
  class CompatUnescapes
642
- def unescape(field, value)
670
+ def unescape(field, str)
643
671
  case field
644
672
  when :measurement
645
- value.gsub(/\\([, ])/, '\\1')
646
- # escaped comma anywhere
647
- # escaped space anywhere
673
+ # escaped comma or space anywhere
674
+ str.gsub(/\\([, ])/, '\\1')
675
+ when :tag_key, :tag_value, :field_key
676
+ # escaped comma, equals, or space anywhere
677
+ str.gsub(/\\([,= ])/, '\\1')
678
+ when :string
679
+ # escaped quote anywhere
680
+ str.gsub(/\\"/, '"')
648
681
  end
649
682
  end
650
683
  end
651
684
 
652
685
  class Unescapes
653
- def unescape(field, value)
686
+ def unescape(field, str)
654
687
  case field
655
688
  when :measurement
656
689
  # 1. escaped hash, null, or tab at the beginning
657
690
  # 2. escaped comma, space, or newline anywhere
658
691
  # 3. escaped backslash at the end
659
- value
692
+ str
660
693
  .sub(/^\\([#\0\t])/, '\\1')
661
694
  .gsub(/\\([, \n])/, '\\1')
662
695
  .sub(/\\\\$/, '\\')
696
+ when :tag_key, :tag_value
697
+ # 1. escaped comma, equals, newline, or space anywhere
698
+ # 2. escaped backslash at the end
699
+ str
700
+ .gsub(/\\([,=\n ])/, '\\1')
701
+ .sub(/\\\\$/, '\\')
702
+ when :field_key
703
+ # 1. escaped null or tab at beginning
704
+ # 2. escaped comma, equals, newline, or space anywhere
705
+ # 3. escaped backslash at the end
706
+ str
707
+ .sub(/^\\([\0\t])/, '\\1')
708
+ .gsub(/\\([,=\n ])/, '\\1')
709
+ .sub(/\\\\$/, '\\')
710
+ when :string
711
+ # escaped quote anywhere
712
+ str.gsub(/\\"/, '"')
663
713
  end
664
714
  end
665
715
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: influxdb-lineprotocol-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikko Värri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-16 00:00:00.000000000 Z
11
+ date: 2019-05-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'Streaming parser for InfluxDB line protocol.
13
+ description: 'Incremental (a.k.a streaming) parser for InfluxDB Line Protocol.
14
14
 
15
15
  '
16
16
  email: mikko@varri.fi
@@ -43,5 +43,5 @@ requirements: []
43
43
  rubygems_version: 3.0.3
44
44
  signing_key:
45
45
  specification_version: 4
46
- summary: InfluxDB line protocol parser
46
+ summary: InfluxDB Line Protocol parser
47
47
  test_files: []