pgdexter 0.3.5 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c797cdeb10797636a6406b017fc9276ea6522656f6592769b5088bee56165cfb
4
- data.tar.gz: 76dc688fcea9ccde4aead259ef582f6103d62a5f40e7be668ee2b03347a14470
3
+ metadata.gz: c604783bd2ae16f3bb648176f96664b31fb6ac50a0094e3d34df195e0a4bb9ee
4
+ data.tar.gz: 299487f0880aa486c2678063f1f6bed4fc2398603b5fd9f2ebeb1c27b31cfb26
5
5
  SHA512:
6
- metadata.gz: a5ac6bf812b56648ac0b1f864baf025b7cd4e81cccf6d6de65f1780fd63f8f1e640aff53aca771cece0ce54267ad7a428aaba8f42773591380547fac05bfe94a
7
- data.tar.gz: 7c0f8b36467cc5eacbc96f6e5e2132de3526ea9827cab9c5ede7e1eff2b471f22948e0b202f1a00fd8b37b785934eec8508ad561947e50efa9b9ffb07e5eb9ae
6
+ metadata.gz: 3cbec0f51a8b884d468c92ebca35a47267b82c30c86b281052ae15cd25aa3499d9ad26b4c27fb1c8232a8ecce28bfbf656a44a099d5e28bea6ccc9523f01abe4
7
+ data.tar.gz: 8a72520c058109b0f63c41efe79bc91c174fffdca423940c8201a28e94bd4465d4110d9918ba39c505b0fc674ce6e819108d4837ff416f5befaaff9c2bdff4e9
data/CHANGELOG.md CHANGED
@@ -1,34 +1,55 @@
1
- ## 0.3.5
1
+ ## 0.3.10 (2021-03-25)
2
+
3
+ - Require pg_query < 2
4
+
5
+ ## 0.3.9 (2020-11-23)
6
+
7
+ - Added `--tablespace` option
8
+
9
+ ## 0.3.8 (2020-08-17)
10
+
11
+ - Colorize output
12
+ - Fixed error when unable to parse view definitions
13
+
14
+ ## 0.3.7 (2020-07-10)
15
+
16
+ - Fixed help output
17
+
18
+ ## 0.3.6 (2020-03-30)
19
+
20
+ - Fixed warning with Ruby 2.7
21
+
22
+ ## 0.3.5 (2018-04-30)
2
23
 
3
24
  - Added `sql` input format
4
25
  - Fixed error for queries with double dash comments
5
26
  - Fixed connection threading issue with `--pg-stat-activity` option
6
27
 
7
- ## 0.3.4
28
+ ## 0.3.4 (2018-04-09)
8
29
 
9
30
  - Fixed `--username` option
10
31
  - Fixed `JSON::NestingError`
11
32
  - Added `--pg-stat-activity` option
12
33
 
13
- ## 0.3.3
34
+ ## 0.3.3 (2018-02-22)
14
35
 
15
36
  - Added support for views and materialized views
16
37
  - Better handle case when multiple indexes are found for a query
17
38
  - Added `--min-cost-savings-pct` option
18
39
 
19
- ## 0.3.2
40
+ ## 0.3.2 (2018-01-04)
20
41
 
21
42
  - Fixed parsing issue with named prepared statements
22
43
  - Fixed parsing issue with multiline queries in csv format
23
44
  - Better explanations for indexing decisions
24
45
 
25
- ## 0.3.1
46
+ ## 0.3.1 (2017-12-28)
26
47
 
27
48
  - Added support for queries with bind variables
28
49
  - Fixed error with streaming logs as csv format
29
50
  - Handle malformed CSV gracefully
30
51
 
31
- ## 0.3.0
52
+ ## 0.3.0 (2017-12-22)
32
53
 
33
54
  - Added support for schemas
34
55
  - Added support for csv format
@@ -36,12 +57,12 @@
36
57
  - Added `--min-calls` option
37
58
  - Fixed debug output when indexes not found
38
59
 
39
- ## 0.2.1
60
+ ## 0.2.1 (2017-09-02)
40
61
 
41
62
  - Fixed bad suggestions
42
63
  - Improved debugging output
43
64
 
44
- ## 0.2.0
65
+ ## 0.2.0 (2017-08-27)
45
66
 
46
67
  - Added same connection options as `psql`
47
68
  - Added support for multiple files
@@ -52,38 +73,38 @@ Breaking
52
73
 
53
74
  - `-h` option changed to `--host` instead of `--help` for consistency with `psql`
54
75
 
55
- ## 0.1.6
76
+ ## 0.1.6 (2017-08-26)
56
77
 
57
78
  - Significant performance improvements
58
79
  - Added `--include` option
59
80
 
60
- ## 0.1.5
81
+ ## 0.1.5 (2017-08-14)
61
82
 
62
83
  - Added support for non-`SELECT` queries
63
84
  - Added `--pg-stat-statements` option
64
85
  - Added advisory locks
65
86
  - Added support for running as a non-superuser
66
87
 
67
- ## 0.1.4
88
+ ## 0.1.4 (2017-07-02)
68
89
 
69
90
  - Added support for multicolumn indexes
70
91
 
71
- ## 0.1.3
92
+ ## 0.1.3 (2017-06-30)
72
93
 
73
94
  - Fixed error with non-lowercase columns
74
95
  - Fixed error with `json` columns
75
96
 
76
- ## 0.1.2
97
+ ## 0.1.2 (2017-06-26)
77
98
 
78
99
  - Added `--exclude` option
79
100
  - Added `--log-sql` option
80
101
 
81
- ## 0.1.1
102
+ ## 0.1.1 (2017-06-25)
82
103
 
83
104
  - Added `--interval` option
84
105
  - Added `--min-time` option
85
106
  - Added `--log-level` option
86
107
 
87
- ## 0.1.0
108
+ ## 0.1.0 (2017-06-24)
88
109
 
89
110
  - Launched
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017 Andrew Kane
1
+ Copyright (c) 2017-2021 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  The automatic indexer for Postgres
4
4
 
5
- [Read about how it works](https://medium.com/@ankane/introducing-dexter-the-automatic-indexer-for-postgres-5f8fa8b28f27)
5
+ [Read about how it works](https://ankane.org/introducing-dexter)
6
6
 
7
- [![Build Status](https://travis-ci.org/ankane/dexter.svg?branch=master)](https://travis-ci.org/ankane/dexter)
7
+ [![Build Status](https://github.com/ankane/dexter/workflows/build/badge.svg?branch=master)](https://github.com/ankane/dexter/actions)
8
8
 
9
9
  ## Installation
10
10
 
@@ -12,8 +12,8 @@ First, install [HypoPG](https://github.com/HypoPG/hypopg) on your database serve
12
12
 
13
13
  ```sh
14
14
  cd /tmp
15
- curl -L https://github.com/HypoPG/hypopg/archive/1.1.1.tar.gz | tar xz
16
- cd hypopg-1.1.1
15
+ curl -L https://github.com/HypoPG/hypopg/archive/1.2.0.tar.gz | tar xz
16
+ cd hypopg-1.2.0
17
17
  make
18
18
  make install # may need sudo
19
19
  ```
@@ -146,10 +146,10 @@ dexter --interval 60 # seconds
146
146
 
147
147
  ## Examples
148
148
 
149
- Ubuntu with PostgreSQL 9.6
149
+ Ubuntu with PostgreSQL 12
150
150
 
151
151
  ```sh
152
- tail -F -n +1 /var/log/postgresql/postgresql-9.6-main.log | sudo -u postgres dexter dbname
152
+ tail -F -n +1 /var/log/postgresql/postgresql-12-main.log | sudo -u postgres dexter dbname
153
153
  ```
154
154
 
155
155
  Homebrew on Mac
@@ -228,18 +228,18 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
228
228
  - Write, clarify, or fix documentation
229
229
  - Suggest or add new features
230
230
 
231
- To get started, run:
231
+ To get started with development, run:
232
232
 
233
233
  ```sh
234
234
  git clone https://github.com/ankane/dexter.git
235
235
  cd dexter
236
- bundle
237
- rake install
236
+ bundle install
237
+ bundle exec rake install
238
238
  ```
239
239
 
240
240
  To run tests, use:
241
241
 
242
242
  ```sh
243
243
  createdb dexter_test
244
- rake test
244
+ bundle exec rake test
245
245
  ```
data/exe/dexter CHANGED
@@ -1,10 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # handle interrupts
4
+ trap("SIGINT") { abort }
5
+
3
6
  require "dexter"
4
- begin
5
- Dexter::Client.new(ARGV).perform
6
- rescue Dexter::Abort => e
7
- abort e.message
8
- rescue Interrupt => e
9
- # do nothing
10
- end
7
+ Dexter::Client.start
data/lib/dexter.rb CHANGED
@@ -1,10 +1,14 @@
1
- require "dexter/version"
2
- require "slop"
1
+ # dependencies
3
2
  require "pg"
4
3
  require "pg_query"
5
- require "time"
4
+ require "slop"
5
+
6
+ # stdlib
6
7
  require "set"
7
- require "thread"
8
+ require "time"
9
+
10
+ # modules
11
+ require "dexter/version"
8
12
  require "dexter/logging"
9
13
  require "dexter/client"
10
14
  require "dexter/collector"
data/lib/dexter/client.rb CHANGED
@@ -1,9 +1,16 @@
1
1
  module Dexter
2
2
  class Client
3
+ extend Logging
3
4
  include Logging
4
5
 
5
6
  attr_reader :arguments, :options
6
7
 
8
+ def self.start
9
+ Dexter::Client.new(ARGV).perform
10
+ rescue Dexter::Abort, PG::UndefinedFile => e
11
+ abort colorize(e.message.strip, :red)
12
+ end
13
+
7
14
  def initialize(args)
8
15
  @arguments, @options = parse_args(args)
9
16
  end
@@ -31,9 +38,9 @@ module Dexter
31
38
  def parse_args(args)
32
39
  opts = Slop.parse(args) do |o|
33
40
  o.banner = %(Usage:
34
- dexter [options]
35
-
36
- Options:)
41
+ dexter [options])
42
+ o.separator ""
43
+ o.separator "Options:"
37
44
  o.boolean "--analyze", "analyze tables that haven't been analyzed in the past hour", default: false
38
45
  o.boolean "--create", "create indexes", default: false
39
46
  o.array "--exclude", "prevent specific tables from being indexed"
@@ -49,9 +56,7 @@ Options:)
49
56
  o.boolean "--pg-stat-activity", "use pg_stat_activity", default: false, help: false
50
57
  o.boolean "--pg-stat-statements", "use pg_stat_statements", default: false, help: false
51
58
  o.string "-s", "--statement", "process a single statement"
52
- # separator must go here to show up correctly - slop bug?
53
- o.separator ""
54
- o.separator "Connection options:"
59
+ o.string "--tablespace", "tablespace to create indexes"
55
60
  o.on "-v", "--version", "print the version" do
56
61
  log Dexter::VERSION
57
62
  exit
@@ -60,10 +65,12 @@ Options:)
60
65
  log o
61
66
  exit
62
67
  end
63
- o.string "-U", "--username"
64
- o.string "-d", "--dbname"
65
- o.string "-h", "--host"
66
- o.integer "-p", "--port"
68
+ o.separator ""
69
+ o.separator "Connection options:"
70
+ o.string "-d", "--dbname", "database name"
71
+ o.string "-h", "--host", "database host"
72
+ o.integer "-p", "--port", "database port"
73
+ o.string "-U", "--username", "database user"
67
74
  end
68
75
 
69
76
  arguments = opts.arguments
@@ -73,11 +80,11 @@ Options:)
73
80
 
74
81
  # TODO don't use global var
75
82
  $log_level = options[:log_level].to_s.downcase
76
- abort "Unknown log level" unless ["error", "info", "debug", "debug2", "debug3"].include?($log_level)
83
+ raise Dexter::Abort, "Unknown log level" unless ["error", "info", "debug", "debug2", "debug3"].include?($log_level)
77
84
 
78
85
  [arguments, options]
79
86
  rescue Slop::Error => e
80
- abort e.message
87
+ raise Dexter::Abort, e.message
81
88
  end
82
89
  end
83
90
  end
@@ -16,7 +16,7 @@ module Dexter
16
16
  end
17
17
  end
18
18
  rescue CSV::MalformedCSVError => e
19
- abort "ERROR: #{e.message}"
19
+ raise Dexter::Abort, "ERROR: #{e.message}"
20
20
  end
21
21
  end
22
22
  end
@@ -4,6 +4,7 @@ module Dexter
4
4
 
5
5
  def initialize(options)
6
6
  @create = options[:create]
7
+ @tablespace = options[:tablespace]
7
8
  @log_level = options[:log_level]
8
9
  @exclude_tables = options[:exclude]
9
10
  @include_tables = Array(options[:include].split(",")) if options[:include]
@@ -107,13 +108,13 @@ module Dexter
107
108
  analyze_tables(tables) if tables.any? && (@analyze || @log_level == "debug2")
108
109
 
109
110
  # create hypothetical indexes and explain queries
110
- candidates = tables.any? ? create_hypothetical_indexes(queries.select(&:candidate_tables), tables) : {}
111
+ candidates = tables.any? ? create_hypothetical_indexes(queries.select(&:candidate_tables)) : {}
111
112
 
112
113
  # see if new indexes were used and meet bar
113
114
  new_indexes = determine_indexes(queries, candidates, tables)
114
115
 
115
116
  # display and create new indexes
116
- show_and_create_indexes(new_indexes, queries, tables)
117
+ show_and_create_indexes(new_indexes, queries)
117
118
  end
118
119
 
119
120
  private
@@ -123,9 +124,9 @@ module Dexter
123
124
  begin
124
125
  execute("CREATE EXTENSION IF NOT EXISTS hypopg")
125
126
  rescue PG::UndefinedFile
126
- abort "Install HypoPG first: https://github.com/ankane/dexter#installation"
127
+ raise Dexter::Abort, "Install HypoPG first: https://github.com/ankane/dexter#installation"
127
128
  rescue PG::InsufficientPrivilege
128
- abort "Use a superuser to run: CREATE EXTENSION hypopg"
129
+ raise Dexter::Abort, "Use a superuser to run: CREATE EXTENSION hypopg"
129
130
  end
130
131
  end
131
132
 
@@ -193,7 +194,7 @@ module Dexter
193
194
  end
194
195
  end
195
196
 
196
- def create_hypothetical_indexes(queries, tables)
197
+ def create_hypothetical_indexes(queries)
197
198
  candidates = {}
198
199
 
199
200
  # get initial costs for queries
@@ -417,11 +418,11 @@ module Dexter
417
418
  end
418
419
  end
419
420
 
420
- def show_and_create_indexes(new_indexes, queries, tables)
421
+ def show_and_create_indexes(new_indexes, queries)
421
422
  # print summary
422
423
  if new_indexes.any?
423
424
  new_indexes.each do |index|
424
- log "Index found: #{index[:table]} (#{index[:columns].join(", ")})"
425
+ log colorize("Index found: #{index[:table]} (#{index[:columns].join(", ")})", :green)
425
426
  end
426
427
  else
427
428
  log "No new indexes found"
@@ -479,7 +480,8 @@ module Dexter
479
480
  with_advisory_lock do
480
481
  new_indexes.each do |index|
481
482
  unless index_exists?(index)
482
- statement = "CREATE INDEX CONCURRENTLY ON #{quote_ident(index[:table])} (#{index[:columns].map { |c| quote_ident(c) }.join(", ")})"
483
+ statement = String.new("CREATE INDEX CONCURRENTLY ON #{quote_ident(index[:table])} (#{index[:columns].map { |c| quote_ident(c) }.join(", ")})")
484
+ statement << " TABLESPACE #{quote_ident(@tablespace)}" if @tablespace
483
485
  log "Creating index: #{statement}"
484
486
  started_at = Time.now
485
487
  begin
@@ -515,7 +517,7 @@ module Dexter
515
517
  PG::Connection.new(config)
516
518
  end
517
519
  rescue PG::ConnectionBad => e
518
- abort e.message
520
+ raise Dexter::Abort, e.message
519
521
  end
520
522
 
521
523
  def execute(query, pretty: true)
@@ -527,7 +529,7 @@ module Dexter
527
529
  # as an extra defense against SQL-injection attacks.
528
530
  # https://www.postgresql.org/docs/current/static/libpq-exec.html
529
531
  query = squish(query) if pretty
530
- log "SQL: #{query}" if @log_sql
532
+ log colorize("[sql] #{query}", :cyan) if @log_sql
531
533
 
532
534
  @mutex.synchronize do
533
535
  conn.exec_params(query, []).to_a
@@ -596,7 +598,13 @@ module Dexter
596
598
 
597
599
  view_tables = {}
598
600
  result.each do |row|
599
- view_tables[row["table_name"]] = PgQuery.parse(row["definition"]).tables
601
+ begin
602
+ view_tables[row["table_name"]] = PgQuery.parse(row["definition"]).tables
603
+ rescue PgQuery::ParseError
604
+ if @log_level.start_with?("debug")
605
+ log colorize("ERROR: Cannot parse view definition: #{row["table_name"]}", :red)
606
+ end
607
+ end
600
608
  end
601
609
 
602
610
  view_tables
@@ -1,11 +1,26 @@
1
1
  module Dexter
2
2
  module Logging
3
+ COLOR_CODES = {
4
+ red: 31,
5
+ green: 32,
6
+ yellow: 33,
7
+ cyan: 36
8
+ }
9
+
10
+ def output
11
+ $stdout
12
+ end
13
+
3
14
  def log(message = "")
4
- puts message unless $log_level == "error"
15
+ output.puts(message) unless $log_level == "error"
5
16
  end
6
17
 
7
- def abort(message)
8
- raise Dexter::Abort, message
18
+ def colorize(message, color)
19
+ if output.tty?
20
+ "\e[#{COLOR_CODES[color]}m#{message}\e[0m"
21
+ else
22
+ message
23
+ end
9
24
  end
10
25
  end
11
26
  end
@@ -37,7 +37,7 @@ module Dexter
37
37
  begin
38
38
  process_queries
39
39
  rescue PG::ServerError => e
40
- log "ERROR: #{e.class.name}: #{e.message}"
40
+ log colorize("ERROR: #{e.class.name}: #{e.message}", :red)
41
41
  end
42
42
  sleep(@interval)
43
43
  end
@@ -47,7 +47,7 @@ module Dexter
47
47
  begin
48
48
  @log_parser.perform
49
49
  rescue Errno::ENOENT => e
50
- abort "ERROR: #{e.message}"
50
+ raise Dexter::Abort, "ERROR: #{e.message}"
51
51
  end
52
52
 
53
53
  process_queries
@@ -3,7 +3,7 @@ module Dexter
3
3
  def perform
4
4
  # TODO support streaming
5
5
  @logfile.read.split(";").each do |statement|
6
- process_entry(statement, 1)
6
+ process_entry(statement, 0)
7
7
  end
8
8
  end
9
9
  end
@@ -1,3 +1,3 @@
1
1
  module Dexter
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.10"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgdexter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-30 00:00:00.000000000 Z
11
+ date: 2021-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slop
@@ -16,102 +16,53 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: 4.8.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.0
26
+ version: 4.8.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pg
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.18.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.18.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pg_query
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "<"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
52
+ - - "<"
74
53
  - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: minitest
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- description:
98
- email:
99
- - andrew@chartkick.com
54
+ version: '2'
55
+ description:
56
+ email: andrew@ankane.org
100
57
  executables:
101
58
  - dexter
102
59
  extensions: []
103
60
  extra_rdoc_files: []
104
61
  files:
105
- - ".gitignore"
106
- - ".travis.yml"
107
62
  - CHANGELOG.md
108
- - Gemfile
109
63
  - LICENSE.txt
110
64
  - README.md
111
- - Rakefile
112
65
  - exe/dexter
113
- - guides/Hosted-Postgres.md
114
- - guides/Linux.md
115
66
  - lib/dexter.rb
116
67
  - lib/dexter/client.rb
117
68
  - lib/dexter/collector.rb
@@ -124,11 +75,11 @@ files:
124
75
  - lib/dexter/query.rb
125
76
  - lib/dexter/sql_log_parser.rb
126
77
  - lib/dexter/version.rb
127
- - pgdexter.gemspec
128
78
  homepage: https://github.com/ankane/dexter
129
- licenses: []
79
+ licenses:
80
+ - MIT
130
81
  metadata: {}
131
- post_install_message:
82
+ post_install_message:
132
83
  rdoc_options: []
133
84
  require_paths:
134
85
  - lib
@@ -136,16 +87,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
87
  requirements:
137
88
  - - ">="
138
89
  - !ruby/object:Gem::Version
139
- version: '0'
90
+ version: '2.2'
140
91
  required_rubygems_version: !ruby/object:Gem::Requirement
141
92
  requirements:
142
93
  - - ">="
143
94
  - !ruby/object:Gem::Version
144
95
  version: '0'
145
96
  requirements: []
146
- rubyforge_project:
147
- rubygems_version: 2.7.6
148
- signing_key:
97
+ rubygems_version: 3.2.3
98
+ signing_key:
149
99
  specification_version: 4
150
100
  summary: The automatic indexer for Postgres
151
101
  test_files: []
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
data/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- language: ruby
2
- rvm: 2.4.1
3
- cache: bundler
4
- script: bundle exec rake test
5
- addons:
6
- postgresql: "9.6"
7
- before_script:
8
- - sudo apt-get install postgresql-server-dev-9.6
9
- - git clone https://github.com/HypoPG/hypopg.git
10
- - cd hypopg
11
- - git checkout 1.1.1
12
- - make
13
- - sudo make install
14
- - psql -c 'create database dexter_test;' -U postgres
15
- notifications:
16
- email:
17
- on_success: never
18
- on_failure: change
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in dexter.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,11 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- t.warning = false
9
- end
10
-
11
- task default: :test
@@ -1,102 +0,0 @@
1
- # Hosted Postgres
2
-
3
- Some hosted providers like Amazon RDS and Heroku do not support the HypoPG extension, which Dexter needs to run. Hopefully this will change with time. For now, we can spin up a separate database instance to run Dexter. It’s not super convenient, but can be useful to do from time to time.
4
-
5
- ### Install Postgres and Ruby
6
-
7
- Linux
8
-
9
- ```sh
10
- sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
11
- sudo apt-get install -y wget ca-certificates
12
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
13
- sudo apt-get update
14
- sudo apt-get install -y postgresql-9.6 postgresql-server-dev-9.6
15
- sudo -u postgres createuser $(whoami) -s
16
- sudo apt-get install -y ruby2.2 ruby2.2-dev
17
- ```
18
-
19
- Mac
20
-
21
- ```sh
22
- brew install postgresql
23
- brew install ruby
24
- ```
25
-
26
- ### Install HypoPG and Dexter
27
-
28
- HypoPG
29
-
30
- ```sh
31
- cd /tmp
32
- curl -L https://github.com/dalibo/hypopg/archive/1.0.0.tar.gz | tar xz
33
- cd hypopg-1.0.0
34
- make
35
- make install # may need sudo
36
- ```
37
-
38
- Dexter
39
-
40
- ```sh
41
- gem install pgdexter # may need sudo
42
- ```
43
-
44
- ### Download logs
45
-
46
- #### Amazon RDS
47
-
48
- Create an IAM user with the policy below:
49
-
50
- ```
51
- {
52
- "Statement": [
53
- {
54
- "Action": [
55
- "rds:DescribeDBLogFiles",
56
- "rds:DownloadDBLogFilePortion"
57
- ],
58
- "Effect": "Allow",
59
- "Resource": "*"
60
- }
61
- ]
62
- }
63
- ```
64
-
65
- And run:
66
-
67
- ```sh
68
- aws configure
69
- gem install pghero_logs # may need sudo
70
- pghero_logs download <instance-id>
71
- ```
72
-
73
- #### Heroku
74
-
75
- Production-tier databases only
76
-
77
- ```sh
78
- heroku logs -p postgres > postgresql.log
79
- ```
80
-
81
- ### Dump and restore
82
-
83
- We recommend creating a new instance from a snapshot for the dump to avoid affecting customers.
84
-
85
- ```sh
86
- pg_dump -v -j 8 -Fd -f /tmp/newout.dir <connection-options>
87
- ```
88
-
89
- Then shutdown the dump instance. Restore with:
90
-
91
- ```sh
92
- createdb dexter_restore
93
- pg_restore -v -j 8 -x -O --format=d -d dexter_restore /tmp/newout.dir/
94
- ```
95
-
96
- ### Run Dexter
97
-
98
- ```sh
99
- dexter dexter_restore postgresql.log* --analyze
100
- ```
101
-
102
- :tada:
data/guides/Linux.md DELETED
@@ -1,72 +0,0 @@
1
- # Linux Packages
2
-
3
- Distributions
4
-
5
- - [Ubuntu 16.04 (Xenial)](#ubuntu-1604-xenial)
6
- - [Ubuntu 14.04 (Trusty)](#ubuntu-1404-trusty)
7
- - [Debian 9 (Stretch)](#debian-9-stretch)
8
- - [Debian 8 (Jesse)](#debian-8-jesse)
9
- - [CentOS / RHEL 7](#centos--rhel-7)
10
- - [SUSE Linux Enterprise Server 12](#suse-linux-enterprise-server-12)
11
-
12
- ### Ubuntu 16.04 (Xenial)
13
-
14
- ```sh
15
- wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
16
- sudo wget -O /etc/apt/sources.list.d/dexter.list \
17
- https://dl.packager.io/srv/pghero/dexter/master/installer/ubuntu/16.04.repo
18
- sudo apt-get update
19
- sudo apt-get -y install dexter
20
- ```
21
-
22
- ### Ubuntu 14.04 (Trusty)
23
-
24
- ```sh
25
- wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
26
- sudo wget -O /etc/apt/sources.list.d/dexter.list \
27
- https://dl.packager.io/srv/pghero/dexter/master/installer/ubuntu/14.04.repo
28
- sudo apt-get update
29
- sudo apt-get install dexter
30
- ```
31
-
32
- ### Debian 9 (Stretch)
33
-
34
- ```sh
35
- sudo apt-get -y install apt-transport-https
36
- wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
37
- sudo wget -O /etc/apt/sources.list.d/dexter.list \
38
- https://dl.packager.io/srv/pghero/dexter/master/installer/debian/9.repo
39
- sudo apt-get update
40
- sudo apt-get install dexter
41
- ```
42
-
43
- ### Debian 8 (Jesse)
44
-
45
- ```sh
46
- sudo apt-get -y install apt-transport-https
47
- wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
48
- sudo wget -O /etc/apt/sources.list.d/dexter.list \
49
- https://dl.packager.io/srv/pghero/dexter/master/installer/debian/8.repo
50
- sudo apt-get update
51
- sudo apt-get install dexter
52
- ```
53
-
54
- ### CentOS / RHEL 7
55
-
56
- ```sh
57
- sudo wget -O /etc/yum.repos.d/dexter.repo \
58
- https://dl.packager.io/srv/pghero/dexter/master/installer/el/7.repo
59
- sudo yum install dexter
60
- ```
61
-
62
- ### SUSE Linux Enterprise Server 12
63
-
64
- ```sh
65
- sudo wget -O /etc/zypp/repos.d/dexter.repo \
66
- https://dl.packager.io/srv/pghero/dexter/master/installer/sles/12.repo
67
- sudo zypper install dexter
68
- ```
69
-
70
- ## Credits
71
-
72
- :heart: Made possible by [Packager](https://packager.io/)
data/pgdexter.gemspec DELETED
@@ -1,30 +0,0 @@
1
- # coding: utf-8
2
-
3
- lib = File.expand_path("../lib", __FILE__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require "dexter/version"
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = "pgdexter"
9
- spec.version = Dexter::VERSION
10
- spec.authors = ["Andrew Kane"]
11
- spec.email = ["andrew@chartkick.com"]
12
-
13
- spec.summary = "The automatic indexer for Postgres"
14
- spec.homepage = "https://github.com/ankane/dexter"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.match(%r{^(test|spec|features)/})
18
- end
19
- spec.bindir = "exe"
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
-
23
- spec.add_dependency "slop", ">= 4.2.0"
24
- spec.add_dependency "pg"
25
- spec.add_dependency "pg_query"
26
-
27
- spec.add_development_dependency "bundler"
28
- spec.add_development_dependency "rake"
29
- spec.add_development_dependency "minitest"
30
- end