daybreak 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 1.8.7
4
4
  - 1.9.3
5
+ - 2.0.0
5
6
  - ruby-head
6
7
  - jruby-18mode
7
8
  - jruby-19mode
data/README CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Daybreak is a simple key value store for ruby. It has user defined persistence,
7
7
  and all data is stored in a table in memory so ruby niceties are available.
8
- Daybreak is faster than any other ruby options like pstore or dbm.
8
+ Daybreak is faster than other ruby options like pstore or dbm.
9
9
 
10
10
  $ gem install daybreak
11
11
 
@@ -20,7 +20,7 @@ module Daybreak
20
20
  # @yieldparam [String] key the key to be stored.
21
21
  def initialize(file, options = {}, &block)
22
22
  @serializer = (options[:serializer] || Serializer::Default).new
23
- @table = Hash.new &method(:hash_default)
23
+ @table = Hash.new(&method(:hash_default))
24
24
  @journal = Journal.new(file, (options[:format] || Format).new, @serializer) do |record|
25
25
  if !record
26
26
  @table.clear
@@ -201,7 +201,7 @@ module Daybreak
201
201
  # @yieldparam [DB] db
202
202
  # @return result of the block
203
203
  def lock
204
- @mutex.synchronize { @journal.lock { yield self } }
204
+ synchronize { @journal.lock { yield self } }
205
205
  end
206
206
 
207
207
  # Synchronize access to the database from multiple threads
@@ -32,14 +32,24 @@ module Daybreak
32
32
  data << crc32(data)
33
33
  end
34
34
 
35
- # Deserialize record from buffer
35
+ # Deserialize records from buffer, and yield them.
36
36
  # @param [String] buf the buffer to read from
37
- # @return [Array] deserialized record [key, value] or [key] if the record is deleted
37
+ # @yield [Array] blk deserialized record [key, value] or [key] if the record is deleted
38
+ # @return [Fixnum] number of records
38
39
  def parse(buf)
39
- key_size, value_size = buf[0, 8].unpack('NN')
40
- data = buf.slice!(0, 8 + key_size + (value_size == DELETE ? 0 : value_size))
41
- raise 'CRC mismatch: your data might be corrupted!' unless buf.slice!(0, 4) == crc32(data)
42
- value_size == DELETE ? [data[8, key_size]] : [data[8, key_size], data[8 + key_size, value_size]]
40
+ n, count = 0, 0
41
+ while n < buf.size
42
+ key_size, value_size = buf[n, 8].unpack('NN')
43
+ data_size = key_size + 8
44
+ data_size += value_size if value_size != DELETE
45
+ data = buf[n, data_size]
46
+ n += data_size
47
+ raise 'CRC mismatch: your data might be corrupted!' unless buf[n, 4] == crc32(data)
48
+ n += 4
49
+ yield(value_size == DELETE ? [data[8, key_size]] : [data[8, key_size], data[8 + key_size, value_size]])
50
+ count += 1
51
+ end
52
+ count
43
53
  end
44
54
 
45
55
  protected
@@ -91,10 +91,7 @@ module Daybreak
91
91
  # Emit records as we parse them
92
92
  def replay
93
93
  buf = read
94
- until buf.empty?
95
- @emit.call(@format.parse(buf))
96
- @size += 1
97
- end
94
+ @size += @format.parse(buf, &@emit)
98
95
  end
99
96
 
100
97
  # Open or reopen file
@@ -1,5 +1,5 @@
1
1
  module Daybreak
2
2
  # Version string updated using SemVer
3
3
  # @api public
4
- VERSION = '0.2.4'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -106,3 +106,11 @@ db = Daybreak::DB.new DB_PATH
106
106
  run db, 'bulk updates, synced' do
107
107
  db.update! hash
108
108
  end
109
+
110
+ # reads
111
+ puts "Read performance"
112
+ db = Daybreak::DB.new DB_PATH
113
+ DATA.each {|i| db[i] = i }
114
+ report RUNS.times.map { Benchmark.measure { db1 = Daybreak::DB.new DB_PATH; db1.close }.real * 1000 }
115
+ db.clear
116
+ db.close
Binary file
@@ -404,6 +404,13 @@ describe Daybreak::DB do
404
404
  db.close
405
405
  end
406
406
 
407
+ it 'should keep the same format' do
408
+ db = Daybreak::DB.new DB_PATH, :serializer => Daybreak::Serializer::None
409
+ 10.times {|i| db[i.to_s] = i.to_s }
410
+ db.close
411
+ assert_equal File.read(DB_PATH), File.read(File.join(HERE, 'mock.db-test'))
412
+ end
413
+
407
414
  after do
408
415
  @db.clear
409
416
  @db.close
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daybreak
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.3.0
4
5
  prerelease:
5
- version: 0.2.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeff Larson
@@ -10,40 +10,40 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-02-02 00:00:00.000000000 Z
13
+ date: 2013-03-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- version_requirements: !ruby/object:Gem::Requirement
16
+ name: rake
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
20
  - - ! '>='
19
21
  - !ruby/object:Gem::Version
20
22
  version: '0'
21
- none: false
22
- name: rake
23
23
  type: :development
24
24
  prerelease: false
25
- requirement: !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
26
27
  requirements:
27
28
  - - ! '>='
28
29
  - !ruby/object:Gem::Version
29
30
  version: '0'
30
- none: false
31
31
  - !ruby/object:Gem::Dependency
32
- version_requirements: !ruby/object:Gem::Requirement
32
+ name: minitest
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
33
35
  requirements:
34
36
  - - ! '>='
35
37
  - !ruby/object:Gem::Version
36
38
  version: '0'
37
- none: false
38
- name: minitest
39
39
  type: :development
40
40
  prerelease: false
41
- requirement: !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
42
43
  requirements:
43
44
  - - ! '>='
44
45
  - !ruby/object:Gem::Version
45
46
  version: '0'
46
- none: false
47
47
  description: Incredibly fast pure-ruby key-value store
48
48
  email:
49
49
  - thejefflarson@gmail.com
@@ -72,6 +72,7 @@ files:
72
72
  - lib/daybreak/version.rb
73
73
  - script/bench
74
74
  - script/converter
75
+ - test/mock.db-test
75
76
  - test/prof.rb
76
77
  - test/test.rb
77
78
  - test/test_helper.rb
@@ -83,25 +84,26 @@ rdoc_options: []
83
84
  require_paths:
84
85
  - lib
85
86
  required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
86
88
  requirements:
87
89
  - - ! '>='
88
90
  - !ruby/object:Gem::Version
89
91
  version: '0'
90
- none: false
91
92
  required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
92
94
  requirements:
93
95
  - - ! '>='
94
96
  - !ruby/object:Gem::Version
95
97
  version: '0'
96
- none: false
97
98
  requirements: []
98
99
  rubyforge_project:
99
- rubygems_version: 1.8.23
100
+ rubygems_version: 1.8.24
100
101
  signing_key:
101
102
  specification_version: 3
102
103
  summary: Daybreak provides an incredibly fast pure-ruby in memory key-value store,
103
104
  which is multi-process safe and uses a journal log to store the data.
104
105
  test_files:
106
+ - test/mock.db-test
105
107
  - test/prof.rb
106
108
  - test/test.rb
107
109
  - test/test_helper.rb