influxdb-lineprotocol-parser 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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: []