activerecord-redshift-adapter 0.9.0 → 0.9.1
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.
data/{README → README.md}
RENAMED
@@ -1,5 +1,4 @@
|
|
1
|
-
activerecord-redshift-adapter
|
2
|
-
=============================
|
1
|
+
# activerecord-redshift-adapter
|
3
2
|
|
4
3
|
adapter for aws redshift for rails 3
|
5
4
|
|
@@ -9,9 +8,8 @@ barely tested (I'm working on a project that needs this -- this works as much as
|
|
9
8
|
|
10
9
|
good luck
|
11
10
|
|
12
|
-
example database.yml
|
13
|
-
|
14
|
-
|
11
|
+
## example database.yml
|
12
|
+
```yml
|
15
13
|
common: &common
|
16
14
|
adapter: postgresql
|
17
15
|
username: postgres
|
@@ -32,3 +30,20 @@ redshift_development:
|
|
32
30
|
<<: *common
|
33
31
|
<<: *redshiftdb
|
34
32
|
database: databasename
|
33
|
+
```
|
34
|
+
|
35
|
+
## options
|
36
|
+
<table>
|
37
|
+
<tr>
|
38
|
+
<th>option</th>
|
39
|
+
<th>description</th>
|
40
|
+
</tr>
|
41
|
+
<tr>
|
42
|
+
<th>schema_search_path</th>
|
43
|
+
<td>set schema_search_path. use default value if not given.</td>
|
44
|
+
</tr>
|
45
|
+
<tr>
|
46
|
+
<th>read_timezone</th>
|
47
|
+
<td>force timezone for datetime when select values. ActiveRecord default timezone will set if not given.</td>
|
48
|
+
</tr>
|
49
|
+
</table>
|
@@ -32,8 +32,10 @@ module ActiveRecord
|
|
32
32
|
module ConnectionAdapters
|
33
33
|
# Redshift-specific extensions to column definitions in a table.
|
34
34
|
class RedshiftColumn < Column #:nodoc:
|
35
|
+
attr_accessor :timezone
|
35
36
|
# Instantiates a new Redshift column definition in a table.
|
36
|
-
def initialize(name, default, sql_type = nil, null = true)
|
37
|
+
def initialize(name, default, sql_type = nil, null = true, timezone = nil)
|
38
|
+
self.timezone = timezone
|
37
39
|
super(name, self.class.extract_value_from_default(default), sql_type, null)
|
38
40
|
end
|
39
41
|
|
@@ -41,6 +43,25 @@ module ActiveRecord
|
|
41
43
|
name == other.name && default == other.default && sql_type == other.sql_type && null == other.null
|
42
44
|
end
|
43
45
|
|
46
|
+
def type_cast(value)
|
47
|
+
return nil if value.nil?
|
48
|
+
return coder.load(value) if encoded?
|
49
|
+
|
50
|
+
if timezone && [:datetime, :timestamp].include?(type)
|
51
|
+
self.class.string_to_time_with_timezone(string, timezone)
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def type_cast_code(var_name)
|
58
|
+
if timezone && [:datetime, :timestamp].include?(type)
|
59
|
+
"#{self.class.name}.string_to_time_with_timezone(#{var_name},'#{timezone}')"
|
60
|
+
else
|
61
|
+
super
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
44
65
|
# :stopdoc:
|
45
66
|
class << self
|
46
67
|
attr_accessor :money_precision
|
@@ -54,6 +75,14 @@ module ActiveRecord
|
|
54
75
|
super
|
55
76
|
end
|
56
77
|
end
|
78
|
+
|
79
|
+
def string_to_time_with_timezone(string, timezone)
|
80
|
+
if string =~ self::Format::ISO_DATETIME
|
81
|
+
Time.parse("#{string} #{timezone}")
|
82
|
+
else
|
83
|
+
string_to_time(string)
|
84
|
+
end
|
85
|
+
end
|
57
86
|
end
|
58
87
|
# :startdoc:
|
59
88
|
|
@@ -815,7 +844,7 @@ module ActiveRecord
|
|
815
844
|
def columns(table_name, name = nil)
|
816
845
|
# Limit, precision, and scale are all handled by the superclass.
|
817
846
|
column_definitions(table_name).collect do |column_name, type, default, notnull|
|
818
|
-
RedshiftColumn.new(column_name, default, type, notnull == 'f')
|
847
|
+
RedshiftColumn.new(column_name, default, type, notnull == 'f', @config[:read_timezone])
|
819
848
|
end
|
820
849
|
end
|
821
850
|
|
@@ -1,8 +1,37 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe ActiveRecord::Base do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
let(:connection) { ActiveRecord::Base.redshift_connection(TEST_CONNECTION_HASH) }
|
5
|
+
|
6
|
+
describe '.redshift_connection' do
|
7
|
+
it "opens a connection" do
|
8
|
+
expect(connection).to be_active
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'set UTC timezone for datetime' do
|
13
|
+
class TimezoneTest < ActiveRecord::Base
|
14
|
+
default_timezone = :jst
|
15
|
+
establish_connection(TEST_CONNECTION_HASH.merge('adapter' => 'redshift', 'read_timezone' => 'UTC'))
|
16
|
+
end
|
17
|
+
|
18
|
+
before do
|
19
|
+
connection.query <<-SQL
|
20
|
+
CREATE TABLE public.timezone_tests ( "id" INTEGER NULL, "created_at" TIMESTAMP NULL );
|
21
|
+
INSERT INTO public.timezone_tests VALUES (1, '2013-07-01 12:00:00');
|
22
|
+
SQL
|
23
|
+
end
|
24
|
+
|
25
|
+
after do
|
26
|
+
connection.query <<-SQL
|
27
|
+
DROP TABLE public.timezone_tests;
|
28
|
+
SQL
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns timestamp as UTC' do
|
32
|
+
data = TimezoneTest.all.first
|
33
|
+
expect(data.created_at.zone).to eq 'UTC'
|
34
|
+
expect(data.created_at).to eq Time.parse '2013-07-01 12:00:00 UTC'
|
35
|
+
end
|
7
36
|
end
|
8
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-redshift-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -68,7 +68,7 @@ files:
|
|
68
68
|
- .gitignore
|
69
69
|
- Gemfile
|
70
70
|
- LICENSE
|
71
|
-
- README
|
71
|
+
- README.md
|
72
72
|
- Rakefile
|
73
73
|
- activerecord-redshift-adapter.gemspec
|
74
74
|
- lib/active_record/connection_adapters/redshift_adapter.rb
|