timescaledb 0.2.8 → 0.2.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 240bc1a55d3955c734d79946868b5e878cacfa354f7b0a843b72f78c26a85c83
4
- data.tar.gz: 23ccc7e91c0da1ea522e5c8a71cd4522478aa1c73ff0e9ee6f61e42b26f9955c
3
+ metadata.gz: 89553264709636b53e3d56174f3e244561c10f2c4801b922ba25adb8bf32aca7
4
+ data.tar.gz: f254f76133d13d6854f8f7dee865a0f3bb4adc57617c200ee276d1408541475a
5
5
  SHA512:
6
- metadata.gz: 3ae2cda69cc099ad24a47aa4125ee10db96eb8186e261125f1e56ad6f4f2d805888d02d9eee92d48d18eab49d628918fef4e33234edc48ddb4ecb402d4518207
7
- data.tar.gz: 65ee70a4b17944880979e71d1abee756a5f398f48cb048b575afbe4a0412f91d993ec97723c2b10d472ceafd405d7d013480824702c2a5db11e23f6eacb7f69a
6
+ metadata.gz: b30bbba9b0da08b3cad42fbc80e73c7aed2e37763d01cfd2b93d569e4bd65768a507fc6e25a757c7b83bd4f9ad3e7e18d98090b7a2f2e8bebcb5d16fb3a63d7c
7
+ data.tar.gz: bb0ba7379e86631d71256cf66cc506eb42511145f17e343e749bc10e28b7c394a482e9d4a3380ff9ee2af511be51d44529556566fe08421aa92b924755d492c8
@@ -1,6 +1,11 @@
1
1
  require 'singleton'
2
2
 
3
3
  module Timescaledb
4
+ # Minimal connection setup for Timescaledb directly with the PG.
5
+ # The concept is use a singleton component that can query
6
+ # independently of the ActiveRecord::Base connections.
7
+ # This is useful for the extension and hypertable metadata.
8
+ # It can also #use_connection from active record if needed.
4
9
  class Connection
5
10
  include Singleton
6
11
 
@@ -34,10 +39,16 @@ module Timescaledb
34
39
  !@config.nil?
35
40
  end
36
41
 
42
+ # Override the connection with a raw PG connection.
43
+ # @param [PG::Connection] connection The raw PG connection.
44
+ def use_connection connection
45
+ @connection = connection
46
+ end
47
+
37
48
  private
38
49
 
39
50
  def connection
40
51
  @connection ||= PG.connect(@config)
41
52
  end
42
53
  end
43
- end
54
+ end
@@ -1,16 +1,21 @@
1
1
  module Timescaledb
2
2
  class ConnectionNotEstablishedError < StandardError; end
3
3
 
4
- # @param [String] config The postgres connection string.
4
+ module_function
5
+
6
+ # @param [String] config with the postgres connection string.
5
7
  def establish_connection(config)
6
8
  Connection.instance.config = config
7
9
  end
8
- module_function :establish_connection
10
+
11
+ # @param [PG::Connection] to use it directly from a raw connection
12
+ def use_connection conn
13
+ Connection.instance.use_connection conn
14
+ end
9
15
 
10
16
  def connection
11
17
  raise ConnectionNotEstablishedError.new unless Connection.instance.connected?
12
18
 
13
19
  Connection.instance
14
20
  end
15
- module_function :connection
16
- end
21
+ end
@@ -0,0 +1,23 @@
1
+ module Timescaledb
2
+
3
+ # Provides metadata around the extension in the database
4
+ module Extension
5
+ module_function
6
+ # @return String version of the timescaledb extension
7
+ def version
8
+ @version ||= Timescaledb.connection.query_first(<<~SQL)&.version
9
+ SELECT extversion as version
10
+ FROM pg_extension
11
+ WHERE extname = 'timescaledb'
12
+ SQL
13
+ end
14
+
15
+ def installed?
16
+ version.present?
17
+ end
18
+
19
+ def update!
20
+ Timescaledb.connection.execute('ALTER EXTENSION timescaledb UPDATE')
21
+ end
22
+ end
23
+ end
@@ -25,7 +25,6 @@ module Timescaledb
25
25
 
26
26
  # @override Scenic::Adapters::Postgres#create_view
27
27
  # to add the `with: ` keyword that can be used for such option.
28
- #
29
28
  def create_view(name, version: nil, with: nil, sql_definition: nil, materialized: false, no_data: false)
30
29
  if version.present? && sql_definition.present?
31
30
  raise(
@@ -69,4 +68,4 @@ end
69
68
 
70
69
 
71
70
  Scenic::Adapters::Postgres.include(Timescaledb::Scenic::Extension)
72
- ActiveRecord::ConnectionAdapters::AbstractAdapter.include(Timescaledb::Scenic::MigrationHelpers)
71
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(Timescaledb::Scenic::MigrationHelpers)
@@ -7,14 +7,29 @@ module Timescaledb
7
7
  # * retention policies
8
8
  # * continuous aggregates
9
9
  # * compression settings
10
+ # It also ignores Timescale related schemas when dumping the schema.
11
+ # It also ignores dumping options as extension is not installed or no hypertables are available.
10
12
  module SchemaDumper
11
13
  def tables(stream)
12
14
  super # This will call #table for each table in the database
13
- return unless Timescaledb::Hypertable.table_exists?
14
15
 
15
- timescale_hypertables(stream)
16
- timescale_retention_policies(stream)
17
- timescale_continuous_aggregates(stream) # Define these before any Scenic views that might use them
16
+ if exports_timescaledb_metadata?
17
+ timescale_hypertables(stream)
18
+ timescale_retention_policies(stream)
19
+ timescale_continuous_aggregates(stream) # Define these before any Scenic views that might use them
20
+ end
21
+ end
22
+
23
+ # Ignore dumps in case DB is not eligible for TimescaleDB metadata.
24
+ # @return [Boolean] true if the extension is installed and hypertables are available, otherwise false.
25
+ private def exports_timescaledb_metadata?
26
+ # Note it's safe to use the raw connection here because we're only reading from the database
27
+ # and not modifying it. We're also on the same connection pool as ActiveRecord::Base.
28
+ # The dump process also runs standalone, so we don't need to worry about the connection being
29
+ # used elsewhere.
30
+ Timescaledb.use_connection @connection.raw_connection
31
+
32
+ Timescaledb.extension.installed? && Timescaledb.hypertables.any?
18
33
  end
19
34
 
20
35
  # Ignores Timescale related schemas when dumping the schema
@@ -1,3 +1,3 @@
1
1
  module Timescaledb
2
- VERSION = '0.2.8'
2
+ VERSION = '0.2.9'
3
3
  end
data/lib/timescaledb.rb CHANGED
@@ -17,11 +17,20 @@ require_relative 'timescaledb/schema_dumper'
17
17
  require_relative 'timescaledb/stats'
18
18
  require_relative 'timescaledb/stats_report'
19
19
  require_relative 'timescaledb/migration_helpers'
20
+ require_relative 'timescaledb/extension'
20
21
  require_relative 'timescaledb/version'
21
22
 
22
23
  module Timescaledb
23
24
  module_function
24
25
 
26
+ def connection
27
+ Connection.instance
28
+ end
29
+
30
+ def extension
31
+ Extension
32
+ end
33
+
25
34
  def chunks
26
35
  Chunk.all
27
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timescaledb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jônatas Davi Paganini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-30 00:00:00.000000000 Z
11
+ date: 2024-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -163,6 +163,7 @@ files:
163
163
  - lib/timescaledb/database/schema_statements.rb
164
164
  - lib/timescaledb/database/types.rb
165
165
  - lib/timescaledb/dimensions.rb
166
+ - lib/timescaledb/extension.rb
166
167
  - lib/timescaledb/hypertable.rb
167
168
  - lib/timescaledb/job.rb
168
169
  - lib/timescaledb/job_stats.rb