jsondb 0.0.2 → 0.1.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 +4 -4
- data/lib/jsondb.rb +14 -5
- data/lib/jsondb/base.rb +29 -0
- data/lib/jsondb/commands.rb +56 -0
- data/lib/jsondb/constants.rb +23 -0
- data/lib/jsondb/db.rb +94 -57
- data/lib/jsondb/field.rb +80 -48
- data/lib/jsondb/fields.rb +55 -0
- data/lib/jsondb/file_ops.rb +64 -54
- data/lib/jsondb/logger.rb +36 -0
- data/lib/jsondb/record.rb +53 -88
- data/lib/jsondb/records.rb +62 -0
- data/lib/jsondb/result_set.rb +126 -0
- data/lib/jsondb/settings.rb +34 -0
- data/lib/jsondb/table.rb +93 -145
- data/lib/jsondb/tables.rb +78 -0
- data/lib/jsondb/validations.rb +133 -0
- metadata +12 -4
- data/lib/jsondb/resultset.rb +0 -109
- data/lib/jsondb/validation.rb +0 -88
data/lib/jsondb/file_ops.rb
CHANGED
@@ -1,73 +1,83 @@
|
|
1
1
|
module JSONdb
|
2
|
+
|
2
3
|
class FileOps
|
3
4
|
|
4
|
-
|
5
|
+
include JSONdb::Logger
|
6
|
+
|
7
|
+
attr_reader :folder, :writeable, :filename, :filetype, :new_file
|
8
|
+
|
9
|
+
attr_accessor :contents
|
5
10
|
|
6
|
-
def initialize(folder, filename, filetype,
|
11
|
+
def initialize(folder, filename, filetype, json = true)
|
7
12
|
@folder = folder
|
8
|
-
@
|
9
|
-
@filename = File.join(@folder, filename)
|
13
|
+
@filename = File.expand_path(File.join(@folder, filename))
|
10
14
|
@filetype = filetype
|
11
|
-
|
12
|
-
|
13
|
-
else
|
14
|
-
raise "Folder '#{@folder}' does not exists."
|
15
|
-
end
|
15
|
+
@contents = ""
|
16
|
+
@json = json
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
-
|
19
|
+
def read
|
20
|
+
begin
|
21
|
+
if File.exists?(@filename)
|
22
|
+
file = File.open(@filename, 'r')
|
23
|
+
raw = file.read
|
24
|
+
@new_file = false
|
25
|
+
log("File '#{@filename}' readed.", :debug)
|
26
|
+
else
|
27
|
+
raw = JSONdb.constants.default_file_content[@filetype]
|
28
|
+
@new_file = true
|
29
|
+
end
|
30
|
+
if @json == true
|
31
|
+
@contents = JSON.parse(raw)
|
32
|
+
else
|
33
|
+
@contents = raw
|
34
|
+
end
|
35
|
+
file.close if file
|
36
|
+
log("File '#{@filename}' parsed.", :debug)
|
37
|
+
return true
|
38
|
+
rescue
|
39
|
+
log("File '#{@filename}' could not read the file.", :error)
|
40
|
+
return false
|
41
|
+
end
|
20
42
|
end
|
21
43
|
|
22
|
-
def
|
23
|
-
|
44
|
+
def write
|
45
|
+
begin
|
46
|
+
file = File.open(@filename, 'w')
|
47
|
+
if @json == true
|
48
|
+
file.write(JSON.pretty_generate(@contents))
|
49
|
+
else
|
50
|
+
file.write(@contents)
|
51
|
+
end
|
52
|
+
file.close
|
53
|
+
@new_file = false
|
54
|
+
log("File '#{@filename}' content updated.", :debug)
|
55
|
+
return true
|
56
|
+
rescue
|
57
|
+
log("File '#{@filename}' could not open and write the file.", :error)
|
58
|
+
return false
|
59
|
+
end
|
24
60
|
end
|
25
61
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
62
|
+
def write_line(line)
|
63
|
+
begin
|
64
|
+
file = File.open(@filename, 'a+')
|
65
|
+
file.write("#{line}\n")
|
66
|
+
file.close
|
67
|
+
@new_file = false
|
68
|
+
rescue
|
69
|
+
log("Couldn't write line on file '#{@filename}'.", :error)
|
70
|
+
end
|
34
71
|
end
|
35
72
|
|
36
73
|
def destroy
|
37
|
-
File.
|
38
|
-
|
39
|
-
|
40
|
-
def close
|
41
|
-
@file.close if @file
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def exists?(file)
|
47
|
-
File.exists?(File.expand_path(file))
|
48
|
-
end
|
49
|
-
|
50
|
-
def load
|
51
|
-
@new_file = !exists?(@filename)
|
52
|
-
if exists?(@filename)
|
53
|
-
@file = File.open(@filename, 'r')
|
54
|
-
@raw = @file.read
|
74
|
+
if File.exists?(@filename)
|
75
|
+
File.delete(@filename)
|
76
|
+
log("File '#{@filename}' deleted.", :info)
|
55
77
|
else
|
56
|
-
@
|
78
|
+
log("File '#{@filename}' does not exists.", :error)
|
57
79
|
end
|
58
|
-
@contents = JSON.parse(@raw)
|
59
|
-
@file.close if @file
|
60
80
|
end
|
61
81
|
|
62
|
-
|
63
|
-
|
64
|
-
when 'db'
|
65
|
-
'{ "tables": {} }'
|
66
|
-
when 'table_structure'
|
67
|
-
'{ "last_id" : 0, "fields": {} }'
|
68
|
-
when 'table_records'
|
69
|
-
'{ }'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
82
|
+
end # class
|
83
|
+
end # module
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
module Logger
|
4
|
+
|
5
|
+
# LogLevels = {
|
6
|
+
# debug: 1,
|
7
|
+
# info: 2,
|
8
|
+
# error: 3
|
9
|
+
# }
|
10
|
+
|
11
|
+
def log(msg, log_level = :debug, force_raise_error = false)
|
12
|
+
log("Log level not allowed: '#{log_level}", :error) if !allowed_log_level?(log_level)
|
13
|
+
|
14
|
+
if log_enabled? and log_this?(log_level)
|
15
|
+
@log_file ||= FileOps.new(JSONdb.settings.log_folder, JSONdb.settings.log_file, 'log', false)
|
16
|
+
@log_file.write_line("#{Time.now} #{log_level.to_s.upcase} #{self.class.to_s} #{msg}")
|
17
|
+
puts "#{Time.now} #{log_level.to_s.upcase} #{self.class.to_s}: #{msg} " if JSONdb.settings.verbose
|
18
|
+
end
|
19
|
+
raise "#{log_level.to_s.upcase} #{self.class.to_s} #{msg}" if (JSONdb.settings.raise_errors == true or force_raise_error == true) and log_level == :error
|
20
|
+
end
|
21
|
+
|
22
|
+
def allowed_log_level?(log_level)
|
23
|
+
JSONdb.constants.loglevels.keys.include?(log_level)
|
24
|
+
end
|
25
|
+
|
26
|
+
def log_this?(log_level)
|
27
|
+
JSONdb.constants.loglevels[log_level] >= JSONdb.constants.loglevels[JSONdb.settings.log_level]
|
28
|
+
end
|
29
|
+
|
30
|
+
def log_enabled?
|
31
|
+
JSONdb.settings.log_enabled
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/jsondb/record.rb
CHANGED
@@ -1,92 +1,57 @@
|
|
1
1
|
module JSONdb
|
2
|
-
class Record
|
3
2
|
|
4
|
-
|
3
|
+
class Record
|
4
|
+
|
5
|
+
include JSONdb::Validations::Types
|
6
|
+
include JSONdb::Logger
|
7
|
+
|
8
|
+
attr_reader :table_name
|
9
|
+
|
10
|
+
def initialize(table_name, record = nil)
|
11
|
+
@record = Hash.new
|
12
|
+
|
13
|
+
@table_name = table_name
|
14
|
+
if record.nil?
|
15
|
+
@new_record = true
|
16
|
+
@persisted = false
|
17
|
+
else
|
18
|
+
@new_record = false
|
19
|
+
@persisted = true
|
20
|
+
@record = record
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def fields
|
25
|
+
JSONdb.fields[table_name].to_hash.keys
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_hash
|
29
|
+
@record
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_default_if_nil(name)
|
33
|
+
if @record[name].nil?
|
34
|
+
@record[name] = JSONdb.fields[table_name][name].default if JSONdb.fields[table_name][name].default.nil? == false
|
35
|
+
end
|
36
|
+
return @record[name]
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_missing(name, *args)
|
40
|
+
name = name.to_s
|
41
|
+
|
42
|
+
if JSONdb.fields[table_name].to_hash.keys.include?(name.sub('=', ''))
|
43
|
+
if name =~ /=$/
|
44
|
+
if @record[name] != args[0]
|
45
|
+
@record[name.sub('=', '')] = args[0]
|
46
|
+
end
|
47
|
+
else
|
48
|
+
set_default_if_nil(name) # returns default value if value(name) is nil
|
49
|
+
end
|
50
|
+
else
|
51
|
+
log("Column '#{name.sub('=', '')}' do not exists", :error)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
5
56
|
|
6
|
-
def initialize(fields, data = nil)
|
7
|
-
@fields = fields
|
8
|
-
if data.nil?
|
9
|
-
@record = Hash.new
|
10
|
-
@new = true
|
11
|
-
self.id = 0
|
12
|
-
else
|
13
|
-
@record = data
|
14
|
-
@new = false
|
15
|
-
end
|
16
|
-
@persisted = false
|
17
|
-
set_defaults # we need to apply again the defaults
|
18
|
-
end
|
19
|
-
|
20
|
-
def method_missing(name, *args)
|
21
|
-
attribute = name.to_s
|
22
|
-
|
23
|
-
if @fields.to_hash.keys.include?(attribute.sub('=', ''))
|
24
|
-
if attribute =~ /=$/
|
25
|
-
if @record[attribute] != args[0]
|
26
|
-
@record[attribute.sub('=', '')] = args[0]
|
27
|
-
@persisted = true
|
28
|
-
end
|
29
|
-
else
|
30
|
-
@record[attribute]
|
31
|
-
end
|
32
|
-
else
|
33
|
-
raise "Column '#{attribute.sub('=', '')}' do not exists"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def save_with_id(id)
|
38
|
-
self.created_at = Time.now.to_i
|
39
|
-
self.updated_at = Time.now.to_i
|
40
|
-
self.id = id
|
41
|
-
@new = false
|
42
|
-
@persisted = false
|
43
|
-
end
|
44
|
-
|
45
|
-
def update
|
46
|
-
self.updated_at = Time.now.to_i
|
47
|
-
@new = false
|
48
|
-
@persisted = false
|
49
|
-
end
|
50
|
-
|
51
|
-
def to_hash
|
52
|
-
@record
|
53
|
-
end
|
54
|
-
|
55
|
-
def new?
|
56
|
-
@new
|
57
|
-
end
|
58
|
-
|
59
|
-
def persisted?
|
60
|
-
@persisted
|
61
|
-
end
|
62
|
-
|
63
|
-
def created_at
|
64
|
-
Time.at(@record['created_at'])
|
65
|
-
end
|
66
|
-
|
67
|
-
def persisted_at
|
68
|
-
Time.at(@record['updated_at'])
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def set_defaults
|
74
|
-
@fields.each do |name, values|
|
75
|
-
if values.default and @record[name].nil?
|
76
|
-
@record[name] = values.default
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# # TODO : Add Validation
|
82
|
-
|
83
|
-
# def save!
|
84
|
-
# raiseif(save, false, "Error saving the record.")
|
85
|
-
# end
|
86
|
-
|
87
|
-
# def save
|
88
|
-
# return @table_class.save
|
89
|
-
# end
|
90
|
-
|
91
|
-
end
|
92
57
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
module Records
|
4
|
+
|
5
|
+
def record(key)
|
6
|
+
JSONdb.records[@name][key]
|
7
|
+
end
|
8
|
+
|
9
|
+
def new_record
|
10
|
+
return JSONdb::Record.new(@name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def insert_record(record)
|
14
|
+
@persisted = false
|
15
|
+
@updated_at = Time.now.to_i # updated table updated_at time
|
16
|
+
|
17
|
+
record.id = new_id
|
18
|
+
record.created_at = Time.now.to_i
|
19
|
+
record.updated_at = Time.now.to_i
|
20
|
+
JSONdb.records[@name][record.id] = record
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_record(record)
|
24
|
+
@persisted = false
|
25
|
+
JSONdb.records[@name][record.id] = record
|
26
|
+
end
|
27
|
+
|
28
|
+
def drop_record(record)
|
29
|
+
begin
|
30
|
+
@persisted = false
|
31
|
+
JSONdb.records[@name][record.id] = nil
|
32
|
+
JSONdb.records[@name].delete(record.id)
|
33
|
+
record = nil
|
34
|
+
return true
|
35
|
+
rescue
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def exists?(record)
|
41
|
+
!JSONdb.records[@name][record.id].nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def record_count
|
45
|
+
JSONdb.records[@name].keys.count
|
46
|
+
end
|
47
|
+
|
48
|
+
alias :count :record_count
|
49
|
+
|
50
|
+
def records_to_hash
|
51
|
+
to_hash = Hash.new
|
52
|
+
JSONdb.records[@name].each do |key, values|
|
53
|
+
to_hash = to_hash.merge({
|
54
|
+
key => values.to_hash
|
55
|
+
})
|
56
|
+
end
|
57
|
+
return to_hash
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
class ResultSet
|
4
|
+
|
5
|
+
def initialize(table_name)
|
6
|
+
@table_name = table_name
|
7
|
+
|
8
|
+
@result = Hash.new
|
9
|
+
|
10
|
+
# TODO: It must not be here, jsut a workaround atm
|
11
|
+
JSONdb.records[@table_name].each do |k, v|
|
12
|
+
@result[k] = v.dup
|
13
|
+
end
|
14
|
+
|
15
|
+
@equal = Hash.new
|
16
|
+
@min = Hash.new
|
17
|
+
@max = Hash.new
|
18
|
+
@like = Hash.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def equal(field, value)
|
22
|
+
@equal[field] = value
|
23
|
+
return self
|
24
|
+
end
|
25
|
+
|
26
|
+
def min(field, value)
|
27
|
+
@min[field] = value
|
28
|
+
return self
|
29
|
+
end
|
30
|
+
|
31
|
+
def max(field, value)
|
32
|
+
@max[field] = value
|
33
|
+
return self
|
34
|
+
end
|
35
|
+
|
36
|
+
def interval(field, min, max)
|
37
|
+
@min[field] = min
|
38
|
+
@max[field] = max
|
39
|
+
return self
|
40
|
+
end
|
41
|
+
|
42
|
+
def like(field, value)
|
43
|
+
@like[field] = value
|
44
|
+
return self
|
45
|
+
end
|
46
|
+
|
47
|
+
# TODO: For next version
|
48
|
+
# TODO: Change it, it must compare all records at the same time
|
49
|
+
# all_records.each do |r|
|
50
|
+
# eq.each do |k,v|
|
51
|
+
# ok if match
|
52
|
+
# ok_array << ok
|
53
|
+
# end
|
54
|
+
# if ok_Array.all == true
|
55
|
+
# then it match
|
56
|
+
def result
|
57
|
+
eq = result_equal if @equal.keys.count != 0
|
58
|
+
min = result_min if @min.keys.count != 0
|
59
|
+
max = result_max if @max.keys.count != 0
|
60
|
+
like = result_like if @like.keys.count != 0
|
61
|
+
return @result
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def result_equal
|
67
|
+
@equal.each do |col_name, col_value|
|
68
|
+
this_result = Array.new
|
69
|
+
@result.each do |id, record|
|
70
|
+
r = record.send col_name.to_sym
|
71
|
+
if r == col_value
|
72
|
+
this_result << id
|
73
|
+
end
|
74
|
+
end
|
75
|
+
remove_if_key_not_in(this_result)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def result_min
|
80
|
+
@min.each do |col_name, col_value|
|
81
|
+
this_result = Array.new
|
82
|
+
@result.each do |id, record|
|
83
|
+
r = record.send col_name.to_sym
|
84
|
+
if r >= col_value
|
85
|
+
this_result << id
|
86
|
+
end
|
87
|
+
end
|
88
|
+
remove_if_key_not_in(this_result)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def result_max
|
93
|
+
@max.each do |col_name, col_value|
|
94
|
+
this_result = Array.new
|
95
|
+
@result.each do |id, record|
|
96
|
+
r = record.send col_name.to_sym
|
97
|
+
if r <= col_value
|
98
|
+
this_result << id
|
99
|
+
end
|
100
|
+
end
|
101
|
+
remove_if_key_not_in(this_result)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def result_like
|
106
|
+
@like.each do |col_name, col_value|
|
107
|
+
this_result = Array.new
|
108
|
+
@result.each do |id, record|
|
109
|
+
r = record.send col_name.to_sym
|
110
|
+
if r =~ Regexp.new(col_value)
|
111
|
+
this_result << id
|
112
|
+
end
|
113
|
+
end
|
114
|
+
remove_if_key_not_in(this_result)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def remove_if_key_not_in(arr)
|
119
|
+
@result.keys.each do |key|
|
120
|
+
@result.delete(key) if arr.include?(key) == false
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|