pg_ctrl 0.0.8

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: 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