mongolitedb 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.
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: []