imparcial 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +2 -5
- data/Manifest.txt +79 -5
- data/README.txt +71 -7
- data/Rakefile +1 -1
- data/lib/imparcial/driver/abstract/expression/column.rb +313 -0
- data/lib/imparcial/driver/abstract/expression/constraint.rb +149 -0
- data/lib/imparcial/driver/abstract/expression/delete.rb +88 -0
- data/lib/imparcial/driver/abstract/expression/index.rb +206 -0
- data/lib/imparcial/driver/abstract/expression/insert.rb +49 -0
- data/lib/imparcial/driver/abstract/expression/lock.rb +11 -0
- data/lib/imparcial/driver/abstract/expression/record.rb +41 -0
- data/lib/imparcial/driver/abstract/expression/select.rb +38 -0
- data/lib/imparcial/driver/abstract/expression/sequence.rb +260 -0
- data/lib/imparcial/driver/abstract/expression/statement.rb +128 -0
- data/lib/imparcial/driver/abstract/expression/table.rb +416 -0
- data/lib/imparcial/driver/abstract/expression/transaction.rb +143 -0
- data/lib/imparcial/driver/abstract/expression/update.rb +50 -0
- data/lib/imparcial/driver/abstract/expression.rb +23 -0
- data/lib/imparcial/driver/abstract/result.rb +95 -0
- data/lib/imparcial/driver/abstract/sql/column.rb +103 -0
- data/lib/imparcial/driver/abstract/sql/constraint.rb +42 -0
- data/lib/imparcial/driver/abstract/sql/delete.rb +22 -0
- data/lib/imparcial/driver/abstract/sql/index.rb +45 -0
- data/lib/imparcial/driver/abstract/sql/insert.rb +63 -0
- data/lib/imparcial/driver/abstract/sql/record.rb +19 -0
- data/lib/imparcial/driver/abstract/sql/select.rb +101 -0
- data/lib/imparcial/driver/abstract/sql/sequence.rb +55 -0
- data/lib/imparcial/driver/abstract/sql/table.rb +42 -0
- data/lib/imparcial/driver/abstract/sql/transaction.rb +43 -0
- data/lib/imparcial/driver/abstract/sql/update.rb +29 -0
- data/lib/imparcial/driver/abstract/sql.rb +21 -0
- data/lib/imparcial/driver/abstract/typemap.rb +168 -0
- data/lib/imparcial/driver/abstract/util.rb +53 -0
- data/lib/imparcial/driver/abstract.rb +255 -0
- data/lib/imparcial/driver/mysql/expression/table.rb +17 -0
- data/lib/imparcial/driver/mysql/expression.rb +11 -0
- data/lib/imparcial/driver/mysql/result.rb +33 -0
- data/lib/imparcial/driver/mysql/sql/column.rb +59 -0
- data/lib/imparcial/driver/mysql/sql/constraint.rb +39 -0
- data/lib/imparcial/driver/mysql/sql/index.rb +42 -0
- data/lib/imparcial/driver/mysql/sql/sequence.rb +39 -0
- data/lib/imparcial/driver/mysql/sql/table.rb +67 -0
- data/lib/imparcial/driver/mysql/sql.rb +15 -0
- data/lib/imparcial/driver/mysql/typemap.rb +13 -0
- data/lib/imparcial/driver/mysql/util.rb +13 -0
- data/lib/imparcial/driver/mysql.rb +49 -0
- data/lib/imparcial/driver/postgre/expression.rb +32 -0
- data/lib/imparcial/driver/postgre/result.rb +35 -0
- data/lib/imparcial/driver/postgre/sql/column.rb +53 -0
- data/lib/imparcial/driver/postgre/sql/constraint.rb +37 -0
- data/lib/imparcial/driver/postgre/sql/index.rb +53 -0
- data/lib/imparcial/driver/postgre/sql/sequence.rb +30 -0
- data/lib/imparcial/driver/postgre/sql/table.rb +46 -0
- data/lib/imparcial/driver/postgre/sql.rb +15 -0
- data/lib/imparcial/driver/postgre/typemap.rb +36 -0
- data/lib/imparcial/driver/postgre/util.rb +19 -0
- data/lib/imparcial/driver/postgre.rb +43 -0
- data/lib/imparcial/driver.rb +1 -0
- data/lib/imparcial/exception.rb +71 -0
- data/lib/imparcial/extension.rb +90 -0
- data/lib/imparcial/initializer.rb +30 -0
- data/lib/imparcial.rb +1 -1
- data/test/unit/base/common/tc_quote.rb +30 -0
- data/test/unit/base/expression/tc_column.rb +84 -0
- data/test/unit/base/expression/tc_constraint.rb +39 -0
- data/test/unit/base/expression/tc_delete.rb +51 -0
- data/test/unit/base/expression/tc_index.rb +43 -0
- data/test/unit/base/expression/tc_insert.rb +44 -0
- data/test/unit/base/expression/tc_select.rb +142 -0
- data/test/unit/base/expression/tc_sequence.rb +48 -0
- data/test/unit/base/expression/tc_table.rb +68 -0
- data/test/unit/base/expression/tc_table_diff.rb +41 -0
- data/test/unit/base/expression/tc_transaction.rb +46 -0
- data/test/unit/base/expression/tc_update.rb +29 -0
- data/test/unit/base/statement/tc_conditions.rb +84 -0
- data/test/unit/base/statement/tc_limit.rb +25 -0
- data/test/unit/base/statement/tc_order.rb +25 -0
- data/test/unit/helper.rb +64 -0
- data/test/unit/mysql/tc_sequence.rb +41 -0
- metadata +102 -10
@@ -0,0 +1,42 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module MysqlSQL
|
4
|
+
module Index
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_dropping_index ( options )
|
9
|
+
|
10
|
+
%{DROP INDEX #{options[:index_name]} ON
|
11
|
+
#{quote(options[:table_name])}
|
12
|
+
}
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate SQL statement for verifying if a given index exists.
|
17
|
+
|
18
|
+
def sql_for_index_exists? ( options )
|
19
|
+
|
20
|
+
%{SELECT 1 FROM INFORMATION_SCHEMA.statistics
|
21
|
+
WHERE table_schema != "mysql" AND
|
22
|
+
table_name = #{quote_value(options[:table_name])} AND
|
23
|
+
INDEX_NAME = #{quote_value(options[:index_name])}
|
24
|
+
}
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def sql_for_getting_indexes ( options )
|
29
|
+
|
30
|
+
%{SELECT table_name AS 'table', column_name AS 'column',\
|
31
|
+
index_name AS 'index' FROM INFORMATION_SCHEMA.statistics\
|
32
|
+
WHERE table_schema != 'mysql'
|
33
|
+
AND table_name = #{quote_value(options[:table_name])}
|
34
|
+
}
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module MysqlSQL
|
4
|
+
|
5
|
+
# Mysql doesn't support sequences.
|
6
|
+
# We have to disable all them.
|
7
|
+
|
8
|
+
module Sequence
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def sql_for_creating_sequence ( options )
|
13
|
+
|
14
|
+
raise FeatureNotFound
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def sql_for_dropping_sequence ( options )
|
19
|
+
|
20
|
+
raise FeatureNotFound
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def sql_for_sequence_exists? ( options )
|
25
|
+
|
26
|
+
raise FeatureNotFound
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def sql_for_retrieving_sequences
|
31
|
+
|
32
|
+
raise FeatureNotFound
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module MysqlSQL
|
4
|
+
module Table
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_creating_table ( options = {} )
|
9
|
+
|
10
|
+
syntax = super
|
11
|
+
|
12
|
+
syntax += 'ENGINE = '
|
13
|
+
|
14
|
+
# If any engine has not been specified, we make INNODB as default.
|
15
|
+
|
16
|
+
if options[:engine]
|
17
|
+
|
18
|
+
syntax += options[:engine].to_s
|
19
|
+
|
20
|
+
else
|
21
|
+
|
22
|
+
syntax += 'INNODB'
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
syntax
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Generate SQL statement for retrieving tables.
|
33
|
+
|
34
|
+
def sql_for_getting_tables
|
35
|
+
|
36
|
+
'SHOW TABLES'
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
# Generate SQL statement for retrieving columns.
|
41
|
+
=begin
|
42
|
+
def sql_for_retrieving_columns ( options = {} )
|
43
|
+
|
44
|
+
%{
|
45
|
+
SELECT
|
46
|
+
A.column_name, A.data_type, A.character_maximum_length as size,
|
47
|
+
(A.is_nullable = 'YES') as allow_null,
|
48
|
+
(A.column_name = B.column_name) as pk,
|
49
|
+
A.column_default,
|
50
|
+
A.extra = 'auto_increment' as auto_inc,
|
51
|
+
A.column_name in (
|
52
|
+
SELECT s.COLUMN_NAME FROM INFORMATION_SCHEMA.statistics s
|
53
|
+
WHERE s.COLUMN_NAME = A.column_name
|
54
|
+
) as indexed
|
55
|
+
|
56
|
+
FROM information_schema.columns A
|
57
|
+
LEFT JOIN information_schema.key_column_usage B ON A.table_name = B.table_name
|
58
|
+
WHERE A.table_name = #{quote_value(options[:table_name])}
|
59
|
+
|
60
|
+
}
|
61
|
+
|
62
|
+
end
|
63
|
+
=end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'mysql'
|
2
|
+
|
3
|
+
require 'imparcial/driver/mysql/util'
|
4
|
+
require 'imparcial/driver/mysql/result'
|
5
|
+
require 'imparcial/driver/mysql/typemap'
|
6
|
+
require 'imparcial/driver/mysql/sql'
|
7
|
+
require 'imparcial/driver/mysql/expression'
|
8
|
+
|
9
|
+
module Imparcial
|
10
|
+
module Driver
|
11
|
+
class MysqlAdapter < AbstractAdapter
|
12
|
+
|
13
|
+
include MysqlUtil
|
14
|
+
include MysqlTypemap
|
15
|
+
include MysqlSQL
|
16
|
+
include MysqlExpression
|
17
|
+
|
18
|
+
def adapter_specific_exception
|
19
|
+
|
20
|
+
Mysql::Error
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def connect
|
25
|
+
|
26
|
+
@conn = Mysql.real_connect @host, @username, @password, @database, @port, @socket
|
27
|
+
|
28
|
+
rescue adapter_specific_exception => ex
|
29
|
+
|
30
|
+
raise AdapterConnectionError.new(ex.message)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def query ( sql )
|
35
|
+
|
36
|
+
result = conn.query sql
|
37
|
+
@result = MysqlResult.new result
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def last_insert_id
|
42
|
+
|
43
|
+
conn.last_insert_id
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
|
2
|
+
require f
|
3
|
+
end
|
4
|
+
|
5
|
+
module Imparcial
|
6
|
+
module Driver
|
7
|
+
module PostgreExpression
|
8
|
+
|
9
|
+
def insert ( options = {} )
|
10
|
+
|
11
|
+
super options
|
12
|
+
|
13
|
+
begin
|
14
|
+
|
15
|
+
seq_name = 'seq_' + options[:table_name].to_s + '_id'
|
16
|
+
id = conn.query "SELECT currval('#{seq_name}')"
|
17
|
+
|
18
|
+
@last_insert_id = id[0][0].to_i
|
19
|
+
|
20
|
+
rescue adapter_specific_exception; end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def last_insert_id
|
25
|
+
|
26
|
+
@last_insert_id
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
class PostgreResult < AbstractResult
|
4
|
+
|
5
|
+
def rows
|
6
|
+
|
7
|
+
@specific.result.length
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch
|
12
|
+
|
13
|
+
fields = @specific.fields
|
14
|
+
rows = @specific.result
|
15
|
+
|
16
|
+
rows.each do |row|
|
17
|
+
|
18
|
+
v = []
|
19
|
+
|
20
|
+
row.each_with_index do |value, index|
|
21
|
+
|
22
|
+
v << Row.new(fields[index], value)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
yield(*v)
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreSQL
|
4
|
+
module Column
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_renaming_column ( options )
|
9
|
+
|
10
|
+
syntax = ''
|
11
|
+
|
12
|
+
syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
13
|
+
|
14
|
+
options[:field].each do |old_name, new_name|
|
15
|
+
|
16
|
+
syntax += "RENAME COLUMN #{old_name} TO #{new_name}"
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
logger.warn(syntax) if @table_logging
|
21
|
+
|
22
|
+
syntax
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def sql_for_modifying_columns ( options )
|
27
|
+
|
28
|
+
syntax = ''
|
29
|
+
|
30
|
+
syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
31
|
+
|
32
|
+
options[:fields].each do |field|
|
33
|
+
|
34
|
+
column = field_to_column field
|
35
|
+
|
36
|
+
syntax += "ALTER COLUMN #{column[:name]} TYPE #{column[:type]}"
|
37
|
+
syntax += "(#{column[:size]})" if column[:size]
|
38
|
+
syntax += ","
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
syntax.chop!
|
43
|
+
|
44
|
+
logger.warn(syntax) if @table_logging
|
45
|
+
|
46
|
+
syntax
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreSQL
|
4
|
+
module Constraint
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_adding_auto_increment ( options )
|
9
|
+
|
10
|
+
seq_name = 'seq_' + options[:table_name].to_s + '_' + options[:field].to_s
|
11
|
+
drop_sequence_if_necessary :sequence_name => seq_name
|
12
|
+
create_sequence :sequence_name => seq_name
|
13
|
+
sql_for_adding_default_value :table_name => options[:table_name], :fields => {options[:field] => "nextval('#{seq_name}')"}
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def sql_for_adding_default_value ( options )
|
18
|
+
|
19
|
+
syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
20
|
+
|
21
|
+
for field, value in options[:fields]
|
22
|
+
|
23
|
+
value = quote_value(value) if not value.to_s.match('nextval')
|
24
|
+
syntax += "ALTER COLUMN #{quote(field)} SET DEFAULT #{value},"
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
syntax.chop!
|
29
|
+
|
30
|
+
syntax
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreSQL
|
4
|
+
module Index
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for verifying if a given index exists.
|
9
|
+
|
10
|
+
def sql_for_index_exists? ( options )
|
11
|
+
|
12
|
+
%{SELECT
|
13
|
+
c2.relname as "table",
|
14
|
+
(select attname from pg_attribute where attrelid = i.indexrelid AND attnum > 0) as "column" ,
|
15
|
+
c.relname as "index"
|
16
|
+
FROM pg_class c
|
17
|
+
JOIN pg_roles r ON r.oid = c.relowner
|
18
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
19
|
+
LEFT JOIN pg_index i ON i.indexrelid = c.oid
|
20
|
+
LEFT JOIN pg_class c2 ON i.indrelid = c2.oid
|
21
|
+
WHERE c.relkind = 'i'
|
22
|
+
AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
|
23
|
+
c2.relname = #{quote_value(options[:table_name])} AND
|
24
|
+
c.relname = #{quote_value(options[:index_name])}
|
25
|
+
}
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
# Generate SQL statement for retrieving all indexes.
|
30
|
+
|
31
|
+
def sql_for_getting_indexes ( options )
|
32
|
+
|
33
|
+
%{SELECT
|
34
|
+
c2.relname as "table",
|
35
|
+
(select attname from pg_attribute where attrelid = i.indexrelid AND attnum > 0) as "column" ,
|
36
|
+
c.relname as "index"
|
37
|
+
FROM pg_class c
|
38
|
+
JOIN pg_roles r ON r.oid = c.relowner
|
39
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
40
|
+
LEFT JOIN pg_index i ON i.indexrelid = c.oid
|
41
|
+
LEFT JOIN pg_class c2 ON i.indrelid = c2.oid
|
42
|
+
WHERE c.relkind = 'i'
|
43
|
+
AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
|
44
|
+
c2.relname = #{quote_value(options[:table_name])}
|
45
|
+
}
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreSQL
|
4
|
+
module Sequence
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_sequence_exists? ( options )
|
9
|
+
|
10
|
+
%{
|
11
|
+
SELECT 1 FROM pg_class WHERE relkind = 'S' AND
|
12
|
+
relname = #{quote_value(options[:sequence_name])}
|
13
|
+
}
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
# Generate SQL statement for retrieving sequences.
|
18
|
+
|
19
|
+
def sql_for_getting_sequences
|
20
|
+
|
21
|
+
%{
|
22
|
+
SELECT relname FROM pg_class WHERE relkind = 'S'
|
23
|
+
}
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreSQL
|
4
|
+
module Table
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for retrieving tables.
|
9
|
+
|
10
|
+
def sql_for_getting_tables
|
11
|
+
|
12
|
+
%{
|
13
|
+
SELECT table_name FROM information_schema.tables
|
14
|
+
WHERE table_schema = 'public'
|
15
|
+
}
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# Generate SQL statement for retrieving columns.
|
20
|
+
=begin
|
21
|
+
def sql_for_retrieving_columns ( options )
|
22
|
+
|
23
|
+
%{
|
24
|
+
SELECT
|
25
|
+
A.column_name, A.data_type, A.character_maximum_length,
|
26
|
+
(A.is_nullable = 'YES') as allow_null,
|
27
|
+
(A.column_name = B.column_name) as pk,
|
28
|
+
A.column_default,
|
29
|
+
A.column_default LIKE 'nextval%' as auto_inc,
|
30
|
+
A.column_name in (SELECT sa.attname from pg_class sc
|
31
|
+
JOIN pg_index si ON sc.oid = si.indexrelid
|
32
|
+
JOIN pg_class sc2 ON sc2.oid = si.indrelid
|
33
|
+
JOIN pg_attribute sa ON sc.oid = sa.attrelid
|
34
|
+
WHERE sc2.relname = #{quote_value(options[:table_name])} AND sa.attname = A.column_name
|
35
|
+
) as column_indexed
|
36
|
+
FROM information_schema.columns A
|
37
|
+
LEFT JOIN information_schema.key_column_usage B ON A.table_name = B.table_name
|
38
|
+
WHERE A.table_name = #{quote_value(options[:table_name])};
|
39
|
+
}
|
40
|
+
|
41
|
+
end
|
42
|
+
=end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module PostgreTypemap
|
4
|
+
|
5
|
+
def regular_types
|
6
|
+
|
7
|
+
super.dup.merge!(:datetime => 'TIMESTAMP')
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def sql_types
|
12
|
+
|
13
|
+
super.dup.merge!('CHARACTER VARYING' => :string,
|
14
|
+
'DOUBLE PRECISION' => :float)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# Due to nextval, we have to format the default value
|
21
|
+
|
22
|
+
def parse_column ( column )
|
23
|
+
|
24
|
+
super
|
25
|
+
|
26
|
+
if column[:default_value]
|
27
|
+
|
28
|
+
column[:default_value].gsub!(/::.*/,'')
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'postgres'
|
2
|
+
|
3
|
+
require 'imparcial/driver/postgre/util'
|
4
|
+
require 'imparcial/driver/postgre/result'
|
5
|
+
require 'imparcial/driver/postgre/typemap'
|
6
|
+
require 'imparcial/driver/postgre/sql'
|
7
|
+
require 'imparcial/driver/postgre/expression'
|
8
|
+
|
9
|
+
module Imparcial
|
10
|
+
module Driver
|
11
|
+
class PostgreAdapter < AbstractAdapter
|
12
|
+
|
13
|
+
include PostgreUtil
|
14
|
+
include PostgreTypemap
|
15
|
+
include PostgreSQL
|
16
|
+
include PostgreExpression
|
17
|
+
|
18
|
+
def adapter_specific_exception
|
19
|
+
|
20
|
+
PGError
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def connect
|
25
|
+
|
26
|
+
@conn = PGconn.connect @host, @port, '', '', @database, @username, @password
|
27
|
+
|
28
|
+
rescue adapter_specific_exception => ex
|
29
|
+
|
30
|
+
raise AdapterConnectionError.new(ex.message)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def query ( sql )
|
35
|
+
|
36
|
+
result = conn.exec sql
|
37
|
+
@result = PostgreResult.new result
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'imparcial/driver/abstract'
|