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,50 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractExpression
|
4
|
+
module Update
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def expected_options_for_updating
|
9
|
+
|
10
|
+
{:table_name => :required, :values => :required, :conditions => :required}
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
public
|
15
|
+
|
16
|
+
# === Description
|
17
|
+
# Update some records.
|
18
|
+
#
|
19
|
+
# === Usage
|
20
|
+
# abstract_adapter.update :table_name => 'person', :values => {:salary => 1500},
|
21
|
+
# :conditions => ['id = ?',10]
|
22
|
+
#
|
23
|
+
# === Options
|
24
|
+
# * :table_name
|
25
|
+
# * :values
|
26
|
+
# * :conditions
|
27
|
+
#
|
28
|
+
# === Returning
|
29
|
+
# nothing
|
30
|
+
|
31
|
+
def update ( options )
|
32
|
+
|
33
|
+
check_options expected_options_for_updating, options
|
34
|
+
|
35
|
+
sql = sql_for_updating( options )
|
36
|
+
|
37
|
+
logger.warn sql if @update_logging
|
38
|
+
|
39
|
+
query sql
|
40
|
+
|
41
|
+
rescue adapter_specific_exception => ex
|
42
|
+
|
43
|
+
raise UpdateError.new(ex.message)
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
|
2
|
+
require f
|
3
|
+
end
|
4
|
+
|
5
|
+
module Imparcial
|
6
|
+
module Driver
|
7
|
+
module AbstractExpression
|
8
|
+
include Statement
|
9
|
+
include Sequence
|
10
|
+
include Column
|
11
|
+
include Table
|
12
|
+
include Constraint
|
13
|
+
include Insert
|
14
|
+
include Select
|
15
|
+
include Delete
|
16
|
+
include Update
|
17
|
+
include Record
|
18
|
+
include Lock
|
19
|
+
include Transaction
|
20
|
+
include Index
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
|
4
|
+
# This class will serve as base for adapter specific result class.
|
5
|
+
|
6
|
+
class AbstractResult
|
7
|
+
attr_reader :specific
|
8
|
+
|
9
|
+
def initialize ( result_specific )
|
10
|
+
|
11
|
+
@specific = result_specific
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
# === Description
|
16
|
+
# get number of rows avaliable.
|
17
|
+
|
18
|
+
def rows
|
19
|
+
|
20
|
+
raise FeatureNotFound
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# === Description
|
25
|
+
# fetch the result.
|
26
|
+
|
27
|
+
def fetch
|
28
|
+
|
29
|
+
raise FeatureNotFound
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch_in_array
|
34
|
+
|
35
|
+
array = []
|
36
|
+
|
37
|
+
fetch do |*rows|
|
38
|
+
|
39
|
+
array << rows
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
array
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# === Description
|
48
|
+
# Fetch the first row. Ignoring others if avaliable.
|
49
|
+
|
50
|
+
def fetch_first_row
|
51
|
+
|
52
|
+
fetch do |*rows|
|
53
|
+
return *rows
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
# This class wraps a regular row.
|
62
|
+
# Usually, a row will only come with value.
|
63
|
+
# Instead, we can also keep the column name. So that, this class
|
64
|
+
# can keep track of column name and value.
|
65
|
+
#
|
66
|
+
# -------------------
|
67
|
+
# id | name | price <- column name
|
68
|
+
# 1 | apple | 0.99 <- column value
|
69
|
+
# 2 | lemon | 1.99 <- column value
|
70
|
+
# -------------------
|
71
|
+
|
72
|
+
class Row
|
73
|
+
include Imparcial::Driver::AbstractUtil
|
74
|
+
|
75
|
+
attr_accessor :name, :value
|
76
|
+
alias_method :column_name, :name
|
77
|
+
alias_method :column_value, :value
|
78
|
+
|
79
|
+
def initialize ( column_name, column_value )
|
80
|
+
|
81
|
+
@name = column_name
|
82
|
+
@value = unquote_value(column_value)
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
|
88
|
+
@value
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Column
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for getting columns information.
|
9
|
+
# We need name, type and size.
|
10
|
+
|
11
|
+
def sql_for_getting_columns_information ( options )
|
12
|
+
|
13
|
+
%{SELECT
|
14
|
+
column_name,
|
15
|
+
data_type,
|
16
|
+
character_maximum_length
|
17
|
+
FROM INFORMATION_SCHEMA.columns
|
18
|
+
WHERE table_name = #{quote_value(options[:table_name])}
|
19
|
+
}
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
# Generate SQL statement for getting column information.
|
24
|
+
# We need name, type and size. Quite similar to above, except,
|
25
|
+
# it's a more narrow SQL.
|
26
|
+
|
27
|
+
def sql_for_getting_column_information ( options )
|
28
|
+
|
29
|
+
%{SELECT
|
30
|
+
column_name,
|
31
|
+
data_type,
|
32
|
+
character_maximum_length
|
33
|
+
FROM INFORMATION_SCHEMA.columns
|
34
|
+
WHERE table_name = #{quote_value(options[:table_name])} AND
|
35
|
+
column_name = #{quote_value(options[:field_name])}
|
36
|
+
}
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
# Generate SQL statement for adding some columns.
|
41
|
+
# Alter table will do the job for us.
|
42
|
+
|
43
|
+
def sql_for_adding_columns ( options )
|
44
|
+
|
45
|
+
syntax = ''
|
46
|
+
|
47
|
+
syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
48
|
+
|
49
|
+
parse_fields options[:fields] do |field|
|
50
|
+
|
51
|
+
syntax += "ADD COLUMN " + field_to_column_sql(field) + ","
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
syntax.chop!
|
56
|
+
|
57
|
+
syntax
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
# Generate SQL statement for dropping some columns.
|
62
|
+
# Alter table will do the job for us.
|
63
|
+
|
64
|
+
def sql_for_dropping_columns ( options )
|
65
|
+
|
66
|
+
syntax = ''
|
67
|
+
|
68
|
+
syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
69
|
+
|
70
|
+
options[:fields].each do |field_name|
|
71
|
+
|
72
|
+
syntax += 'DROP ' + field_name + ','
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
syntax.chop!
|
77
|
+
|
78
|
+
syntax
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
# Generate SQL statement for renaming a column.
|
83
|
+
# Must be overriden.
|
84
|
+
|
85
|
+
def sql_for_renaming_column ( options )
|
86
|
+
|
87
|
+
raise FeatureNotFound
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
# Generate SQL statement for modifying a column.
|
92
|
+
# Must be overriden.
|
93
|
+
|
94
|
+
def sql_for_modifying_columns ( options )
|
95
|
+
|
96
|
+
raise FeatureNotFound
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Constraint
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def sql_for_adding_primary_key ( options )
|
9
|
+
|
10
|
+
syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
|
11
|
+
syntax += 'ADD PRIMARY KEY ('
|
12
|
+
|
13
|
+
for field_name in options[:fields]
|
14
|
+
|
15
|
+
syntax += quote(field_name) + ','
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
syntax.chop!
|
20
|
+
syntax += ')'
|
21
|
+
|
22
|
+
syntax
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def sql_for_adding_column ( options )
|
27
|
+
|
28
|
+
raise FeatureNotFound
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def sql_for_adding_default_value ( options )
|
33
|
+
|
34
|
+
raise FeatureNotFound
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Delete
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# SQL for generating the delete statement.
|
9
|
+
|
10
|
+
def sql_for_deleting ( options )
|
11
|
+
|
12
|
+
syntax = 'DELETE FROM ' + quote(options[:table_name])
|
13
|
+
syntax += parse_conditions options[:conditions] if options[:conditions]
|
14
|
+
|
15
|
+
syntax
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Index
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for creating an index.
|
9
|
+
|
10
|
+
def sql_for_creating_index ( options )
|
11
|
+
|
12
|
+
syntax = 'CREATE '
|
13
|
+
syntax += options[:index_type] + ' ' if options[:index_type]
|
14
|
+
syntax += 'INDEX '
|
15
|
+
syntax += options[:index_name] + ' '
|
16
|
+
syntax += 'ON ' + quote(options[:table_name])
|
17
|
+
syntax += '('
|
18
|
+
syntax += quote(options[:column_name])
|
19
|
+
syntax += ')'
|
20
|
+
|
21
|
+
syntax
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
# Generate SQL statement for dropping an index.
|
26
|
+
|
27
|
+
def sql_for_dropping_index ( options )
|
28
|
+
|
29
|
+
'DROP INDEX ' + options[:index_name]
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
# Subclasses need to override this method.
|
34
|
+
|
35
|
+
def sql_for_getting_indexes
|
36
|
+
|
37
|
+
raise FeatureNotFound
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Insert
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Some helpers for inserting method.
|
9
|
+
# Extract column names from a hash.
|
10
|
+
|
11
|
+
def column_names_for ( values )
|
12
|
+
|
13
|
+
column_names = []
|
14
|
+
|
15
|
+
values.each_key do |column_name|
|
16
|
+
|
17
|
+
column_names << quote(column_name)
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
column_names
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
# Extract column values from a hash.
|
26
|
+
|
27
|
+
def column_values_for ( values )
|
28
|
+
|
29
|
+
column_values = []
|
30
|
+
|
31
|
+
values.each_value do |column_value|
|
32
|
+
|
33
|
+
column_values << quote_value(column_value)
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
column_values
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
# Execute the SQL statement for inserting.
|
42
|
+
|
43
|
+
def sql_for_inserting ( options )
|
44
|
+
|
45
|
+
syntax = 'INSERT INTO ' + quote(options[:table_name])
|
46
|
+
syntax += '('
|
47
|
+
|
48
|
+
syntax += column_names_for(options[:values]).join(',')
|
49
|
+
|
50
|
+
syntax += ') VALUES ('
|
51
|
+
|
52
|
+
syntax += column_values_for(options[:values]).join(',')
|
53
|
+
|
54
|
+
syntax += ')'
|
55
|
+
|
56
|
+
syntax
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Record
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Execute SQL statement for couting records of a table.
|
9
|
+
|
10
|
+
def sql_for_couting_records ( options )
|
11
|
+
|
12
|
+
'SELECT COUNT(*) FROM ' + quote(options[:table_name])
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Select
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def get_key ( name, table_metadata )
|
9
|
+
|
10
|
+
key_name = ('key_for_' + name.to_s).to_sym
|
11
|
+
key = table_metadata[key_name]
|
12
|
+
|
13
|
+
unless key
|
14
|
+
|
15
|
+
msg = 'A key has not been defined at '+table_metadata[:name].to_s
|
16
|
+
raise SelectError.new(msg)
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
key
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_relkind ( table )
|
25
|
+
|
26
|
+
table[:relkind].to_s.upcase!.gsub!('_', ' ')
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def unroll_joins ( table_list, previous_table_metadata )
|
31
|
+
|
32
|
+
syntax = ''
|
33
|
+
|
34
|
+
# Array
|
35
|
+
|
36
|
+
table_list.each do |list|
|
37
|
+
|
38
|
+
for table_metadata, inner_table_list in list
|
39
|
+
|
40
|
+
rel = get_relkind table_metadata
|
41
|
+
|
42
|
+
syntax += ' ' + rel + ' ' + quote(table_metadata[:name]) + ' ON '
|
43
|
+
|
44
|
+
previous_key = get_key previous_table_metadata[:name], table_metadata
|
45
|
+
previous_id = quote(table_metadata[:name]) + '.' + previous_key
|
46
|
+
|
47
|
+
current_key = get_key table_metadata[:name], previous_table_metadata
|
48
|
+
current_id = quote(previous_table_metadata[:name]) + '.' + current_key
|
49
|
+
|
50
|
+
syntax += previous_id + ' = ' + current_id
|
51
|
+
|
52
|
+
next unless inner_table_list
|
53
|
+
next if inner_table_list.length == 0
|
54
|
+
|
55
|
+
syntax += unroll_joins inner_table_list, table_metadata
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
syntax
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
# Enable selection by column name.
|
66
|
+
|
67
|
+
def build_field_selection ( fields )
|
68
|
+
|
69
|
+
if fields
|
70
|
+
|
71
|
+
fields.join(',')
|
72
|
+
|
73
|
+
else
|
74
|
+
|
75
|
+
'*'
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
def sql_for_selecting ( options )
|
82
|
+
|
83
|
+
syntax = 'SELECT '
|
84
|
+
syntax += build_field_selection options[:fields]
|
85
|
+
syntax += ' FROM '
|
86
|
+
|
87
|
+
syntax += quote options[:joins] ? options[:joins][0].keys.first[:name] : options[:table_name]
|
88
|
+
syntax += unroll_joins options[:joins][0].values[0], options[:joins][0].keys.first if options[:joins]
|
89
|
+
|
90
|
+
syntax += parse_conditions options[:conditions]
|
91
|
+
syntax += parse_limit options[:limit]
|
92
|
+
syntax += parse_order options
|
93
|
+
|
94
|
+
syntax
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Sequence
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for creating a sequence.
|
9
|
+
|
10
|
+
def sql_for_creating_sequence ( options = {} )
|
11
|
+
|
12
|
+
syntax = 'CREATE SEQUENCE ' + quote(options[:sequence_name]) + ' '
|
13
|
+
syntax += 'START WITH ' + quote_value(options[:start_with]) + ' '
|
14
|
+
syntax += 'MINVALUE ' + quote_value(options[:min_value]) + ' '
|
15
|
+
syntax += 'MAXVALUE ' + quote_value(options[:max_value]) if options[:max_value]
|
16
|
+
syntax += 'INCREMENT BY ' + quote_value(options[:increment_by]) + ' '
|
17
|
+
syntax += options[:cycle] ? 'CYCLE ' : 'NO CYCLE '
|
18
|
+
syntax += 'CACHE ' + quote_value(options[:cache]) if options[:cache]
|
19
|
+
|
20
|
+
syntax
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Generate SQL statement for dropping a sequence.
|
27
|
+
|
28
|
+
def sql_for_dropping_sequence ( options = {} )
|
29
|
+
|
30
|
+
'DROP SEQUENCE ' + quote(options[:sequence_name])
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# Generate SQL statement for verifying sequences.
|
35
|
+
# Subclasses must override this method.
|
36
|
+
|
37
|
+
def sql_for_sequence_exists? ( options = {} )
|
38
|
+
|
39
|
+
raise FeatureNotFound
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# Generate SQL statement for retrieving sequences.
|
44
|
+
# Subclasses must override this method.
|
45
|
+
|
46
|
+
def sql_for_getting_sequences
|
47
|
+
|
48
|
+
raise FeatureNotFound
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Table
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for dropping table.
|
9
|
+
|
10
|
+
def sql_for_dropping_table ( options )
|
11
|
+
|
12
|
+
'DROP TABLE ' + quote( options[:table_name] )
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate SQL statement for creating table.
|
17
|
+
|
18
|
+
def sql_for_creating_table ( options )
|
19
|
+
|
20
|
+
columns = []
|
21
|
+
|
22
|
+
# Let's parse some columns in order to provide default options.
|
23
|
+
|
24
|
+
parse_fields options[:fields] do |field|
|
25
|
+
|
26
|
+
columns << field_to_column_sql(field)
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
syntax = 'CREATE TABLE ' + quote( options[:table_name] )
|
31
|
+
syntax += '('
|
32
|
+
syntax += columns.join(',')
|
33
|
+
syntax += ')'
|
34
|
+
|
35
|
+
syntax
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Imparcial
|
2
|
+
module Driver
|
3
|
+
module AbstractSQL
|
4
|
+
module Transaction
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Generate SQL statement for initializing a transaction.
|
9
|
+
|
10
|
+
def sql_for_initializing_a_transaction
|
11
|
+
|
12
|
+
'BEGIN'
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate SQL statement for terminating a transaction.
|
17
|
+
|
18
|
+
def sql_for_terminating_a_transaction
|
19
|
+
|
20
|
+
'COMMIT'
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# Generate SQL statement for rolling back a transaction.
|
25
|
+
|
26
|
+
def sql_for_rolling_back ( options )
|
27
|
+
|
28
|
+
options[:savepoint_name] == nil ? 'ROLLBACK' : 'ROLLBACK TO ' + options[:savepoint_name].to_s
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
# Generate SQL statement for placing a saving point.
|
33
|
+
|
34
|
+
def sql_for_saving_point ( options )
|
35
|
+
|
36
|
+
'SAVEPOINT ' + options[:savepoint_name].to_s
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|