blackstack-db 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0071d134f56134425dfa5667077f9ca8ee1d57fc4c23783be3ad6fb05afca2a9
4
+ data.tar.gz: 694fe13b831760553ad8736a120d56615650f437f4fa3987711bb5534d1783b2
5
+ SHA512:
6
+ metadata.gz: adc65af017b86399f60d1015f474fdf18565fffa4ee25c420bc1ac51f9257cbca87407dca6e7b436faf706e4f2828b1445a90ef9e76c32ba4b2454f439107c31
7
+ data.tar.gz: 9c16d76967f2eb07a74e32c12fc984e925e844e934ca3079ef8d52a6f5f8b8adc38a331466e51ec098500683b174879dd3c8a476024f8c3245141d59117ab82f
@@ -0,0 +1,153 @@
1
+ module BlackStack
2
+ module CRDB
3
+ # database connection parameters
4
+ @@db_url = nil
5
+ @@db_port = nil
6
+ @@db_cluster = nil
7
+ @@db_name = nil
8
+ @@db_user = nil
9
+ @@db_password = nil
10
+ @@db_sslmode = nil
11
+
12
+ # return the connection string for a postgresql database
13
+ def self.connection_string
14
+ ret = nil
15
+ if @@db_cluster
16
+ ret = "postgresql://#{@@db_user}:#{@@db_password}@#{@@db_url}:#{@@db_port}/#{@@db_cluster}.#{@@db_name}?sslmode=#{@@db_sslmode}"
17
+ else
18
+ ret = "postgresql://#{@@db_user}:#{@@db_password}@#{@@db_url}:#{@@db_port}/#{@@db_name}?sslmode=#{@@db_sslmode}"
19
+ end
20
+ ret
21
+ end # connection_string
22
+
23
+ # return the connection string for a postgresql database
24
+ #
25
+ # DEPRECATED!
26
+ #
27
+ def self.connection_string_2
28
+ "postgresql://#{@@db_user}:#{@@db_password}@#{@@db_url}:#{@@db_port}?sslmode=#{@@db_sslmode}&options=--cluster%3D#{@@db_cluster}"
29
+ end # connection_string
30
+
31
+ # create database connection
32
+ def self.connect
33
+ BlackStack::set_db_type(BlackStack::TYPE_CRDB)
34
+ Sequel.connect(BlackStack::CRDB.connection_string)
35
+ end
36
+
37
+ # database connection getters
38
+ def self.db_url
39
+ @@db_url
40
+ end
41
+ def self.db_port
42
+ @@db_port
43
+ end
44
+ def self.db_cluster
45
+ @@db_cluster
46
+ end
47
+ def self.db_name
48
+ @@db_name
49
+ end
50
+ def self.db_user
51
+ @@db_user
52
+ end
53
+ def self.db_password
54
+ @@db_password
55
+ end
56
+ def self.db_sslmode
57
+ @@db_sslmode
58
+ end
59
+ def self.set_db_params(h)
60
+ # validate: the parameter h is requred
61
+ raise "The parameter h is required." if h.nil?
62
+
63
+ # validate: the parameter h must be a hash
64
+ raise "The parameter h must be a hash" unless h.is_a?(Hash)
65
+
66
+ # validate: the :db_url key is required
67
+ raise 'The key :db_url is required' unless h.has_key?(:db_url)
68
+
69
+ # validate: the :db_port key is required
70
+ raise 'The key :db_port is required' unless h.has_key?(:db_port)
71
+
72
+ # validate: the db_name key is required
73
+ raise 'The key :db_name is required' unless h.has_key?(:db_name)
74
+
75
+ # validate: the db_user key is required
76
+ raise 'The key :db_user is required' unless h.has_key?(:db_user)
77
+
78
+ # validate: the db_password key is required
79
+ raise 'The key :db_password is required' unless h.has_key?(:db_password)
80
+
81
+ # validate: the :db_url key must be a string
82
+ raise 'The key :db_url must be a string' unless h[:db_url].is_a?(String)
83
+
84
+ # validate: the :db_port key must be an integer, or a string that can be converted to an integer
85
+ raise 'The key :db_port must be an integer' unless h[:db_port].is_a?(Integer) || (h[:db_port].is_a?(String) && h[:db_port].to_i.to_s == h[:db_port])
86
+
87
+ # validate: the :db_name key must be a string
88
+ raise 'The key :db_name must be a string' unless h[:db_name].is_a?(String)
89
+
90
+ # validate: the :db_user key must be a string
91
+ raise 'The key :db_user must be a string' unless h[:db_user].is_a?(String)
92
+
93
+ # validate: the :db_password key must be a string
94
+ raise 'The key :db_password must be a string' unless h[:db_password].is_a?(String)
95
+
96
+ # map values
97
+ @@db_url = h[:db_url]
98
+ @@db_port = h[:db_port].to_i
99
+ @@db_cluster = h[:db_cluster] # default is nil
100
+ @@db_name = h[:db_name]
101
+ @@db_user = h[:db_user]
102
+ @@db_password = h[:db_password]
103
+ @@db_sslmode = h[:db_sslmode] || 'verify-full' # default is verify-full
104
+ end # set_db_params
105
+
106
+ # return a postgresql uuid
107
+ def self.guid()
108
+ DB['SELECT gen_random_uuid() AS id'].first[:id]
109
+ end
110
+
111
+ # return current datetime with format `%Y-%m-%d %H:%M:%S %Z`, using the timezone of the database (`select current_setting('TIMEZONE')`)
112
+ # TODO: I am hardcoding the value of `tz` because for any reason `SELECT current_setting('TIMEZONE')` returns `UTC` instead of
113
+ # `America/Argentina/Buenos_Aires` when I run it from Ruby. Be sure your database is ALWAYS configured with the correct timezone.
114
+ def self.now()
115
+ tz = 'America/Argentina/Buenos_Aires' #DB["SELECT current_setting('TIMEZONE') AS tz"].first[:tz]
116
+ DB["SELECT current_timestamp() at TIME ZONE '#{tz}' AS now"].first[:now]
117
+ end
118
+ =begin
119
+ # test the connection to the database.
120
+ # raise an exception if the connection fails, or if any incongruence is found.
121
+ def self.test(l=nil)
122
+ l = BlackStack::DummyLogger.new if l.nil?
123
+ @db = nil
124
+
125
+ #l.log "Connection String:"
126
+ #l.log BlackStack::TYPE_CRDB::connection_string
127
+
128
+ l.logs "Testing connection... "
129
+ begin
130
+ @db = BlackStack::Deployer::DB::connect(
131
+ BlackStack::TYPE_CRDB::connection_string # use the connection parameters setting in ./config.rb
132
+ )
133
+ l.logf "success"
134
+ rescue => e
135
+ l.logf "failed"
136
+ l.log e.message
137
+ end
138
+
139
+ # if the name of databsase in `config.rb` is wrong, the connection is made to the defaultdb.
140
+ # This validation checks the connection to the correct database.
141
+ begin
142
+ l.logs "Verify database name... "
143
+ s = @db["SHOW DATABASES"].first.to_s
144
+ raise 'Wrong database name' if s !~ /:database_name=>\"#{Regexp.escape(BlackStack::TYPE_CRDB::db_name)}\"/i
145
+ l.logf "success"
146
+ rescue => e
147
+ l.logf "failed"
148
+ l.log e.message
149
+ end
150
+ end
151
+ =end
152
+ end # module CRDB
153
+ end # module BlackStack
@@ -0,0 +1,135 @@
1
+ module BlackStack
2
+ module PostgreSQL
3
+ # database connection parameters
4
+ @@db_url = nil
5
+ @@db_port = nil
6
+ @@db_name = nil
7
+ @@db_user = nil
8
+ @@db_password = nil
9
+
10
+ # return the connection string for a postgresql database
11
+ def self.connection_string
12
+ "postgresql://#{@@db_user}:#{@@db_password}@#{@@db_url}:#{@@db_port}/#{@@db_name}"
13
+ end # connection_string
14
+
15
+ # database connection getters
16
+ def self.db_url
17
+ @@db_url
18
+ end
19
+ def self.db_port
20
+ @@db_port
21
+ end
22
+ def self.db_name
23
+ @@db_name
24
+ end
25
+ def self.db_user
26
+ @@db_user
27
+ end
28
+ def self.db_password
29
+ @@db_password
30
+ end
31
+
32
+ def self.set_db_params(h)
33
+ # validate: the parameter h is requred
34
+ raise "The parameter h is required." if h.nil?
35
+
36
+ # validate: the parameter h must be a hash
37
+ raise "The parameter h must be a hash" unless h.is_a?(Hash)
38
+
39
+ # validate: the :db_url key is required
40
+ raise 'The key :db_url is required' unless h.has_key?(:db_url)
41
+
42
+ # validate: the :db_port key is required
43
+ raise 'The key :db_port is required' unless h.has_key?(:db_port)
44
+
45
+ # validate: the db_name key is required
46
+ raise 'The key :db_name is required' unless h.has_key?(:db_name)
47
+
48
+ # validate: the db_user key is required
49
+ raise 'The key :db_user is required' unless h.has_key?(:db_user)
50
+
51
+ # validate: the db_password key is required
52
+ raise 'The key :db_password is required' unless h.has_key?(:db_password)
53
+
54
+ # validate: the :db_url key must be a string
55
+ raise 'The key :db_url must be a string' unless h[:db_url].is_a?(String)
56
+
57
+ # validate: the :db_port key must be an integer, or a string that can be converted to an integer
58
+ raise 'The key :db_port must be an integer' unless h[:db_port].is_a?(Integer) || (h[:db_port].is_a?(String) && h[:db_port].to_i.to_s == h[:db_port])
59
+
60
+ # validate: the :db_name key must be a string
61
+ raise 'The key :db_name must be a string' unless h[:db_name].is_a?(String)
62
+
63
+ # validate: the :db_user key must be a string
64
+ raise 'The key :db_user must be a string' unless h[:db_user].is_a?(String)
65
+
66
+ # validate: the :db_password key must be a string
67
+ raise 'The key :db_password must be a string' unless h[:db_password].is_a?(String)
68
+
69
+ # map values
70
+ @@db_url = h[:db_url]
71
+ @@db_port = h[:db_port].to_i
72
+ @@db_name = h[:db_name]
73
+ @@db_user = h[:db_user]
74
+ @@db_password = h[:db_password]
75
+ end # set_db_params
76
+
77
+ # create database connection
78
+ def self.connect
79
+ BlackStack::set_db_type(BlackStack::TYPE_POSTGRESQL)
80
+ Sequel.connect(BlackStack::PostgreSQL.connection_string)
81
+ end
82
+
83
+ # return a postgresql uuid
84
+ def self.guid()
85
+ DB['SELECT uuid_generate_v4() AS id'].first[:id]
86
+ end
87
+
88
+ # return current datetime with format `%Y-%m-%d %H:%M:%S %Z`, using the timezone of the database (`select current_setting('TIMEZONE')`)
89
+ # TODO: I am hardcoding the value of `tz` because for any reason `SELECT current_setting('TIMEZONE')` returns `UTC` instead of
90
+ # `America/Argentina/Buenos_Aires` when I run it from Ruby. Be sure your database is ALWAYS configured with the correct timezone.
91
+ def self.now()
92
+ tz = 'America/Argentina/Buenos_Aires' #DB["SELECT current_setting('TIMEZONE') AS tz"].first[:tz]
93
+ DB["SELECT current_timestamp at TIME ZONE '#{tz}' AS now"].first[:now]
94
+ end
95
+
96
+ def self.seconds_ago(n)
97
+ tz = 'America/Argentina/Buenos_Aires' #DB["SELECT current_setting('TIMEZONE') AS tz"].first[:tz]
98
+ DB["SELECT (current_timestamp - interval '#{n} seconds') at TIME ZONE '#{tz}' AS now"].first[:now]
99
+ end
100
+ =begin
101
+ # test the connection to the database.
102
+ # raise an exception if the connection fails, or if any incongruence is found.
103
+ def self.test(l=nil)
104
+ l = BlackStack::DummyLogger.new if l.nil?
105
+ @db = nil
106
+
107
+ #l.log "Connection String:"
108
+ #l.log BlackStack::PostgreSQL::connection_string
109
+
110
+ l.logs "Testing connection... "
111
+ begin
112
+ @db = BlackStack::Deployer::DB::connect(
113
+ BlackStack::PostgreSQL::connection_string # use the connection parameters setting in ./config.rb
114
+ )
115
+ l.logf "success"
116
+ rescue => e
117
+ l.logf "failed"
118
+ l.log e.message
119
+ end
120
+
121
+ # if the name of databsase in `config.rb` is wrong, the connection is made to the defaultdb.
122
+ # This validation checks the connection to the correct database.
123
+ begin
124
+ l.logs "Verify database name... "
125
+ s = @db["SHOW DATABASES"].first.to_s
126
+ raise 'Wrong database name' if s !~ /:database_name=>\"#{Regexp.escape(BlackStack::PostgreSQL::db_name)}\"/i
127
+ l.logf "success"
128
+ rescue => e
129
+ l.logf "failed"
130
+ l.log e.message
131
+ end
132
+ end
133
+ =end
134
+ end # module PostgreSQL
135
+ end
@@ -0,0 +1,39 @@
1
+ require 'sequel'
2
+ require_relative './blackstack-db/postgresql.rb'
3
+ require_relative './blackstack-db/crdb.rb'
4
+
5
+ module BlackStack
6
+ TYPE_POSTGRESQL = 0
7
+ TYPE_CRDB = 1
8
+ @@db_type = nil
9
+
10
+ def self.set_db_type(n)
11
+ @@db_type = n
12
+ end # set_db_type
13
+
14
+ def self.db_type
15
+ @@db_type
16
+ end # db_type
17
+ end # BlackStack
18
+
19
+ # return a postgresql uuid
20
+ def guid()
21
+ if BlackStack.db_type == BlackStack::TYPE_POSTGRESQL
22
+ return BlackStack::PostgreSQL.guid
23
+ elsif BlackStack.db_type == BlackStack::TYPE_CRDB
24
+ return BlackStack::CRDB.guid
25
+ else
26
+ raise "Unknown database type"
27
+ end
28
+ end
29
+
30
+ # return current datetime with format `YYYY-MM-DD HH:MM:SS`
31
+ def now()
32
+ if BlackStack.db_type == BlackStack::TYPE_POSTGRESQL
33
+ return BlackStack::PostgreSQL.now
34
+ elsif BlackStack.db_type == BlackStack::TYPE_CRDB
35
+ return BlackStack::CRDB.now
36
+ else
37
+ raise "Unknown database type"
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blackstack-db
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Leandro Daniel Sardi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sequel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.56.0
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.56.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 5.56.0
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.56.0
33
+ description: 'Modules for simple setup of database connections: https://github.com/leandrosardi/blackstack-db.'
34
+ email: leandro@connectionsphere.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - lib/blackstack-db.rb
40
+ - lib/blackstack-db/crdb.rb
41
+ - lib/blackstack-db/postgresql.rb
42
+ homepage: https://rubygems.org/gems/blackstack-db
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubygems_version: 3.3.7
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Modules for simple setup of database connections.
65
+ test_files: []