flydata 0.2.26 → 0.2.27

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
  SHA1:
3
- metadata.gz: e9ac346de420a785776ae309674640dd0afe3ff3
4
- data.tar.gz: b9dcd9d82316b6906517ab008cc02e1024e8851e
3
+ metadata.gz: 31c9862228f6affa3e27e1ffbe4bbd7bd330774e
4
+ data.tar.gz: 5a447f0bb5cc7db2997d90580d7b59360834743f
5
5
  SHA512:
6
- metadata.gz: f2c936dab2a85f0b2b575900218b03472874be5061c2dc72f89753f37ef7f166f31bfd4e4ffb1f47f367b12b1aac3367cc6d10f766a219a45831787456c512c8
7
- data.tar.gz: 138786e380f022dd2ad70a3a96e20a88a379a36fb4ba1ed4636605d81a98c4f65ae86f4f143c87cc0ae09758c5a5a00487d2d60ff78327ceb1e8cfd58a6d8eb8
6
+ metadata.gz: 7bdec134c9d33a26ab24c734220ba639465f2b7f1bc6e49333beebf80a6ee73794d603566aa5ca429b296718f1cdaa52d4ee98d5044b96981a60d64aeca724df
7
+ data.tar.gz: 7242fb4e8e3d1c19da49557238921b5ee5f91b7891f5710d39a136ed25127781c0db7269aece6ab08d167d53196dea16fbf98ddb07ef7b28c82b46d0c38d474d
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.26
1
+ 0.2.27
@@ -173,6 +173,10 @@ class TableRevisionError < RecordDeliveryError
173
173
  def err_code; ErrorCode::TABLE_REVISION_ERROR; end
174
174
  end
175
175
 
176
+ # Table's revision is lower than the record's revision. Should catch up soon.
177
+ class StaleTableRevisionError < TableRevisionError
178
+ end
179
+
176
180
  # Unsupported ALTER TABLE which breaks the tables sync consistency.
177
181
  class BreakingAlterTableError < RecordDeliveryError
178
182
  def err_code; ErrorCode::BREAKING_ALTER_TABLE_ERROR; end
@@ -219,14 +219,18 @@ EOS
219
219
  end
220
220
 
221
221
  APACHE_TIMESTAMP_REGEXP = Regexp.new('^(?<apache_time_format>\[[0-3]\d\/\D{3}\/[1-2]\d{3}:[0-2]\d:[0-5]\d:[0-5]\d ?[\+\-]\d{2}:?\d{2}\])$')
222
+ TIME_REGEXP = Regexp.new('^(?<sign>-)?(?<hour>\d{2,3}):(?<minute>[0-5][0-9]):(?<second>[0-5][0-9](\.\d+)?)$')
222
223
 
223
224
  def self.parse_timestamp(value)
225
+ return nil if value.to_s.empty?
224
226
  if value.kind_of?(Integer) or /^\d+$/ === value
225
227
  # Unix epoch in UTC
226
228
  t = DateTime.strptime(value.to_s, '%s')
227
229
  elsif APACHE_TIMESTAMP_REGEXP.match(value)
228
230
  # apache time format
229
231
  t = DateTime.strptime(value, "[%d/%b/%Y:%H:%M:%S %Z]")
232
+ elsif time_match = TIME_REGEXP.match(value)
233
+ t = convert_time_into_timestamp(time_match)
230
234
  else
231
235
  t = DateTime.parse(value)
232
236
  end
@@ -241,6 +245,16 @@ EOS
241
245
  end
242
246
  end
243
247
 
248
+ STANDARD_DATETIME = DateTime.new(1, 1, 1)
249
+
250
+ def self.convert_time_into_timestamp(time_match)
251
+ sign = time_match[:sign] ? -1 : 1
252
+ STANDARD_DATETIME.dup +
253
+ sign * Rational(time_match[:hour].to_i, 24) +
254
+ sign * Rational(time_match[:minute].to_i, 1440) +
255
+ sign * Rational(time_match[:second].to_f, 86400)
256
+ end
257
+
244
258
  def self.parse_date(value)
245
259
  dt = Date.parse(value)
246
260
  dt.strftime('%Y-%m-%d')
@@ -450,6 +450,149 @@ EOT
450
450
  end
451
451
  end
452
452
 
453
+ describe '.parse_timestamp' do
454
+ let(:value) { nil }
455
+ subject { described_class.parse_timestamp(value) }
456
+
457
+ context 'with w3c format value' do
458
+ context 'with sec' do
459
+ let(:value) { '1997-07-16T19:20:01+01:00' }
460
+ it { is_expected.to eq('1997-07-16 18:20:01.000000') }
461
+ end
462
+ context 'with millisec' do
463
+ let(:value) { '1997-07-16T19:20:01+01:00' }
464
+ it { is_expected.to eq('1997-07-16 18:20:01.000000') }
465
+ end
466
+ end
467
+
468
+ context 'with twitter format value' do
469
+ let(:value) { 'Sat Sep 17 14:48:57 +0900 2011' }
470
+ it { is_expected.to eq('2011-09-17 05:48:57.000000') }
471
+ end
472
+
473
+ context 'with redshift support format value' do
474
+ context 'with sec' do
475
+ let(:value) { '2012-01-23 19:20:15' }
476
+ it { is_expected.to eq('2012-01-23 19:20:15.000000') }
477
+ end
478
+
479
+ context 'with millisec' do
480
+ let(:value) { '2012-01-23 19:20:15.243' }
481
+ it { is_expected.to eq('2012-01-23 19:20:15.243000') }
482
+ end
483
+ context 'with nanosec' do
484
+ let(:value) { '2012-1-23 10:40:5.243312' }
485
+ it { is_expected.to eq('2012-01-23 10:40:05.243312') }
486
+ end
487
+ end
488
+
489
+ context 'with apache format value' do
490
+ let(:value) { '[13/Sep/2006:07:01:53 -0700]' }
491
+ it { is_expected.to eq('2006-09-13 14:01:53.000000') }
492
+ end
493
+
494
+ context 'with timezone value' do
495
+ context 'with sec' do
496
+ let(:value) { '2012-01-23 19:20:15 +0100' }
497
+ it { is_expected.to eq('2012-01-23 18:20:15.000000') }
498
+ end
499
+
500
+ context 'with millisec' do
501
+ let(:value) { '2012-1-23 10:40:5.243 +0230' }
502
+ it { is_expected.to eq('2012-01-23 08:10:05.243000') }
503
+ end
504
+ end
505
+
506
+ context 'with unix epoch time' do
507
+ context 'with string type' do
508
+ let(:value) { '1400705967' }
509
+ it { is_expected.to eq('2014-05-21 20:59:27.000000') }
510
+ end
511
+
512
+ context 'with integer type' do
513
+ let(:value) { 1400705967 }
514
+ it { is_expected.to eq('2014-05-21 20:59:27.000000') }
515
+ end
516
+ end
517
+
518
+ context 'with all zero string' do
519
+ context 'without fraction' do
520
+ let(:value) { '0000-00-00 00:00:00' }
521
+ it { is_expected.to eq('0001-01-01 00:00:00.000000') }
522
+ end
523
+
524
+ context 'with fraction' do
525
+ let(:value) { '0000-00-00 00:00:00.000000' }
526
+ it { is_expected.to eq('0001-01-01 00:00:00.000000') }
527
+ end
528
+ end
529
+
530
+ context 'with time value' do
531
+ context 'when value is positive' do
532
+ context 'with sec' do
533
+ let(:value) { '23:01:24' }
534
+ it { is_expected.to eq('0001-01-01 23:01:24.000000') }
535
+ end
536
+
537
+ context 'with msec' do
538
+ let(:value) { '23:01:24.123456' }
539
+ it { is_expected.to eq('0001-01-01 23:01:24.123456') }
540
+ end
541
+ end
542
+
543
+ context 'when value is bigger than 24 hour' do
544
+ let(:value) { '28:01:24' }
545
+ it { is_expected.to eq('0001-01-02 04:01:24.000000') }
546
+ end
547
+
548
+ context 'when value is mysql max value' do
549
+ let(:value) { '838:59:59' }
550
+ it { is_expected.to eq('0001-02-04 22:59:59.000000') }
551
+ end
552
+
553
+ context 'when value is mysql min value' do
554
+ let(:value) { '-838:59:59' }
555
+ it { is_expected.to eq('0000-11-27 01:00:01.000000') }
556
+ end
557
+
558
+ context 'when value is zero time' do
559
+ let(:value) { '00:00:00' }
560
+ it { is_expected.to eq('0001-01-01 00:00:00.000000') }
561
+ end
562
+
563
+ context 'when value is negative' do
564
+ context 'with sec' do
565
+ let(:value) { '-03:01:24' }
566
+ it { is_expected.to eq('0000-12-31 20:58:36.000000') }
567
+ end
568
+
569
+ context 'with msec' do
570
+ let(:value) { '-03:01:24.123' }
571
+ it { is_expected.to eq('0000-12-31 20:58:35.876999') } # floating-point arithmetic(only negative value)
572
+ end
573
+
574
+ context 'with nsec' do
575
+ let(:value) { '-03:01:24.123456' }
576
+ it { is_expected.to eq('0000-12-31 20:58:35.876543') } # floating-point arithmetic(only negative value)
577
+ end
578
+ end
579
+ end
580
+
581
+ context 'with nil value' do
582
+ let(:value){ nil }
583
+ it { is_expected.to be_nil }
584
+ end
585
+
586
+ context 'with empty string' do
587
+ let(:value){ '' }
588
+ it { is_expected.to be_nil }
589
+ end
590
+
591
+ context 'with invalid value' do
592
+ let(:value) { 'abcd' }
593
+ it { expect{subject}.to raise_error(ArgumentError) }
594
+ end
595
+ end
453
596
  end
454
597
 
455
598
  end
@@ -2,16 +2,14 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: flydata 0.2.26 ruby lib
6
5
 
7
6
  Gem::Specification.new do |s|
8
7
  s.name = "flydata"
9
- s.version = "0.2.26"
8
+ s.version = "0.2.27"
10
9
 
11
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
11
  s.authors = ["Koichi Fujikawa", "Masashi Miyazaki", "Matthew Luu", "Mak Inada", "Sriram NS"]
14
- s.date = "2014-12-31"
12
+ s.date = "2015-01-08"
15
13
  s.description = "FlyData Agent"
16
14
  s.email = "sysadmin@flydata.com"
17
15
  s.executables = ["fdmysqldump", "flydata", "serverinfo"]
@@ -146,7 +144,8 @@ Gem::Specification.new do |s|
146
144
  ]
147
145
  s.homepage = "http://flydata.com/"
148
146
  s.licenses = ["All right reserved."]
149
- s.rubygems_version = "2.2.2"
147
+ s.require_paths = ["lib"]
148
+ s.rubygems_version = "2.0.14"
150
149
  s.summary = "FlyData Agent"
151
150
 
152
151
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flydata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.26
4
+ version: 0.2.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Fujikawa
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-12-31 00:00:00.000000000 Z
15
+ date: 2015-01-08 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rest-client
@@ -566,7 +566,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
566
566
  version: '0'
567
567
  requirements: []
568
568
  rubyforge_project:
569
- rubygems_version: 2.2.2
569
+ rubygems_version: 2.0.14
570
570
  signing_key:
571
571
  specification_version: 4
572
572
  summary: FlyData Agent