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.
- checksums.yaml +7 -0
- data/lib/mongolitedb.rb +160 -0
- 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
|
data/lib/mongolitedb.rb
ADDED
@@ -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: []
|