mongolitedb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mongolitedb.rb +160 -0
  3. metadata +43 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c4ba47f1829ac304ccd6b11f7ef4ea97e06b4c1
4
+ data.tar.gz: 020c5c5191f247972874ac9f4c474e4ca7272ed8
5
+ SHA512:
6
+ metadata.gz: c7012586e2c0a364f5952de9c9e932fe01fd9c183f951eeb6807295cf718c92af3143527a5a2d30c0a504788727ac370b0463213bd73393342ca094d82fcba74
7
+ data.tar.gz: cd39d1355be855655dde02048e8523017c658067e90d4719cc29f5866850b2118eb754d34e3bb78255e9747dd52d98c5ddfdb6a1d877209284ef7b9130487722
@@ -0,0 +1,160 @@
1
+ require 'json'
2
+
3
+ class MongoLiteDB
4
+ def initialize(filename="db.nsl")
5
+ @filename = filename
6
+ if not File.exists?(@filename)
7
+ open(@filename, 'w'){|f| f.write(
8
+ {
9
+ "max_index" => 0,
10
+ "objects" => []
11
+ }.to_json
12
+ )}
13
+ end
14
+ end
15
+ def insert(objects)
16
+ if not objects.kind_of?(Array)
17
+ objects = [objects]
18
+ end
19
+ write_to_disk do |db|
20
+ objects.each do |object|
21
+ object_copy = object.clone
22
+ object_copy["id"] = db["max_index"]
23
+ db["max_index"] += 1
24
+ db["objects"] << object_copy
25
+ end
26
+ end
27
+ end
28
+ def find(query)
29
+ entries = []
30
+ load_from_disk do |db|
31
+ each_match(db, query) do |obj|
32
+ entries << obj
33
+ end
34
+ end
35
+ return entries
36
+ end
37
+
38
+ def update(query, attr)
39
+ write_to_disk do |db|
40
+ each_match(db, query) do |obj|
41
+ obj.update(attr)
42
+ end
43
+ end
44
+ end
45
+ def delete(query)
46
+ write_to_disk do |db|
47
+ each_match(db, query) do |obj|
48
+ db["objects"].delete(obj)
49
+ end
50
+ end
51
+ end
52
+
53
+ private
54
+ def write_to_disk
55
+ f = open(@filename, 'r+')
56
+ f.flock(File::LOCK_EX)
57
+ db = JSON.parse f.read
58
+ yield db
59
+ ensure
60
+ if f
61
+ if db
62
+ f.rewind
63
+ f.write db.to_json
64
+ f.flush
65
+ f.truncate f.pos
66
+ end
67
+ f.close
68
+ end
69
+ end
70
+
71
+ def load_from_disk
72
+ f = open(@filename, 'r+')
73
+ f.flock(File::LOCK_SH)
74
+ db = JSON.parse f.read
75
+ yield db
76
+ ensure
77
+ if f
78
+ f.close
79
+ end
80
+ end
81
+
82
+ def each_match(db, query)
83
+ db["objects"].clone.each do |obj|
84
+ yield(obj) unless not match(obj, query)
85
+ end
86
+ end
87
+
88
+ def match(obj, query)
89
+ # query is either an array in the form of [key, value] or a hash
90
+ # if query is an Array, key is a string, value can be anything
91
+ # if value is an array, we should expect a keyword for key
92
+ # if value is an hash, we should expect it's only key to be a keyword
93
+ # if value is a string or FixNum , we should check for attribute match
94
+ # if query is Hash, then we break it into individual queries and recursively call them (as arrays)
95
+ if query.kind_of? Array
96
+ if query[1].kind_of? Array
97
+ case query[0]
98
+ when "$or"
99
+ match = false
100
+ query[1].each do |attr|
101
+ is_a_match = match(obj, attr)
102
+ match ||= is_a_match
103
+ end
104
+ return match
105
+ else
106
+ raise NotImplementedError
107
+ end
108
+ elsif query[1].kind_of? Hash
109
+ match = true
110
+ query[1].each do |k,v|
111
+ case k
112
+ when "$in"
113
+ local_match = false
114
+ v.each do |value|
115
+ is_a_match = match(obj, [query[0], value])
116
+ local_match ||= is_a_match
117
+ end
118
+ match &&= local_match
119
+ when "$exists"
120
+ match &&= (not obj[query[0]].nil?) == v
121
+ when "$nin"
122
+ local_match = true
123
+ v.each do |value|
124
+ is_a_match = match(obj, [query[0], value])
125
+ local_match &&= (not is_a_match)
126
+ end
127
+ match &&= local_match
128
+ when "$gt"
129
+ return obj[query[0]] > v
130
+ when "$gte"
131
+ return obj[query[0]] >= v
132
+ when "$lt"
133
+ return obj[query[0]] < v
134
+ when "$lte"
135
+ return obj[query[0]] <= v
136
+ when "$ne"
137
+ return obj[query[0]] != v
138
+ when "$mod"
139
+ return obj[query[0]] % v[0] == v[1]
140
+ else
141
+ raise NotImplementedError
142
+ end
143
+ end
144
+ return match
145
+ else
146
+ match = (obj[query[0]] == query[1])
147
+ return match
148
+ end
149
+ elsif query.kind_of? Hash
150
+ match = true
151
+ query.to_a.each do |attr|
152
+ is_a_match = match(obj, attr)
153
+ match &&= is_a_match
154
+ end
155
+ return match
156
+ else
157
+ raise NotImplementedError
158
+ end
159
+ end
160
+ end
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongolitedb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Peter Hamilton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-03-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple embedded NoSQL database that uses MongoDB compatible query langaguage
14
+ email: peterghamilton@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/mongolitedb.rb
20
+ homepage: https://github.com/hamiltop/MongoLiteDB
21
+ licenses: []
22
+ metadata: {}
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ required_rubygems_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ requirements: []
38
+ rubyforge_project:
39
+ rubygems_version: 2.0.2
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: MongoLiteDB embedded database
43
+ test_files: []