Class: Pliny::DbSupport

Inherits:
Object
  • Object
show all
Defined in:
lib/pliny/db_support.rb

Defined Under Namespace

Classes: MigrationStatus, MigrationStatusPresenter

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, sequel_logger) ⇒ DbSupport

Returns a new instance of DbSupport.



33
34
35
36
37
38
# File 'lib/pliny/db_support.rb', line 33

def initialize(url, sequel_logger)
  @db = Sequel.connect(url)
  if sequel_logger
    @db.loggers << sequel_logger
  end
end

Instance Attribute Details

#dbObject

Returns the value of attribute db.



31
32
33
# File 'lib/pliny/db_support.rb', line 31

def db
  @db
end

Class Method Details

.admin_url(database_url) ⇒ Object



8
9
10
11
12
# File 'lib/pliny/db_support.rb', line 8

def self.admin_url(database_url)
  uri = URI.parse(database_url)
  uri.path = "/postgres"
  uri.to_s
end

.run(url, sequel_log_io = StringIO.new) {|instance| ... } ⇒ Object

Yields:

  • (instance)


23
24
25
26
27
28
29
# File 'lib/pliny/db_support.rb', line 23

def self.run(url, sequel_log_io=StringIO.new)
  logger = Logger.new(sequel_log_io)
  instance = new(url, logger)
  yield instance
  instance.disconnect
  Sequel::DATABASES.delete(instance)
end

.setup?(database_url) ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
17
18
19
20
21
# File 'lib/pliny/db_support.rb', line 14

def self.setup?(database_url)
  @db = Sequel.connect(database_url)
  @db.test_connection
  @db.disconnect
  return true
rescue Sequel::DatabaseConnectionError
  return false
end

Instance Method Details

#create(name) ⇒ Object



45
46
47
# File 'lib/pliny/db_support.rb', line 45

def create(name)
  db.run(%{CREATE DATABASE "#{name}"})
end

#disconnectObject



207
208
209
# File 'lib/pliny/db_support.rb', line 207

def disconnect
  @db.disconnect
end

#exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
# File 'lib/pliny/db_support.rb', line 40

def exists?(name)
  res = db.fetch("SELECT 1 FROM pg_database WHERE datname = ?", name)
  return res.count > 0
end

#get_migrations_from_databaseObject



187
188
189
190
191
# File 'lib/pliny/db_support.rb', line 187

def get_migrations_from_database
  return [] unless db.table_exists?(:schema_migrations)

  db[:schema_migrations].order(Sequel.asc(:filename)).select_map(:filename)
end

#migrate(target = nil) ⇒ Object



49
50
51
# File 'lib/pliny/db_support.rb', line 49

def migrate(target = nil)
  Sequel::Migrator.apply(db, MIGRATION_DIR, target)
end

#rollbackObject



193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/pliny/db_support.rb', line 193

def rollback
  current_version = version
  return if current_version.zero?

  migrations = Dir["#{MIGRATION_DIR}/*.rb"].map { |f| File.basename(f).to_i }.sort

  target = 0 # by default, rollback everything
  index = migrations.index(current_version)
  if index > 0
    target = migrations[index - 1]
  end
  Sequel::Migrator.apply(db, MIGRATION_DIR, target)
end

#statusObject



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/pliny/db_support.rb', line 167

def status
  migrations_in_database = get_migrations_from_database
  migrations_on_disk = Dir["#{MIGRATION_DIR}/*.rb"].map { |f| File.basename(f) }
  total_set_of_migrations = (migrations_in_database | migrations_on_disk).sort_by(&:to_i)

  migration_statuses = total_set_of_migrations.map { |filename|
    status = MigrationStatus.new(filename: filename)
    if migrations_on_disk.include?(filename)
      status.present_on_disk = true
    end

    if migrations_in_database.include?(filename)
      status.present_in_database = true
    end
    status
  }

  MigrationStatusPresenter.new(migration_statuses: migration_statuses).to_s
end

#versionObject



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/pliny/db_support.rb', line 53

def version
  return 0 unless db.table_exists?(:schema_migrations)

  current = db[:schema_migrations].order(Sequel.desc(:filename)).first

  return 0 unless current

  version = current[:filename].match(Sequel::Migrator::MIGRATION_FILE_PATTERN).captures.first
  version ||= 0
  Integer(version)
end