jsondb 0.0.2 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4793168a17a83f7ad3eb5d49cc0e052088959cce
|
4
|
+
data.tar.gz: 9d0c92ef993e8341addaff73a31ed7bc55b0b51a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2922cbddb35a1b3809b9d12e60cb6a7422f3cab7bd983b3ef8c657b12cee4cdb47874698f5b2a66359337ff724730b2bb2a3dfdeb9b74177ee68352416603b87
|
7
|
+
data.tar.gz: 591ba95be5babb2d39e7021c73f09dd80bdfa2bd25ec8391c97f1564bdfe7c1856937d8de49ac6c71eee6cc5305268cf5f8ad66d71d82560bdf266b9fe33cfaa
|
data/lib/jsondb.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
1
|
#it depends on json_pure
|
2
2
|
require 'json/pure'
|
3
|
+
require 'fileutils'
|
3
4
|
|
4
5
|
this_dir = File.dirname(__FILE__)
|
6
|
+
require File.join(this_dir, 'jsondb/constants')
|
7
|
+
require File.join(this_dir, 'jsondb/logger')
|
8
|
+
require File.join(this_dir, 'jsondb/validations')
|
9
|
+
require File.join(this_dir, 'jsondb/settings')
|
5
10
|
require File.join(this_dir, 'jsondb/file_ops')
|
6
|
-
require File.join(this_dir, 'jsondb/
|
7
|
-
require File.join(this_dir, 'jsondb/
|
8
|
-
require File.join(this_dir, 'jsondb/table')
|
9
|
-
require File.join(this_dir, 'jsondb/field')
|
11
|
+
require File.join(this_dir, 'jsondb/result_set')
|
12
|
+
require File.join(this_dir, 'jsondb/commands')
|
10
13
|
require File.join(this_dir, 'jsondb/record')
|
11
|
-
require File.join(this_dir, 'jsondb/
|
14
|
+
require File.join(this_dir, 'jsondb/records')
|
15
|
+
require File.join(this_dir, 'jsondb/field')
|
16
|
+
require File.join(this_dir, 'jsondb/fields')
|
17
|
+
require File.join(this_dir, 'jsondb/table')
|
18
|
+
require File.join(this_dir, 'jsondb/tables')
|
19
|
+
require File.join(this_dir, 'jsondb/db')
|
20
|
+
require File.join(this_dir, 'jsondb/base')
|
data/lib/jsondb/base.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
@@settings = Settings.new
|
4
|
+
@@constants = Constants.new
|
5
|
+
@@tables = Hash.new
|
6
|
+
@@fields = Hash.new
|
7
|
+
@@records = Hash.new
|
8
|
+
|
9
|
+
|
10
|
+
def self.settings
|
11
|
+
@@settings
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.constants
|
15
|
+
@@constants
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.tables
|
19
|
+
@@tables
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.fields
|
23
|
+
@@fields
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.records
|
27
|
+
@@records
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
module Commands
|
4
|
+
|
5
|
+
include JSONdb::Validations::Records
|
6
|
+
|
7
|
+
def select_from(table_name)
|
8
|
+
return ResultSet.new(table_name)
|
9
|
+
end
|
10
|
+
|
11
|
+
alias :select :select_from
|
12
|
+
|
13
|
+
def insert_into(table_name, record)
|
14
|
+
if record_validates?(table_name, record)
|
15
|
+
JSONdb.tables[table_name].insert_record(record)
|
16
|
+
log("Inserted record: #{record.inspect}", :debug)
|
17
|
+
return true
|
18
|
+
else
|
19
|
+
log("Record do not pass validations: #{record.inspect}", :error)
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
alias :insert :insert_into
|
25
|
+
|
26
|
+
def update_set(table_name, record)
|
27
|
+
if record_validates?(table_name, record)
|
28
|
+
JSONdb.tables[table_name].update_record(record)
|
29
|
+
log("Inserted record: #{record.inspect}", :debug)
|
30
|
+
return true
|
31
|
+
else
|
32
|
+
log("Record do not pass validations: #{record.inspect}", :error)
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
alias :update :update_set
|
38
|
+
|
39
|
+
def delete(table_name, record)
|
40
|
+
if JSONdb.tables[table_name].exists?(record)
|
41
|
+
log("Deleting record: #{record.inspect}", :debug)
|
42
|
+
JSONdb.tables[table_name].drop_record(record)
|
43
|
+
return true
|
44
|
+
else
|
45
|
+
log("Record does not exists, so we can delete it", :error)
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete_by_id(table_name, id)
|
51
|
+
return delete(table_name, JSONdb.records[table_name][id])
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
class Constants
|
4
|
+
|
5
|
+
attr_reader :default_file_content, :loglevels
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@default_file_content = {
|
9
|
+
'db' => "{ \"tables\": {}, \"db\": { \"created_at\": #{Time.now.to_i}, \"updated_at\": #{Time.now.to_i} } }",
|
10
|
+
'table' => '{ }',
|
11
|
+
'log' => '',
|
12
|
+
'raw' => ''
|
13
|
+
}
|
14
|
+
@loglevels = {
|
15
|
+
debug: 1,
|
16
|
+
info: 2,
|
17
|
+
error: 3
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/jsondb/db.rb
CHANGED
@@ -1,58 +1,95 @@
|
|
1
|
-
#db.rb
|
2
1
|
module JSONdb
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
2
|
+
|
3
|
+
class Db
|
4
|
+
|
5
|
+
attr_reader :created_at, :updated_at, :folder, :tables
|
6
|
+
|
7
|
+
include JSONdb::Tables
|
8
|
+
include JSONdb::Commands
|
9
|
+
|
10
|
+
def initialize(folder, create_folder_if_not_exists = true, writeable = true)
|
11
|
+
|
12
|
+
JSONdb.settings.folder = folder
|
13
|
+
JSONdb.settings.log_folder = folder
|
14
|
+
JSONdb.settings.writeable = writeable
|
15
|
+
|
16
|
+
@folder = File.expand_path(folder)
|
17
|
+
@created_at = nil
|
18
|
+
@updated_at = nil
|
19
|
+
|
20
|
+
open_database(create_folder_if_not_exists)
|
21
|
+
end
|
22
|
+
|
23
|
+
def writable
|
24
|
+
JSONdb.settings.writeable
|
25
|
+
end
|
26
|
+
|
27
|
+
def persist
|
28
|
+
begin
|
29
|
+
JSONdb.tables.keys.each do |key|
|
30
|
+
JSONdb.tables[key].persist if JSONdb.tables[key].persisted == false
|
31
|
+
end
|
32
|
+
@file.contents = db_to_hash(true)
|
33
|
+
@file.write
|
34
|
+
log("DB saved to disk", :debug)
|
35
|
+
return true
|
36
|
+
rescue
|
37
|
+
log("DB NOT saved to disk!", :error, true)
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def db_to_hash(update = false)
|
43
|
+
@updated_at = Time.now.to_i if update
|
44
|
+
{
|
45
|
+
"tables" => tables_to_hash,
|
46
|
+
"db" => {
|
47
|
+
"created_at" => @created_at,
|
48
|
+
"updated_at" => @updated_at
|
49
|
+
}
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def open_database(create_folder_if_not_exists)
|
56
|
+
create_folder if create_folder_if_not_exists == true
|
57
|
+
|
58
|
+
raise "DB Main Folder not found!" if !Dir.exists?(@folder)
|
59
|
+
|
60
|
+
@file = FileOps.new(@folder, '_db.json', 'db')
|
61
|
+
@file.read
|
62
|
+
tables_in_file = @file.contents['tables']
|
63
|
+
|
64
|
+
tables_in_file.each do |table_name, values|
|
65
|
+
JSONdb.tables[table_name] = JSONdb::Table.new(name, false)
|
66
|
+
JSONdb.tables[table_name].created_at = values['created_at']
|
67
|
+
JSONdb.tables[table_name].updated_at = values['updated_at']
|
68
|
+
JSONdb.tables[table_name].last_id = values['last_id']
|
69
|
+
JSONdb.fields[table_name] = Hash.new
|
70
|
+
# fields
|
71
|
+
fields_in_file = values['fields']
|
72
|
+
fields_in_file.each do |field_name, field_values|
|
73
|
+
JSONdb.fields[table_name][field_name] = Field.new(field_name)
|
74
|
+
JSONdb.fields[table_name][field_name].type = field_values['type']
|
75
|
+
JSONdb.fields[table_name][field_name].nullalble = field_values['nullalble']
|
76
|
+
JSONdb.fields[table_name][field_name].default = field_values['default']
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if @file.new_file
|
81
|
+
@file.write
|
82
|
+
log("Created data file for database structure.", :info)
|
83
|
+
else
|
84
|
+
log("Loaded data file for database structure.", :info)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def create_folder
|
89
|
+
@created_at = Time.now.to_i
|
90
|
+
FileUtils.mkdir_p(@folder) if !Dir.exists?(@folder)
|
91
|
+
end
|
92
|
+
|
93
|
+
end #class
|
94
|
+
|
95
|
+
end #module
|
data/lib/jsondb/field.rb
CHANGED
@@ -1,50 +1,82 @@
|
|
1
1
|
module JSONdb
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
2
|
+
|
3
|
+
class Field
|
4
|
+
|
5
|
+
include JSONdb::Validations::Naming
|
6
|
+
include JSONdb::Validations::Types
|
7
|
+
include JSONdb::Logger
|
8
|
+
|
9
|
+
attr_reader :type, :nullable, :default
|
10
|
+
|
11
|
+
def initialize(name)
|
12
|
+
@name = name if allowed_name?(name)
|
13
|
+
|
14
|
+
# override common setters
|
15
|
+
self.type = "String"
|
16
|
+
self.nullable = true
|
17
|
+
self.default = ""
|
18
|
+
|
19
|
+
# set_defaults
|
20
|
+
end
|
21
|
+
|
22
|
+
def type=(_class)
|
23
|
+
if allowed_type?(_class)
|
24
|
+
@type = _class
|
25
|
+
return true
|
26
|
+
else
|
27
|
+
log("'#{_class}' not allowed as field type", :error)
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def nullable=(value)
|
33
|
+
if validate_type("Bool", value)
|
34
|
+
@nullable = value
|
35
|
+
return true
|
36
|
+
else
|
37
|
+
log("'#{value}' not allowed for nullable", :error)
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def default=(value)
|
43
|
+
if validate_type(@type, value)
|
44
|
+
@default = value
|
45
|
+
return true
|
46
|
+
else
|
47
|
+
log("'#{value}' not allowed as #{type} class.")
|
48
|
+
return false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def nullable
|
53
|
+
@nullable
|
54
|
+
end
|
55
|
+
|
56
|
+
def type
|
57
|
+
@type
|
58
|
+
end
|
59
|
+
|
60
|
+
def default
|
61
|
+
@default
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_hash
|
65
|
+
{
|
66
|
+
"type" => @type,
|
67
|
+
"nullable" => @nullable,
|
68
|
+
"default" => @default
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def set_defaults
|
75
|
+
@nullable = true
|
76
|
+
@default = ""
|
77
|
+
@type = "String"
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
50
82
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module JSONdb
|
2
|
+
|
3
|
+
module Fields
|
4
|
+
|
5
|
+
def fields
|
6
|
+
JSONdb.fields[@name].keys
|
7
|
+
end
|
8
|
+
|
9
|
+
def field(name)
|
10
|
+
JSONdb.fields[@name][name]
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_field(name)
|
14
|
+
JSONdb.fields[@name][name] = Field.new(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def drop_field(name)
|
18
|
+
JSONdb.fields[@name][name] = nil
|
19
|
+
JSONdb.fields[@name].delete(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def fields_to_hash
|
23
|
+
to_hash = Hash.new
|
24
|
+
JSONdb.fields[@name].each do |key, values|
|
25
|
+
to_hash.merge!({
|
26
|
+
key => values.to_hash
|
27
|
+
})
|
28
|
+
end
|
29
|
+
return to_hash
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_main_fields
|
33
|
+
if JSONdb.fields[@name]["id"].nil?
|
34
|
+
JSONdb.fields[@name]["id"] = create_field('id')
|
35
|
+
JSONdb.fields[@name]["id"].type = "Fixnum"
|
36
|
+
JSONdb.fields[@name]["id"].nullable = false
|
37
|
+
JSONdb.fields[@name]["id"].default = 0
|
38
|
+
end
|
39
|
+
if JSONdb.fields[@name]["created_at"].nil?
|
40
|
+
JSONdb.fields[@name]["created_at"] = create_field('created_at')
|
41
|
+
JSONdb.fields[@name]["created_at"].type = "Fixnum"
|
42
|
+
JSONdb.fields[@name]["created_at"].nullable = false
|
43
|
+
JSONdb.fields[@name]["created_at"].default = 0
|
44
|
+
end
|
45
|
+
if JSONdb.fields[@name]["updated_at"].nil?
|
46
|
+
JSONdb.fields[@name]["updated_at"] = create_field('updated_at')
|
47
|
+
JSONdb.fields[@name]["updated_at"].type = "Fixnum"
|
48
|
+
JSONdb.fields[@name]["updated_at"].nullable = false
|
49
|
+
JSONdb.fields[@name]["updated_at"].default = 0
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|