kvj 0.0.3 → 0.0.9
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 +4 -4
- data/lib/{base_manager.rb → base_methods.rb} +3 -3
- data/lib/kvj.rb +19 -52
- data/lib/meta_hash_methods.rb +33 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2698731d96db2800bf47ef4edba0f1dee71916b
|
4
|
+
data.tar.gz: d092ffd4c571fbc3f7613afb5c737be77bd4f721
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 140e4618e0b24760306528f7e0c030ddb2d7ddd15349718e88134f8b1f4c89bf8a76195a6e104cd8fd344a86145ddbce2120d277e875c3afab5288a8aba040fd
|
7
|
+
data.tar.gz: 10ab1a26b0d0deefb643fb234a7dc554e5357cfaaed051fef882be3914c26b2f6464150a311e08907b5f5599a3f1428ad45114ea02d7e99d884883d80d7e0dcc
|
@@ -1,14 +1,14 @@
|
|
1
1
|
|
2
|
-
module
|
2
|
+
module BaseMethods
|
3
3
|
def list
|
4
|
-
base_directory =
|
4
|
+
base_directory = KVJ_CONFIG['base_directory']
|
5
5
|
databases = Dir.entries(base_directory)
|
6
6
|
databases.delete_if { |database| database =~ /^\./ }
|
7
7
|
databases.map { |file_name| file_name.chomp('.json') }
|
8
8
|
end
|
9
9
|
|
10
10
|
def drop(database)
|
11
|
-
base_directory =
|
11
|
+
base_directory = KVJ_CONFIG['base_directory']
|
12
12
|
File.delete(base_directory + database + '.json')
|
13
13
|
end
|
14
14
|
end
|
data/lib/kvj.rb
CHANGED
@@ -1,77 +1,44 @@
|
|
1
1
|
require_relative 'file_connector'
|
2
|
-
require_relative '
|
2
|
+
require_relative 'base_methods'
|
3
|
+
require_relative 'meta_hash_methods'
|
3
4
|
require 'pry'
|
4
5
|
require 'yaml'
|
5
6
|
|
6
|
-
|
7
|
+
# load config file from user defined constant of from default path
|
8
|
+
KVJ_CONFIG_PATH ||= 'config/kvj_config.yml'.freeze
|
9
|
+
KVJ_CONFIG = YAML.load_file(KVJ_CONFIG_PATH)
|
7
10
|
|
8
11
|
class KVJ
|
9
|
-
extend
|
12
|
+
extend BaseMethods
|
13
|
+
extend MetaHashMethods
|
14
|
+
|
15
|
+
def self.connect_or_create(database)
|
16
|
+
directory = KVJ_CONFIG['base_directory']
|
17
|
+
new(database, directory)
|
18
|
+
end
|
10
19
|
|
11
20
|
def self.create(database)
|
12
|
-
directory =
|
21
|
+
directory = KVJ_CONFIG['base_directory']
|
13
22
|
return new(database, directory) unless FileConnector.exist(database, directory)
|
14
23
|
STDERR.puts "Request to initialize a new database : #{database} but alread exists. "
|
15
24
|
false
|
16
25
|
end
|
17
26
|
|
18
27
|
def self.connect(database)
|
19
|
-
directory =
|
28
|
+
directory = KVJ_CONFIG['base_directory']
|
20
29
|
return new(database, directory) if FileConnector.exist(database, directory)
|
21
30
|
STDERR.puts "Request to connect to database : #{database} but does not exists. "
|
22
31
|
false
|
23
32
|
end
|
24
33
|
|
25
|
-
|
26
|
-
|
27
|
-
hash = @file_connector.read
|
28
|
-
hash[key] = value
|
29
|
-
@file_connector.write(hash)
|
30
|
-
return true
|
31
|
-
ensure
|
32
|
-
@file_connector.release_lock
|
33
|
-
end
|
34
|
-
|
35
|
-
def read(key)
|
36
|
-
@file_connector.grab_sh_lock
|
37
|
-
data = @file_connector.read
|
38
|
-
return false unless key_exist(data, key, 'read')
|
39
|
-
return data[key]
|
40
|
-
ensure
|
41
|
-
@file_connector.release_lock
|
42
|
-
end
|
43
|
-
|
44
|
-
def inspect_keys
|
45
|
-
@file_connector.grab_sh_lock
|
46
|
-
@file_connector.read.keys
|
47
|
-
ensure
|
48
|
-
@file_connector.release_lock
|
49
|
-
end
|
50
|
-
|
51
|
-
def delete(key)
|
52
|
-
@file_connector.grab_ex_lock
|
53
|
-
data = @file_connector.read
|
54
|
-
return false unless key_exist(data, key, 'delete')
|
55
|
-
data.delete(key)
|
56
|
-
@file_connector.write(hash)
|
57
|
-
ensure
|
58
|
-
@file_connector.release_lock
|
59
|
-
end
|
60
|
-
|
61
|
-
alias []= write
|
62
|
-
alias [] read
|
63
|
-
|
64
|
-
def key_exist(data, key, action)
|
65
|
-
return true if data.key?(key)
|
66
|
-
STDERR.puts "Request to #{action} key : '#{key}' does not exist in database : '#{@database}' "
|
67
|
-
false
|
68
|
-
end
|
69
|
-
|
34
|
+
# the new constructor is hidden from user
|
35
|
+
# please use connect_or_create, create or connect instead
|
70
36
|
def initialize(database, directory)
|
71
37
|
@database = database
|
72
38
|
@file_connector = FileConnector.new(database, directory)
|
73
39
|
end
|
74
40
|
|
75
|
-
|
76
|
-
|
41
|
+
# create dynamic methods for all Hash object native method
|
42
|
+
generate_hash_functions
|
43
|
+
private_class_method :new, :inheritage_hash_method, :generate_hash_functions
|
77
44
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module MetaHashMethods
|
2
|
+
def inheritage_hash_method(method, level)
|
3
|
+
define_method(method) do |*arg, &block|
|
4
|
+
begin
|
5
|
+
if level == :write
|
6
|
+
@file_connector.grab_ex_lock
|
7
|
+
else
|
8
|
+
@file_connector.grab_sh_lock
|
9
|
+
end
|
10
|
+
hash = @file_connector.read
|
11
|
+
return_value = hash.send(method, *arg, &block)
|
12
|
+
@file_connector.write(hash) if level == :write
|
13
|
+
return return_value
|
14
|
+
ensure
|
15
|
+
@file_connector.release_lock
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_hash_functions
|
21
|
+
methods = Hash.instance_methods - KVJ.instance_methods
|
22
|
+
write_methods = methods.select { |method| method =~ /=|!|delete/ }
|
23
|
+
read_only_methods = methods - write_methods
|
24
|
+
|
25
|
+
read_only_methods.each do |method|
|
26
|
+
inheritage_hash_method(method, :read)
|
27
|
+
end
|
28
|
+
|
29
|
+
write_methods.each do |method|
|
30
|
+
inheritage_hash_method(method, :write)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kvj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RundongGao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -24,17 +24,17 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
28
|
-
transcations for multiple programs.
|
27
|
+
description: Using your key-value data just like using Ruby Hash.
|
29
28
|
email: asphinx423@gmail.com
|
30
29
|
executables: []
|
31
30
|
extensions: []
|
32
31
|
extra_rdoc_files: []
|
33
32
|
files:
|
34
|
-
- lib/
|
33
|
+
- lib/base_methods.rb
|
35
34
|
- lib/file_connector.rb
|
36
35
|
- lib/kvj.rb
|
37
36
|
- lib/lock_manager.rb
|
37
|
+
- lib/meta_hash_methods.rb
|
38
38
|
homepage: https://github.com/RundongGao/kvj
|
39
39
|
licenses:
|
40
40
|
- MIT
|
@@ -58,5 +58,6 @@ rubyforge_project:
|
|
58
58
|
rubygems_version: 2.4.6
|
59
59
|
signing_key:
|
60
60
|
specification_version: 4
|
61
|
-
summary: A supper light connectionless key-value storage database
|
61
|
+
summary: A supper light connectionless key-value storage database provides ACID transcations
|
62
|
+
for multiple programs.
|
62
63
|
test_files: []
|