gnista 0.0.1 → 0.0.2

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: bab3ebb294b61581358c5cec1b5c35d58278068f
4
- data.tar.gz: 46ce784095d0f7ebfa35ed4292c8666572ba6f71
3
+ metadata.gz: 18a1c35381152407bbbdd6694e04424893936c13
4
+ data.tar.gz: 94f3a0363f878f04a6d2b4572a1a10b56ec93f2f
5
5
  SHA512:
6
- metadata.gz: b6758ef75988f46af845a974ab7e50398fc87251c1b070dfa4d2fd96679d0de075df5f3fb3bc2446b506b591811317943536173805ae0a1afc0a316abe9f9ccc
7
- data.tar.gz: dc6f0af77d91f73180f466556b1275e9c7b86650a849aedf4e4cb524ff4b16f8ac48b5eec1c710d0230fa7b6b84c8f3aba8436f4fff8de0e3392726c84aa6672
6
+ metadata.gz: b5d83b90fbe736a4d9f7ae3f22c268ccd5ab1d930276fc84f78ee2f93cf51ef9c53403a503e539320f6d1fd5d9f6498ee0601e064f3c1d091b2dc67d4c520ca8
7
+ data.tar.gz: 3c5e593188384bd0f7d2e61652c35d4f04ba32e1033ee2141e4e8ac549fea19129752f28db81c87bda863ec8788df53bd3e36509cba11d905fa9e7d6e72cd01b
data/HISTORY.md CHANGED
@@ -1,5 +1,20 @@
1
+ # Version 0.0.2
2
+
3
+ Release date 2013-09-12
4
+
5
+ ### Added
6
+
7
+ * ```each``` in logreader now provides a __type__ parameter containing either :put or :delete.
8
+
9
+ ### Fixed
10
+
11
+ * Fix memory leak on ```each/get``` failure.
12
+ * Two allocations per call instead of one each entry in ```each```.
13
+ * ```each``` in logreader returns nil instead of empty string.
14
+
15
+
1
16
  # Version 0.0.1
2
17
 
3
18
  Release date 2013-09-11
4
19
 
5
- ### Changed / Added / Fixed / Removed
20
+ __Initial release__
data/README.md CHANGED
@@ -35,7 +35,8 @@ logwriter.del "key" # delete entry
35
35
  logwriter.flush
36
36
 
37
37
  logreader = Gnista::Logreader.new "mylog.log"
38
- logreader.each {|key,value| puts key, value }
38
+ logreader.each {|key,value,type| puts key, value, type }
39
+ # => "key", "value"/nil, :put/:delete
39
40
 
40
41
  Gnista::Hash.write "mylog.hash", "mylog.log" # no preferred hash size
41
42
  Gnista::Hash.write "mylog.hash", "mylog.log", 4 # 32 bit murmurhash3_x86_32
@@ -59,15 +60,17 @@ hash.close
59
60
 
60
61
  ## Contributing
61
62
 
63
+ __Step-by-step:__
64
+
65
+ 1. Fork it
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Write some code
68
+ 4. Build and test
69
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
70
+ 6. Push to the branch (`git push origin my-new-feature`)
71
+ 7. Create new Pull Request
72
+
62
73
  Use the following commands to build the native extensions and test:
63
74
 
64
75
  $ rake make
65
76
  $ rake test
66
-
67
- Then:
68
-
69
- 1. Fork it
70
- 2. Create your feature branch (`git checkout -b my-new-feature`)
71
- 3. Commit your changes (`git commit -am 'Add some feature'`)
72
- 4. Push to the branch (`git push origin my-new-feature`)
73
- 5. Create new Pull Request
data/ext/gnista/gnista.c CHANGED
@@ -7,18 +7,18 @@ typedef int bool;
7
7
 
8
8
 
9
9
  typedef struct instance_logwriter {
10
- sparkey_logwriter *logwriter;
11
- int open;
10
+ sparkey_logwriter *logwriter;
11
+ int open;
12
12
  } instance_logwriter;
13
13
 
14
14
  typedef struct instance_logreader {
15
- sparkey_logreader *logreader;
16
- int open;
15
+ sparkey_logreader *logreader;
16
+ int open;
17
17
  } instance_logreader;
18
18
 
19
19
  typedef struct instance_hashreader {
20
- sparkey_hashreader *hashreader;
21
- int open;
20
+ sparkey_hashreader *hashreader;
21
+ int open;
22
22
  } instance_hashreader;
23
23
 
24
24
  /********************************************************************************/
@@ -44,7 +44,7 @@ static void dealloc_logwriter(void *p) {
44
44
  instance_logwriter *i_logwriter = p;
45
45
 
46
46
  if (i_logwriter->open) {
47
- sparkey_returncode returncode;
47
+ sparkey_returncode returncode;
48
48
  returncode = sparkey_logwriter_close(&i_logwriter->logwriter);
49
49
 
50
50
  if (returncode != SPARKEY_SUCCESS) {
@@ -57,7 +57,7 @@ static void dealloc_logwriter(void *p) {
57
57
 
58
58
  static VALUE alloc_logwriter(VALUE klass) {
59
59
  instance_logwriter *i_logwriter = ALLOC(instance_logwriter);
60
- return Data_Wrap_Struct(klass, 0, dealloc_logwriter, i_logwriter);
60
+ return Data_Wrap_Struct(klass, 0, dealloc_logwriter, i_logwriter);
61
61
  }
62
62
 
63
63
  static instance_logwriter* get_logwriter(VALUE self) {
@@ -182,7 +182,7 @@ static void dealloc_logreader(void *p) {
182
182
 
183
183
  static VALUE alloc_logreader(VALUE klass) {
184
184
  instance_logreader *i_logreader = ALLOC(instance_logreader);
185
- return Data_Wrap_Struct(klass, 0, dealloc_logreader, i_logreader);
185
+ return Data_Wrap_Struct(klass, 0, dealloc_logreader, i_logreader);
186
186
  }
187
187
 
188
188
  static instance_logreader* get_logreader(VALUE self) {
@@ -229,41 +229,54 @@ static VALUE method_logreader_each(VALUE self) {
229
229
  raise_sparkey(returncode);
230
230
  }
231
231
 
232
+ VALUE put_sym = ID2SYM(rb_intern("put"));
233
+ VALUE del_sym = ID2SYM(rb_intern("delete"));
234
+ uint8_t *keybuf = malloc(sparkey_logreader_maxkeylen(i_logreader->logreader));
235
+ uint8_t *valuebuf = malloc(sparkey_logreader_maxvaluelen(i_logreader->logreader));
232
236
  while (1) {
233
237
  returncode = sparkey_logiter_next(logiter, i_logreader->logreader);
234
238
 
235
239
  if (sparkey_logiter_state(logiter) != SPARKEY_ITER_ACTIVE) {
236
- break;
240
+ break;
237
241
  }
238
242
 
239
243
  uint64_t wanted_keylen = sparkey_logiter_keylen(logiter);
240
- uint8_t *keybuf = malloc(wanted_keylen);
241
244
  uint64_t actual_keylen;
242
245
  returncode = sparkey_logiter_fill_key(logiter, i_logreader->logreader, wanted_keylen, keybuf, &actual_keylen);
243
246
 
244
247
  if (returncode != SPARKEY_SUCCESS) {
248
+ free(keybuf);
249
+ free(valuebuf);
245
250
  raise_sparkey(returncode);
246
251
  } else if (wanted_keylen != actual_keylen) {
252
+ free(keybuf);
253
+ free(valuebuf);
247
254
  rb_raise(GnistaException, "Corrupted read in logreader.");
248
255
  }
249
256
 
250
- uint64_t wanted_valuelen = sparkey_logiter_valuelen(logiter);
251
- uint8_t *valuebuf = malloc(wanted_valuelen);
252
- uint64_t actual_valuelen;
253
- returncode = sparkey_logiter_fill_value(logiter, i_logreader->logreader, wanted_valuelen, valuebuf, &actual_valuelen);
254
-
255
- if (returncode != SPARKEY_SUCCESS) {
256
- raise_sparkey(returncode);
257
- } else if (wanted_valuelen != actual_valuelen) {
258
- rb_raise(GnistaException, "Corrupted read in logreader.");
257
+ if (sparkey_logiter_type(logiter) == SPARKEY_ENTRY_PUT) {
258
+ uint64_t wanted_valuelen = sparkey_logiter_valuelen(logiter);
259
+ uint64_t actual_valuelen;
260
+ returncode = sparkey_logiter_fill_value(logiter, i_logreader->logreader, wanted_valuelen, valuebuf, &actual_valuelen);
261
+
262
+ if (returncode != SPARKEY_SUCCESS) {
263
+ free(keybuf);
264
+ free(valuebuf);
265
+ raise_sparkey(returncode);
266
+ } else if (wanted_valuelen != actual_valuelen) {
267
+ free(keybuf);
268
+ free(valuebuf);
269
+ rb_raise(GnistaException, "Corrupted read in logreader.");
270
+ }
271
+
272
+ rb_yield_values(3, rb_str_new((char *)keybuf, actual_keylen), rb_str_new((char *)valuebuf, actual_valuelen), put_sym);
273
+ } else {
274
+ rb_yield_values(3, rb_str_new((char *)keybuf, actual_keylen), Qnil, del_sym);
259
275
  }
260
-
261
- rb_yield_values(2, rb_str_new((char *)keybuf, actual_keylen), rb_str_new((char *)valuebuf, actual_valuelen));
262
-
263
- free(keybuf);
264
- free(valuebuf);
265
276
  }
266
277
 
278
+ free(keybuf);
279
+ free(valuebuf);
267
280
  sparkey_logiter_close(&logiter);
268
281
 
269
282
  return Qnil;
@@ -294,7 +307,7 @@ static void dealloc_hashreader(void *p) {
294
307
 
295
308
  static VALUE alloc_hashreader(VALUE klass) {
296
309
  instance_hashreader *i_hashreader = ALLOC(instance_hashreader);
297
- return Data_Wrap_Struct(klass, 0, dealloc_hashreader, i_hashreader);
310
+ return Data_Wrap_Struct(klass, 0, dealloc_hashreader, i_hashreader);
298
311
  }
299
312
 
300
313
  static instance_hashreader* get_hashreader(VALUE self) {
@@ -362,48 +375,57 @@ static VALUE method_hash_each(VALUE self) {
362
375
  instance_hashreader *i_hashreader = get_hashreader(self);
363
376
  sparkey_logiter *logiter;
364
377
  check_open(i_hashreader->open);
378
+ sparkey_logreader *logreader = sparkey_hash_getreader(i_hashreader->hashreader);
365
379
 
366
- returncode = sparkey_logiter_create(&logiter, sparkey_hash_getreader(i_hashreader->hashreader));
380
+ returncode = sparkey_logiter_create(&logiter, logreader);
367
381
 
368
382
  if (returncode != SPARKEY_SUCCESS) {
369
383
  raise_sparkey(returncode);
370
384
  }
371
385
 
386
+ uint8_t *keybuf = malloc(sparkey_logreader_maxkeylen(logreader));
387
+ uint8_t *valuebuf = malloc(sparkey_logreader_maxvaluelen(logreader));
372
388
  while (1) {
373
389
  returncode = sparkey_logiter_hashnext(logiter, i_hashreader->hashreader);
374
390
 
375
391
  if (sparkey_logiter_state(logiter) != SPARKEY_ITER_ACTIVE) {
376
- break;
392
+ break;
377
393
  }
378
394
 
379
395
  uint64_t wanted_keylen = sparkey_logiter_keylen(logiter);
380
- uint8_t *keybuf = malloc(wanted_keylen);
381
396
  uint64_t actual_keylen;
382
397
  returncode = sparkey_logiter_fill_key(logiter, sparkey_hash_getreader(i_hashreader->hashreader), wanted_keylen, keybuf, &actual_keylen);
383
398
 
384
399
  if (returncode != SPARKEY_SUCCESS) {
400
+ free(keybuf);
401
+ free(valuebuf);
385
402
  raise_sparkey(returncode);
386
403
  } else if (wanted_keylen != actual_keylen) {
404
+ free(keybuf);
405
+ free(valuebuf);
387
406
  rb_raise(GnistaException, "Corrupt entry in logreader.");
388
407
  }
389
408
 
390
409
  uint64_t wanted_valuelen = sparkey_logiter_valuelen(logiter);
391
- uint8_t *valuebuf = malloc(wanted_valuelen);
392
410
  uint64_t actual_valuelen;
393
411
  returncode = sparkey_logiter_fill_value(logiter, sparkey_hash_getreader(i_hashreader->hashreader), wanted_valuelen, valuebuf, &actual_valuelen);
394
412
 
395
413
  if (returncode != SPARKEY_SUCCESS) {
414
+ free(keybuf);
415
+ free(valuebuf);
396
416
  raise_sparkey(returncode);
397
417
  } else if (wanted_valuelen != actual_valuelen) {
418
+ free(keybuf);
419
+ free(valuebuf);
398
420
  rb_raise(GnistaException, "Corrupt entry in logreader.");
399
421
  }
400
422
 
401
423
  rb_yield_values(2, rb_str_new((char *)keybuf, actual_keylen), rb_str_new((char *)valuebuf, actual_valuelen));
402
424
 
403
- free(keybuf);
404
- free(valuebuf);
405
425
  }
406
426
 
427
+ free(keybuf);
428
+ free(valuebuf);
407
429
  sparkey_logiter_close(&logiter);
408
430
 
409
431
  return Qnil;
@@ -426,7 +448,7 @@ static VALUE method_hash_get(VALUE self, VALUE key) {
426
448
  returncode = sparkey_hash_get(i_hashreader->hashreader, (uint8_t*)RSTRING_PTR(key), RSTRING_LEN(key), logiter);
427
449
 
428
450
  if (sparkey_logiter_state(logiter) != SPARKEY_ITER_ACTIVE) {
429
- return Qnil;
451
+ return Qnil;
430
452
  }
431
453
 
432
454
  uint64_t wanted_valuelen = sparkey_logiter_valuelen(logiter);
@@ -435,14 +457,18 @@ static VALUE method_hash_get(VALUE self, VALUE key) {
435
457
  returncode = sparkey_logiter_fill_value(logiter, sparkey_hash_getreader(i_hashreader->hashreader), wanted_valuelen, valuebuf, &actual_valuelen);
436
458
 
437
459
  if (returncode != SPARKEY_SUCCESS) {
460
+ free(valuebuf);
438
461
  raise_sparkey(returncode);
439
462
  } else if (wanted_valuelen != actual_valuelen) {
463
+ free(valuebuf);
440
464
  rb_raise(GnistaException, "Corrupt entry in hash.");
441
465
  }
442
466
 
443
467
  sparkey_logiter_close(&logiter);
444
468
 
445
- return rb_str_new((char *)valuebuf, actual_valuelen);
469
+ VALUE v = rb_str_new((char *)valuebuf, actual_valuelen);
470
+ free(valuebuf);
471
+ return v;
446
472
  }
447
473
 
448
474
  static VALUE method_hash_maxkeylen(VALUE self) {
@@ -1,3 +1,3 @@
1
1
  module Gnista
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -10,12 +10,10 @@ describe Gnista do
10
10
 
11
11
  before do
12
12
  @logwriter = Gnista::Logwriter.new log_path
13
- @logreader = Gnista::Logreader.new log_path
14
13
  end
15
14
 
16
15
  after do
17
16
  @logwriter.close
18
- @logreader.close
19
17
  FileUtils.rm log_path
20
18
  end
21
19
 
@@ -35,20 +33,28 @@ describe Gnista do
35
33
 
36
34
  it "can iterate each log entry" do
37
35
  @logwriter.put "key1", "value1"
38
- @logwriter.put "key2", "value2"
36
+ @logwriter.delete "key2"
37
+ @logwriter.flush
38
+
39
+ lograder = Gnista::Logreader.new log_path
39
40
 
40
41
  a = true
41
- @logreader.each do |key,value|
42
+ lograder.each do |key,value,type|
42
43
  if a
43
44
  key.must_equal "key1"
44
45
  value.must_equal "value1"
46
+ type.must_equal :put
45
47
  a = false
46
48
  else
47
49
  key.must_equal "key2"
48
- value.must_equal "value2"
50
+ value.must_be_nil
51
+ type.must_equal :delete
49
52
  end
50
53
  end
51
54
 
55
+ a.must_equal false
56
+
57
+ lograder.close
52
58
  end
53
59
 
54
60
  it "can read hash max key/value length" do
@@ -84,6 +90,8 @@ describe Gnista do
84
90
  end
85
91
  end
86
92
 
93
+ a.must_equal false
94
+
87
95
  hash.close
88
96
  FileUtils.rm hash_path
89
97
  end
@@ -122,7 +130,12 @@ describe Gnista do
122
130
 
123
131
  it "can be open or closed" do
124
132
  @logwriter.open?.must_equal true
125
- @logreader.open?.must_equal true
133
+
134
+ logreader = Gnista::Logreader.new log_path
135
+ logreader.open?.must_equal true
136
+ logreader.close
137
+ logreader.open?.must_equal false
138
+
126
139
  Gnista::Hash.write hash_path, log_path
127
140
  hash = Gnista::Hash.new hash_path, log_path
128
141
  hash.open?.must_equal true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnista
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emanuel Andersson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-11 00:00:00.000000000 Z
11
+ date: 2013-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler