pg_ctrl 0.0.8
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/.gitignore +9 -0
- data/.rspec +2 -0
- data/.ruby_version +1 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/TODO +3 -0
- data/lib/pg_ctrl/db.rb +78 -0
- data/lib/pg_ctrl/load.rb +80 -0
- data/lib/pg_ctrl/version.rb +3 -0
- data/lib/pg_ctrl.rb +10 -0
- data/main +44 -0
- data/pg_ctrl.gemspec +23 -0
- data/spec/spec_helper.rb +11 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f29124242193bf5f9f5c2c2768f924f0a2f3a0252daf53eda8394892dbfa0058
|
4
|
+
data.tar.gz: bdeeee78f5f2d68177d98956508127b5c92555ac999da7319cdf54bf7b7ca1a1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ce9a19a47a13f8cf7d5ec8d755482e4093197b5ea4dff35d1ff1e7d165317b0a2b36f68ee17c0500b9ecb3c5cf4e7844a711c44f5d095b221fef4fc0d70e8bd5
|
7
|
+
data.tar.gz: 9431c871a9fc6001a486d1411b1b97431fcf5dfd7cc8461e942e80f2da792731f41cae2635038bd0cdf00821a12f9e60f8001ecaa9a5d7e9cbeecbeca3e3b95e
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby_version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.7.1
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/pg_ctrl/db.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
module PgCtrl
|
3
|
+
module Utils; end
|
4
|
+
|
5
|
+
class RDBMSObject
|
6
|
+
include Utils
|
7
|
+
attr_reader :rdbms
|
8
|
+
attr_reader :oid
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :owner
|
11
|
+
def initialize(rdbms, oid, name, owner, opts = {})
|
12
|
+
@rdbms, @oid, @name, @owner = rdbms, oid, name, owner
|
13
|
+
end
|
14
|
+
def to_s() @name end
|
15
|
+
end
|
16
|
+
|
17
|
+
class User < RDBMSObject
|
18
|
+
def superuser?() @is_superuser end
|
19
|
+
def can_create_db?() @can_create_db end
|
20
|
+
def can_create_role?() @can_create_role end
|
21
|
+
def can_login?() @can_login end
|
22
|
+
def initialize(rdbms, oid, name, opts = {})
|
23
|
+
super(rdbms, oid, name, self)
|
24
|
+
set_opts(opts, :is_superuser, :can_create_db, :can_create_role,
|
25
|
+
:can_login)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Database < RDBMSObject
|
30
|
+
attr_reader :encoding
|
31
|
+
attr_reader :lc_collate
|
32
|
+
attr_reader :lc_ctype
|
33
|
+
def template?() @is_template end
|
34
|
+
def can_connect?() @can_connect end
|
35
|
+
attr_reader :acl
|
36
|
+
def initialize(rdbms, oid, name, owner, opts = {})
|
37
|
+
super(rdbms, oid, name, owner)
|
38
|
+
set_opts(opts, :encoding, :lc_collate, :lc_ctype, :is_template,
|
39
|
+
:can_connect, :acl)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class RDBMS
|
44
|
+
include Utils
|
45
|
+
|
46
|
+
attr_reader :id
|
47
|
+
|
48
|
+
attr_reader :connection
|
49
|
+
def ip?() !host.nil? end
|
50
|
+
def host() @connection.host end
|
51
|
+
def port() @connection.port.to_i end
|
52
|
+
|
53
|
+
# Users and databases indexed by name
|
54
|
+
attr_reader :users
|
55
|
+
attr_reader :databases
|
56
|
+
|
57
|
+
# Current user and database
|
58
|
+
attr_reader :user
|
59
|
+
attr_reader :database
|
60
|
+
|
61
|
+
# Arguments
|
62
|
+
# initialize(PGconn args)
|
63
|
+
# initialize(PGconn object)
|
64
|
+
#
|
65
|
+
def initialize(*args)
|
66
|
+
if args.size == 1 && PGconn === args[0]
|
67
|
+
@connection = args[0]
|
68
|
+
else
|
69
|
+
@connection = PGconn.new(args[0])
|
70
|
+
end
|
71
|
+
@id = (!host || host == "127.0.0.1" ? "localhost" : host)
|
72
|
+
load_data
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_s() @id end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
data/lib/pg_ctrl/load.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
|
2
|
+
module PgCtrl
|
3
|
+
module Utils
|
4
|
+
def set_opts(opts, *attrs)
|
5
|
+
attrs.map { |a| self.instance_variable_set("@#{a}", opts[a]) }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class RDBMSObjectSet
|
10
|
+
def initialize
|
11
|
+
@by_name = {}
|
12
|
+
@by_oid = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def size() @by_name.size end
|
16
|
+
def empty?() @by_name.empty? end
|
17
|
+
|
18
|
+
def [](key) Fixnum === key ? @by_oid[key] : @by_name[key] end
|
19
|
+
def add(value) @by_oid[value.oid] = @by_name[value.name] = value end
|
20
|
+
|
21
|
+
def keys() @by_name.keys end
|
22
|
+
def values() @by_name.values end
|
23
|
+
|
24
|
+
def each(&block) @by_name.each(&block) end
|
25
|
+
def map(&block) @by_name.map(&block) end
|
26
|
+
end
|
27
|
+
|
28
|
+
class RDBMS
|
29
|
+
LOAD_USERS_QUERY = %(
|
30
|
+
select oid as OID,
|
31
|
+
rolname as NAME,
|
32
|
+
rolsuper as IS_SUPERUSER,
|
33
|
+
rolcreaterole as CAN_CREATE_ROLE,
|
34
|
+
rolcreatedb as CAN_CREATE_DB,
|
35
|
+
rolcanlogin as CAN_LOGIN,
|
36
|
+
case when rolname = current_user then true else false end as
|
37
|
+
IS_CURRENT_USER
|
38
|
+
from pg_roles
|
39
|
+
)
|
40
|
+
|
41
|
+
def load_users
|
42
|
+
@connection.each_hash(LOAD_USERS_QUERY) { |r|
|
43
|
+
@users.add User.new(self, r[:oid], r[:name], r)
|
44
|
+
@user = @users[r[:name]] if r[:is_current_user]
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
LOAD_DATABASES_QUERY = %(
|
49
|
+
select pg_database.oid as OID,
|
50
|
+
datname as NAME,
|
51
|
+
rolname as OWNER,
|
52
|
+
pg_encoding_to_char(encoding) as ENCODING,
|
53
|
+
datcollate as LC_COLLATE,
|
54
|
+
datctype as LC_CTYPE,
|
55
|
+
datistemplate as IS_TEMPLATE,
|
56
|
+
datallowconn as CAN_CONNECT,
|
57
|
+
datacl as ACL,
|
58
|
+
case when datname = current_database() then true else false end as
|
59
|
+
IS_CURRENT_DATABASE
|
60
|
+
from pg_database
|
61
|
+
join pg_roles on datdba = pg_roles.oid
|
62
|
+
)
|
63
|
+
|
64
|
+
def load_databases
|
65
|
+
@connection.each_hash(LOAD_DATABASES_QUERY) { |r|
|
66
|
+
@databases.add \
|
67
|
+
Database.new(self, r[:oid], r[:name], @users[r[:owner]], r)
|
68
|
+
@database = @databases[r[:name]] if r[:is_current_database]
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def load_data
|
73
|
+
@users = RDBMSObjectSet.new
|
74
|
+
@databases = RDBMSObjectSet.new
|
75
|
+
load_users
|
76
|
+
load_databases
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
data/lib/pg_ctrl.rb
ADDED
data/main
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
PRJ_DIR = "/home/clr/prj"
|
4
|
+
|
5
|
+
$: << "#{ENV['PWD']}/lib" << "#{PRJ_DIR}/pg_util/lib"
|
6
|
+
|
7
|
+
require 'pg_util.rb'
|
8
|
+
require 'pg_ctrl.rb'
|
9
|
+
|
10
|
+
|
11
|
+
rdbms = PgCtrl::RDBMS.new
|
12
|
+
|
13
|
+
print "Databases\n"
|
14
|
+
rdbms.databases.values.each { |d|
|
15
|
+
print " #{d}\n"
|
16
|
+
print " OID: #{d.oid}\n"
|
17
|
+
print " Owner: #{d.owner}\n"
|
18
|
+
print " Encoding: #{d.encoding}\n"
|
19
|
+
print " LC Collate: #{d.lc_collate}\n"
|
20
|
+
print " LC CType: #{d.lc_ctype}\n"
|
21
|
+
print " Template: #{d.template?}\n"
|
22
|
+
print " Can connect: #{d.can_connect?}\n"
|
23
|
+
}
|
24
|
+
print "\n"
|
25
|
+
|
26
|
+
print "Users\n"
|
27
|
+
rdbms.users.values.each { |u|
|
28
|
+
print " #{u}\n"
|
29
|
+
print " OID: #{u.oid}\n"
|
30
|
+
print " Superuser: #{u.superuser?}\n"
|
31
|
+
print " Can create DB: #{u.can_create_db?}\n"
|
32
|
+
print " Can create role: #{u.can_create_role?}\n"
|
33
|
+
print " Can login: #{u.can_login?}\n"
|
34
|
+
|
35
|
+
}
|
36
|
+
print "\n"
|
37
|
+
|
38
|
+
print "RDBMS #{rdbms}\n"
|
39
|
+
print " host: #{rdbms.host}\n"
|
40
|
+
print " port: #{rdbms.port}\n"
|
41
|
+
print " user: #{rdbms.user}\n"
|
42
|
+
print " database: #{rdbms.database}\n"
|
43
|
+
print "\n"
|
44
|
+
|
data/pg_ctrl.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require_relative "lib/pg_ctrl/version"
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "pg_ctrl"
|
6
|
+
s.version = PgCtrl::VERSION
|
7
|
+
s.authors = ["Claus Rasmussen"]
|
8
|
+
s.email = ["clr@veda.dk"]
|
9
|
+
s.homepage = ""
|
10
|
+
s.summary = "Control PostgreSQL server"
|
11
|
+
s.description = "PgCtrl provide an interface for querying and controlling a PostgreSQL server"
|
12
|
+
|
13
|
+
s.rubyforge_project = "pg_ctrl"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# specify any dependencies here; for example:
|
21
|
+
# s.add_development_dependency "rspec"
|
22
|
+
# s.add_runtime_dependency "rest-client"
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper.rb"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pg_ctrl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Claus Rasmussen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-04-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: PgCtrl provide an interface for querying and controlling a PostgreSQL
|
14
|
+
server
|
15
|
+
email:
|
16
|
+
- clr@veda.dk
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- ".rspec"
|
23
|
+
- ".ruby_version"
|
24
|
+
- Gemfile
|
25
|
+
- Rakefile
|
26
|
+
- TODO
|
27
|
+
- lib/pg_ctrl.rb
|
28
|
+
- lib/pg_ctrl/db.rb
|
29
|
+
- lib/pg_ctrl/load.rb
|
30
|
+
- lib/pg_ctrl/version.rb
|
31
|
+
- main
|
32
|
+
- pg_ctrl.gemspec
|
33
|
+
- spec/spec_helper.rb
|
34
|
+
homepage: ''
|
35
|
+
licenses: []
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubygems_version: 3.1.4
|
53
|
+
signing_key:
|
54
|
+
specification_version: 4
|
55
|
+
summary: Control PostgreSQL server
|
56
|
+
test_files:
|
57
|
+
- spec/spec_helper.rb
|