postfix_status_line 0.2.2 → 0.2.3

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: 79c92235629b68393a9634f1fcd9e260a2b7efc3
4
- data.tar.gz: c2796079c6c105b893dd2b2455151b564558c390
3
+ metadata.gz: df9ab0374f13af0d782be989d057f95a6aa474ed
4
+ data.tar.gz: 768d579c879a6b5209405143775bc7f0ad79e027
5
5
  SHA512:
6
- metadata.gz: 275c97db7c00e8006ef01f4f992ec046fd35cb5090bf5562ef7b503b320abe599e0ae6e2f9aa96faa04b34c230fe21e8f223a332145e6a52f1d5445d3c83fe5c
7
- data.tar.gz: 5eb060a7c8202d70633fc4a60ba068d610240a780e3c145db0d2b4c5c8b71ff4a8fa4ddac99a5b6e0f080e17727d546888f9b9595d2f8a9c8f52f7592656797e
6
+ metadata.gz: 980943454a02e5151a986a2795d834bdb095018b876856951ec474d1db7d0dcfd3c8e59e816240737331b9d3fff502a3678bc369a2f3aa02bfca22a02259af04
7
+ data.tar.gz: b7153669aa950d74f1c0bb3e7ad4fd5874d974a98810beeeed41dd3840a882150bde2c5d1559a0b96b626f518a52e931fe88da8b1f19c1182faf05d2961d2e1f
data/README.md CHANGED
@@ -50,3 +50,86 @@ PostfixStatusLine.parse(status_line)
50
50
  ```ruby
51
51
  PostfixStatusLine.parse(status_line, hash: true)
52
52
  ```
53
+
54
+ ### Parse time
55
+
56
+ ```ruby
57
+ PostfixStatusLine.parse(status_line, parse_time: true)
58
+ ```
59
+
60
+ ## Benchmark (on EC2/t2.micro)
61
+
62
+ ### Script
63
+
64
+ ```ruby
65
+ #!/usr/bin/env ruby
66
+ require 'benchmark'
67
+ require 'postfix_status_line'
68
+
69
+ it = 5
70
+ n = 500000
71
+
72
+ status_lines = "Feb 27 09:02:37 MyHOSTNAME postfix/smtp[26490]: D53A72713E5: to=<myemail@bellsouth.net>, relay=gateway-f1.isp.att.net[204.127.217.16]:25, delay=0.57, delays=0.11/0.03/0.23/0.19, dsn=2.0.0, status=sent (250 ok ; id=20120227140036M0700qer4ne)"
73
+
74
+ {
75
+ psl: {mask: false},
76
+ psl_m: {},
77
+ psl_h: {hash: true},
78
+ psl_t: {parse_time: true},
79
+ }.each do |name, options|
80
+ Benchmark.bm(20, ">sec/prs:", ">prs/sec:") do |x|
81
+ rs = []
82
+
83
+ it.times do |i|
84
+ i += 1
85
+
86
+ rs << x.report("#{Time.now.strftime('%X')} #{name}(#{i}):") do
87
+ for i in 1..n
88
+ PostfixStatusLine.parse(status_lines, options)
89
+ end
90
+ end
91
+ end
92
+
93
+ pps = rs.inject(&:+) / it / n
94
+ tp = Benchmark::Tms.new(1/pps.utime, 1/pps.stime, 1/pps.cutime, 1/pps.cstime, 1/pps.real)
95
+ [pps, tp]
96
+ end
97
+ end
98
+ ```
99
+
100
+ ### Result
101
+
102
+ ```
103
+ user system total real
104
+ 02:26:06 psl(1): 2.810000 0.000000 2.810000 ( 2.807900)
105
+ 02:26:09 psl(2): 2.820000 0.000000 2.820000 ( 2.819920)
106
+ 02:26:12 psl(3): 2.810000 0.000000 2.810000 ( 2.809408)
107
+ 02:26:14 psl(4): 2.810000 0.000000 2.810000 ( 2.810345)
108
+ 02:26:17 psl(5): 2.800000 0.000000 2.800000 ( 2.802439)
109
+ >sec/prs: 0.000006 0.000000 0.000006 ( 0.000006)
110
+ >prs/sec: 177935.943060 Inf Inf (177935.783843)
111
+ user system total real
112
+ 02:26:20 psl_m(1): 2.940000 0.000000 2.940000 ( 2.942580)
113
+ 02:26:23 psl_m(2): 2.880000 0.000000 2.880000 ( 2.879812)
114
+ 02:26:26 psl_m(3): 2.900000 0.000000 2.900000 ( 2.900414)
115
+ 02:26:29 psl_m(4): 2.840000 0.000000 2.840000 ( 2.836515)
116
+ 02:26:32 psl_m(5): 2.790000 0.000000 2.790000 ( 2.792500)
117
+ >sec/prs: 0.000006 0.000000 0.000006 ( 0.000006)
118
+ >prs/sec: 174216.027875 Inf Inf (174193.923151)
119
+ user system total real
120
+ 02:26:34 psl_h(1): 4.990000 0.000000 4.990000 ( 4.987470)
121
+ 02:26:39 psl_h(2): 5.000000 0.000000 5.000000 ( 4.999526)
122
+ 02:26:44 psl_h(3): 4.950000 0.000000 4.950000 ( 4.944881)
123
+ 02:26:49 psl_h(4): 5.030000 0.000000 5.030000 ( 5.033834)
124
+ 02:26:54 psl_h(5): 5.010000 0.000000 5.010000 ( 5.031988)
125
+ >sec/prs: 0.000010 0.000000 0.000010 ( 0.000010)
126
+ >prs/sec: 100080.064051 Inf Inf (100009.204039)
127
+ user system total real
128
+ 02:26:59 psl_t(1): 4.060000 0.340000 4.400000 ( 4.397266)
129
+ 02:27:04 psl_t(2): 3.900000 0.320000 4.220000 ( 4.226741)
130
+ 02:27:08 psl_t(3): 3.750000 0.380000 4.130000 ( 4.125684)
131
+ 02:27:12 psl_t(4): 3.830000 0.280000 4.110000 ( 4.097343)
132
+ 02:27:16 psl_t(5): 3.770000 0.320000 4.090000 ( 4.097630)
133
+ >sec/prs: 0.000008 0.000001 0.000008 ( 0.000008)
134
+ >prs/sec: 129466.597618 1524390.243902 Inf (119362.140704)
135
+ ```
@@ -37,6 +37,16 @@ static bool digest_sha512(char *str, char *salt, size_t salt_len, char buf[]) {
37
37
  }
38
38
  #endif // HAVE_OPENSSL_SHA_H
39
39
 
40
+ static bool rb_value_to_bool(VALUE v_value) {
41
+ switch (TYPE(v_value)) {
42
+ case T_FALSE:
43
+ case T_NIL:
44
+ return false;
45
+ default:
46
+ return true;
47
+ }
48
+ }
49
+
40
50
  static char *split(char **orig_str, const char *delim, size_t delim_len) {
41
51
  char *str = *orig_str;
42
52
  char *ptr = strstr((const char *) str, delim);
@@ -283,22 +293,66 @@ static void split_line2(char *str, bool mask, VALUE hash, bool include_hash, cha
283
293
  }
284
294
  }
285
295
 
286
- static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask, VALUE v_hash, VALUE v_salt) {
296
+ static int get_year() {
297
+ time_t now = time(NULL);
298
+
299
+ if (now == -1) {
300
+ return -1;
301
+ }
302
+
303
+ struct tm *t = localtime(&now);
304
+
305
+ if (t == NULL) {
306
+ return -1;
307
+ }
308
+
309
+ return t->tm_year;
310
+ }
311
+
312
+ static void put_epoch(char *time_str, VALUE hash) {
313
+ time_t ts;
314
+ struct tm parsed;
315
+
316
+ if (strptime(time_str, "%b %d %H:%M:%S", &parsed) == NULL) {
317
+ return;
318
+ }
319
+
320
+ int this_year = get_year();
321
+
322
+ if (this_year == -1) {
323
+ return;
324
+ }
325
+
326
+ parsed.tm_year = this_year;
327
+ parsed.tm_isdst = 0;
328
+
329
+ ts = mktime(&parsed);
330
+
331
+ if (ts == -1) {
332
+ return;
333
+ }
334
+
335
+ rb_hash_aset(hash, rb_str_new2("epoch"), LONG2NUM(ts));
336
+ }
337
+
338
+ static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask, VALUE v_hash, VALUE v_salt, VALUE v_parse_time) {
287
339
  Check_Type(v_str, T_STRING);
288
340
 
289
341
  char *str = RSTRING_PTR(v_str);
290
342
  size_t len = RSTRING_LEN(v_str);
291
- bool mask = true;
343
+
344
+ if (len < 1) {
345
+ return Qnil;
346
+ }
347
+
348
+ bool mask = rb_value_to_bool(v_mask);
349
+ bool parse_time = rb_value_to_bool(v_parse_time);
292
350
 
293
351
  bool include_hash = false;
294
352
  char *salt = NULL;
295
353
  size_t salt_len = -1;
296
354
 
297
- switch (TYPE(v_hash)) {
298
- case T_FALSE:
299
- case T_NIL:
300
- break;
301
- default:
355
+ if (rb_value_to_bool(v_hash)) {
302
356
  #ifdef HAVE_OPENSSL_SHA_H
303
357
  include_hash = true;
304
358
 
@@ -312,16 +366,6 @@ static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask,
312
366
  #endif // HAVE_OPENSSL_SHA_H
313
367
  }
314
368
 
315
- switch (TYPE(v_mask)) {
316
- case T_FALSE:
317
- case T_NIL:
318
- mask = false;
319
- }
320
-
321
- if (len < 1) {
322
- return Qnil;
323
- }
324
-
325
369
  char buf[len + 1];
326
370
  strncpy(buf, str, len);
327
371
  buf[len] = '\0';
@@ -338,6 +382,10 @@ static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask,
338
382
  rb_hash_aset(hash, rb_str_new2("process"), rb_str_new2(process));
339
383
  rb_hash_aset(hash, rb_str_new2("queue_id"), rb_str_new2(queue_id));
340
384
 
385
+ if (parse_time) {
386
+ put_epoch(tm, hash);
387
+ }
388
+
341
389
  split_line2(attrs, mask, hash, include_hash, salt, salt_len);
342
390
 
343
391
  return hash;
@@ -346,5 +394,5 @@ static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask,
346
394
  void Init_postfix_status_line_core() {
347
395
  VALUE rb_mPostfixStatusLine = rb_define_module("PostfixStatusLine");
348
396
  VALUE rb_mPostfixStatusLineCore = rb_define_module_under(rb_mPostfixStatusLine, "Core");
349
- rb_define_module_function(rb_mPostfixStatusLineCore, "parse", rb_postfix_status_line_parse, 4);
397
+ rb_define_module_function(rb_mPostfixStatusLineCore, "parse", rb_postfix_status_line_parse, 5);
350
398
  }
@@ -1,7 +1,12 @@
1
1
  #ifndef __POSTFIX_STATUS_LINE_CORE_H__
2
2
  #define __POSTFIX_STATUS_LINE_CORE_H__
3
3
 
4
+ #ifndef _XOPEN_SOURCE
5
+ #define _XOPEN_SOURCE
6
+ #endif
7
+
4
8
  #include <stdbool.h>
9
+ #include <time.h>
5
10
 
6
11
  #ifdef HAVE_OPENSSL_SHA_H
7
12
  #include <openssl/sha.h>
@@ -6,7 +6,8 @@ module PostfixStatusLine
6
6
  mask = options.has_key?(:mask) ? options[:mask] : true
7
7
  hash = options[:hash]
8
8
  salt = options[:salt]
9
- PostfixStatusLine::Core.parse(str, mask, hash, salt)
9
+ parse_time = options[:parse_time]
10
+ PostfixStatusLine::Core.parse(str, mask, hash, salt, parse_time)
10
11
  end
11
12
  module_function :parse
12
13
  end
@@ -1,3 +1,3 @@
1
1
  module PostfixStatusLine
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postfix_status_line
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-26 00:00:00.000000000 Z
11
+ date: 2015-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler