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 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
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .*.swp
6
+ t
7
+ tt
8
+ ttt
9
+ t.*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby_version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.7.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in pg_ctrl.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+
2
+ + encoding, lc_collate, and lc_ctype from psql
3
+
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
+
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module PgCtrl
2
+ VERSION = "0.0.8"
3
+ end
data/lib/pg_ctrl.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'pg'
2
+
3
+ require "pg_ctrl/version"
4
+
5
+ require "pg_ctrl/db.rb"
6
+ require "pg_ctrl/load.rb"
7
+
8
+ module PgCtrl
9
+ # Your code goes here...
10
+ end
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
@@ -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