kvj 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a1538b407a7ed4da590eba89c2da2a4260f820e2
4
+ data.tar.gz: 48fb6f5171b37cce09831bc895cd2a8034c75725
5
+ SHA512:
6
+ metadata.gz: b2c35b6d234fd0e230f0c8c61cf7593fd472b717a8a54359d7526056f92574bd5ac316d9ab316dcd7f57fd1fd8375659c0b8c3de9ab38c8b9f1252d710ea267a
7
+ data.tar.gz: 7daf213a82b0437b8ac45eb0168e6cc10f8c7f3c1f89452b8a948be026648f06945b436eaaa8b3e2232fe325b8cfc0a304c7aae31c30983c35a176f4d2641b71
@@ -0,0 +1,14 @@
1
+
2
+ module BaseManager
3
+ def list
4
+ base_directory = CONFIG['base_directory']
5
+ databases = Dir.entries(base_directory)
6
+ databases.delete_if { |database| database =~ /^\./ }
7
+ databases.map { |file_name| file_name.chomp('.json') }
8
+ end
9
+
10
+ def drop(database)
11
+ base_directory = CONFIG['base_directory']
12
+ File.delete(base_directory + database + '.json')
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ require 'json'
2
+ require 'pry'
3
+ require 'fileutils'
4
+ require_relative 'lock_manager'
5
+
6
+ class FileConnector
7
+ include LockManager
8
+
9
+ def initialize(name, directory)
10
+ @file_path = directory + name.to_s + '.json'
11
+ create_file unless if_exist
12
+ @file = File.open(@file_path, File::RDWR)
13
+ end
14
+
15
+ def read
16
+ file = File.read(@file_path)
17
+ JSON.parse(file)
18
+ end
19
+
20
+ def write(hash)
21
+ File.open(@file_path, 'w') do |f|
22
+ f.write(hash.to_json)
23
+ end
24
+ read
25
+ end
26
+
27
+ private
28
+
29
+ def if_exist
30
+ File.file?(@file_path)
31
+ end
32
+
33
+ def create_file
34
+ # creat directory
35
+ dirname = File.dirname(@file_path)
36
+ FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
37
+ # create empty json file
38
+ File.open(@file_path, 'w') do |f|
39
+ f.write({}.to_json)
40
+ end
41
+ end
42
+ end
data/lib/kvj.rb ADDED
@@ -0,0 +1,44 @@
1
+ require_relative 'file_connector'
2
+ require_relative 'base_manager'
3
+ require 'pry'
4
+ require 'yaml'
5
+
6
+ CONFIG = YAML.load_file('config/kvj_config.yml')
7
+
8
+ class KVJ
9
+ extend BaseManager
10
+
11
+ def initialize(name)
12
+ directory = CONFIG['base_directory']
13
+ @file_connector = FileConnector.new(name, directory)
14
+ end
15
+
16
+ def write(key, value)
17
+ @file_connector.grab_ex_lock
18
+ hash = @file_connector.read
19
+ hash[key] = value
20
+ @file_connector.write(hash)
21
+ ensure
22
+ @file_connector.release_lock
23
+ end
24
+
25
+ def read(key)
26
+ @file_connector.grab_sh_lock
27
+ @file_connector.read[key]
28
+ ensure
29
+ @file_connector.release_lock
30
+ end
31
+
32
+ def inspect_keys
33
+ @file_connector.grab_sh_lock
34
+ @file_connector.read.keys
35
+ ensure
36
+ @file_connector.release_lock
37
+ end
38
+
39
+ class << self
40
+ alias connect new
41
+ end
42
+ alias []= write
43
+ alias [] read
44
+ end
@@ -0,0 +1,13 @@
1
+ module LockManager
2
+ def grab_ex_lock
3
+ @file.flock(File::LOCK_EX)
4
+ end
5
+
6
+ def grab_sh_lock
7
+ @file.flock(File::LOCK_SH)
8
+ end
9
+
10
+ def release_lock
11
+ @file.flock(File::LOCK_UN)
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kvj
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - RundongGao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: a supper light key value storage database in json file provides ACID
28
+ transcation on disk for multiple programs.
29
+ email: asphinx423@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/base_manager.rb
35
+ - lib/file_connector.rb
36
+ - lib/kvj.rb
37
+ - lib/lock_manager.rb
38
+ homepage: http://rubygems.org/gems/hola
39
+ licenses:
40
+ - MIT
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.4.6
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: A supper light weight value data database.
62
+ test_files: []