dotdot 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dotdot.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ Dotdot
2
+ =======
3
+
4
+ A database handler which parses a key-value-group pair.
5
+
6
+ Keys would look like:
7
+
8
+ * databases.default
9
+ * database.mydb.name
10
+ * database.mydb.host
11
+ * cache.default
12
+ * cache.local.host
13
+
14
+ Keys are arbitrary in nature. Keys are paired with values.
15
+
16
+ * databases.default => 'development'
17
+
18
+ A key database default with 'development' as default values
19
+
20
+ * database.hosts => 'host1.local,host2.local,host3.local'
21
+
22
+ A key holding database hosts which is a multiple value key.
23
+
24
+ Key-value pairs also have groups. Groups identify collections to add
25
+ more uniqueness and isolation to keys and values.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/dotdot.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "dotdot/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "dotdot"
7
+ s.version = Dotdot::VERSION
8
+ s.authors = ["Jan Mendoza"]
9
+ s.email = ["poymode@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Parking this gem}
12
+ s.description = %q{Parking this gem}
13
+
14
+ s.rubyforge_project = "dotdot"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ s.add_dependency "sqlite3"
21
+ s.add_dependency "sequel"
22
+
23
+ # specify any dependencies here; for example:
24
+ # s.add_development_dependency "rspec"
25
+ # s.add_runtime_dependency "rest-client"
26
+ end
@@ -0,0 +1,159 @@
1
+ module Dotdot
2
+ class Base
3
+ attr_reader :database
4
+
5
+ def initialize(object)
6
+ @object = object
7
+ @database = nil
8
+ @sql_options = { :logger => @object.logger, :sql_log_level => :info }
9
+
10
+ if @object.options[:verbose]
11
+ @sql_options[:sql_log_level] = :debug
12
+ end
13
+ end
14
+
15
+ def boot
16
+ @database = Sequel.sqlite(@object.db_path, @sql_options)
17
+ @group = ""
18
+ @prefix_stack = []
19
+
20
+ @dataset = @database[:cablingdatas]
21
+ end
22
+
23
+ def final_key(key)
24
+ unless @prefix_stack.empty?
25
+ @prefix_stack.push(key)
26
+ key = nil
27
+ end
28
+
29
+ key ||= @prefix_stack.join('.')
30
+ end
31
+
32
+ def set(key, value, group = nil)
33
+ group ||= @group
34
+ key = final_key(key)
35
+
36
+ @dataset.insert(:key => key, :value => value, :group => group)
37
+
38
+ stack_pop
39
+ end
40
+
41
+ def delete_key(key, group = nil)
42
+ group ||= @group
43
+
44
+ key = final_key(key)
45
+
46
+ @dataset.filter(:key => key, :group => group).delete
47
+ stack_pop
48
+ end
49
+
50
+ def update(key, value, group = nil)
51
+ group ||= @group
52
+ key = final_key(key)
53
+
54
+ @dataset.filter(:key => key, :group => group).update(:value => value)
55
+
56
+ stack_pop
57
+ end
58
+
59
+ def group(group = nil, &block)
60
+ @group = group
61
+
62
+ @database.transaction do
63
+ yield
64
+ end
65
+ end
66
+
67
+ def globals(&block)
68
+ @group = "globals"
69
+
70
+ @database.transaction do
71
+ yield
72
+ end
73
+ end
74
+
75
+ def prefix(prefix, &block)
76
+ @prefix_stack.push(prefix)
77
+ yield
78
+
79
+ stack_pop
80
+ end
81
+
82
+ def stack_pop
83
+ @prefix_stack.pop
84
+ end
85
+
86
+ def has_key?(key, group)
87
+ group ||= @object.group.to_s
88
+
89
+ val = @dataset.where(:key => key, :group => group).count
90
+
91
+ if val == 0
92
+ val = @dataset.where(:key => key, :group => "globals").count
93
+
94
+ val == 0 ? false : true
95
+ else
96
+ true
97
+ end
98
+ end
99
+
100
+ def get(key, group = nil)
101
+ group ||= @object.group.to_s
102
+
103
+ val = @dataset.where(:key => key, :group => group)
104
+
105
+ if val.empty?
106
+ val = @dataset.where(:key => key, :group => "globals")
107
+ end
108
+
109
+ if val.count > 0
110
+ val.first[:value]
111
+ else
112
+ raise "key \'#{key}\' cannot be found!"
113
+ end
114
+ end
115
+
116
+ def get_if_key_exists(key, group = nil)
117
+ group ||= @object.group.to_s
118
+
119
+ get(key, group) if has_key?(key, group)
120
+ end
121
+
122
+ def get_children(key, group = nil)
123
+ group ||= @object.group.to_s
124
+ values = []
125
+
126
+ res = @dataset.where(:key.like("#{key}%"), :group => group)
127
+
128
+ if res.empty?
129
+ res = @dataset.where(:key.like("#{key}%"), :group => "globals")
130
+ end
131
+
132
+ key = key.split('.')
133
+
134
+ res.each do |r|
135
+ res_key = r[:key].split('.')
136
+ res_key = (res_key - key).shift
137
+ values.push(res_key)
138
+ end
139
+
140
+ if values.count > 0
141
+ values & values
142
+ else
143
+ raise "no values for \'#{key}\'!"
144
+ end
145
+ end
146
+
147
+ def create_table_if_needed
148
+ if @database.tables.include? :cablingdatas
149
+ @database.drop_table :cablingdatas
150
+ end
151
+
152
+ @database.create_table :cablingdatas do
153
+ String :key
154
+ String :value
155
+ String :group
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,3 @@
1
+ module Dotdot
2
+ VERSION = "0.1.0"
3
+ end
data/lib/dotdot.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "dotdot/version"
2
+
3
+ module Dotdot
4
+ autoload :Base, 'dotdot/base'
5
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dotdot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jan Mendoza
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-26 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sqlite3
16
+ requirement: &14254540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *14254540
25
+ - !ruby/object:Gem::Dependency
26
+ name: sequel
27
+ requirement: &14253800 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *14253800
36
+ description: Parking this gem
37
+ email:
38
+ - poymode@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - .gitignore
44
+ - Gemfile
45
+ - README.md
46
+ - Rakefile
47
+ - dotdot.gemspec
48
+ - lib/dotdot.rb
49
+ - lib/dotdot/base.rb
50
+ - lib/dotdot/version.rb
51
+ homepage: ''
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project: dotdot
71
+ rubygems_version: 1.8.10
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Parking this gem
75
+ test_files: []