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,71 @@
|
|
1
|
+
module Imparcial
|
2
|
+
|
3
|
+
# Main class
|
4
|
+
|
5
|
+
class ImparcialError < StandardError; end
|
6
|
+
|
7
|
+
# Adapter
|
8
|
+
|
9
|
+
class AdapterError < ImparcialError; end
|
10
|
+
class AdapterNotFound < AdapterError; end
|
11
|
+
class AdapterConnectionError < AdapterError; end
|
12
|
+
|
13
|
+
# Expression
|
14
|
+
|
15
|
+
class ExpressionError < ImparcialError; end
|
16
|
+
|
17
|
+
class FeatureNotFound < ExpressionError; end
|
18
|
+
class ConditionError < ExpressionError; end
|
19
|
+
class OptionError < ExpressionError; end
|
20
|
+
class ResultError < ExpressionError; end
|
21
|
+
|
22
|
+
# Table
|
23
|
+
|
24
|
+
class TableError < ExpressionError; end
|
25
|
+
class TableCreateError < TableError; end
|
26
|
+
class TableDropError < TableError; end
|
27
|
+
class TableListError < TableError; end
|
28
|
+
class TableUpdateError < TableError; end
|
29
|
+
|
30
|
+
# Column
|
31
|
+
|
32
|
+
class ColumnError < ExpressionError; end
|
33
|
+
class ColumnListError < ColumnError; end
|
34
|
+
class ColumnUpdateError < ColumnError; end
|
35
|
+
class ColumnCreateError < ColumnError; end
|
36
|
+
class ColumnDropError < ColumnError; end
|
37
|
+
class ColumnConstraintError < ColumnError; end
|
38
|
+
class ColumnRenameError < ColumnError; end
|
39
|
+
|
40
|
+
# Crud
|
41
|
+
|
42
|
+
class SelectError < ExpressionError; end
|
43
|
+
class InsertError < ExpressionError; end
|
44
|
+
class DeleteError < ExpressionError; end
|
45
|
+
class UpdateError < ExpressionError; end
|
46
|
+
|
47
|
+
# Sequence
|
48
|
+
|
49
|
+
class SequenceError < ExpressionError; end
|
50
|
+
class SequenceCreateError < SequenceError; end
|
51
|
+
class SequenceDropError < SequenceError; end
|
52
|
+
class SequenceListError < SequenceError; end
|
53
|
+
class SequenceUpdateError < SequenceError; end
|
54
|
+
|
55
|
+
# Transaction
|
56
|
+
|
57
|
+
class TransactionError < ExpressionError; end
|
58
|
+
|
59
|
+
# Lock
|
60
|
+
|
61
|
+
class LockError < ExpressionError; end
|
62
|
+
|
63
|
+
# Index
|
64
|
+
|
65
|
+
class IndexError < ExpressionError; end
|
66
|
+
class IndexCreateError < IndexError; end
|
67
|
+
class IndexDropError < IndexError; end
|
68
|
+
class IndexListError < IndexError; end
|
69
|
+
class IndexUpdateError < IndexError; end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Kernel
|
2
|
+
|
3
|
+
def check_options ( expected_options , user_options )
|
4
|
+
|
5
|
+
# Let's iterate over all user options.
|
6
|
+
|
7
|
+
user_options.each do |user_option, content|
|
8
|
+
|
9
|
+
confirmed = false
|
10
|
+
|
11
|
+
# Let's iterate over expected options.
|
12
|
+
|
13
|
+
expected_options.each_key do |name|
|
14
|
+
|
15
|
+
if name.to_s == user_option.to_s
|
16
|
+
|
17
|
+
# Let's verify if content is a collection.
|
18
|
+
|
19
|
+
if content.class == Array || content.class == Hash
|
20
|
+
|
21
|
+
# If so, we need to check out for content.
|
22
|
+
|
23
|
+
raise StandardError.new('Option ' + name.to_s + ' needs content') if content.length == 0
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
# Yeah, user option matches with expected option.
|
28
|
+
|
29
|
+
confirmed = true
|
30
|
+
break
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# If there's a match, we move forward.
|
37
|
+
|
38
|
+
if confirmed
|
39
|
+
|
40
|
+
confirmed = false
|
41
|
+
next
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
# Opss. user has entered with an unknown option.
|
46
|
+
|
47
|
+
raise StandardError.new('Cannot find option ' + user_option.to_s)
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
# Let's iterate over all expected and required options.
|
52
|
+
|
53
|
+
for name, condition in expected_options
|
54
|
+
|
55
|
+
# If this option is not required, we can move forward.
|
56
|
+
|
57
|
+
next unless condition == :required
|
58
|
+
confirmed = false
|
59
|
+
|
60
|
+
# Over user's.
|
61
|
+
|
62
|
+
user_options.each_key do |user_option|
|
63
|
+
|
64
|
+
if name.to_s == user_option.to_s
|
65
|
+
|
66
|
+
confirmed = true
|
67
|
+
break
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# Alright, user has entered with a necessary option.
|
74
|
+
|
75
|
+
if confirmed
|
76
|
+
|
77
|
+
confirmed = false
|
78
|
+
next
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
# Opss... user need to provide a required option.
|
83
|
+
|
84
|
+
raise StandardError.new('Option ' + name.to_s + ' is necessary')
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Imparcial
|
2
|
+
|
3
|
+
class Initializer
|
4
|
+
|
5
|
+
def self.get_adapter ( name )
|
6
|
+
|
7
|
+
name = name.to_s
|
8
|
+
|
9
|
+
require "imparcial/driver/#{name}"
|
10
|
+
|
11
|
+
("Imparcial::Driver::#{name.camelize}Adapter").to_const
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.adapter ( name )
|
16
|
+
|
17
|
+
adapter = (get_adapter name).new
|
18
|
+
|
19
|
+
yield adapter
|
20
|
+
|
21
|
+
adapter
|
22
|
+
|
23
|
+
rescue LoadError
|
24
|
+
|
25
|
+
raise AdapterNotFound.new(driver + ' cannot be found')
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/imparcial.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Unquoting Values' do
|
4
|
+
|
5
|
+
specify 'should do with integer' do
|
6
|
+
|
7
|
+
assert_equal 1, abstract_adapter.unquote_value('1')
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
specify 'should do with float' do
|
12
|
+
|
13
|
+
assert_equal 0.99, abstract_adapter.unquote_value('0.99')
|
14
|
+
assert_equal 1.99, abstract_adapter.unquote_value('1.99')
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
specify 'should do with zero' do
|
19
|
+
|
20
|
+
assert_equal 0, abstract_adapter.unquote_value('0')
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
specify 'should do with nil' do
|
25
|
+
|
26
|
+
assert_equal nil, abstract_adapter.unquote_value(nil)
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter Columns' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
fields = []
|
9
|
+
fields << {:name => :id, :type => :integer}
|
10
|
+
fields << {:name => :name, :type => :string, :size => 50}
|
11
|
+
abstract_adapter.create_table :table_name => 'bla',:fields => fields
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'should get columns information' do
|
16
|
+
|
17
|
+
columns = abstract_adapter.get_columns_information(:table_name=>'bla')
|
18
|
+
|
19
|
+
assert_equal 'id', columns[0][:name]
|
20
|
+
assert_equal :integer, columns[0][:type]
|
21
|
+
assert_equal nil, columns[0][:size]
|
22
|
+
|
23
|
+
assert_equal 'name', columns[1][:name]
|
24
|
+
assert_equal :string, columns[1][:type]
|
25
|
+
assert_equal 50, columns[1][:size]
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
specify 'should get info about one column' do
|
30
|
+
|
31
|
+
column = abstract_adapter.get_column_information(:table_name => 'bla', :field_name => 'id')
|
32
|
+
assert_equal 'id', column[:name]
|
33
|
+
assert_equal :integer, column[:type]
|
34
|
+
assert_equal nil, column[:size]
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
context 'Abstract Adapter Table Update' do
|
42
|
+
|
43
|
+
def setup
|
44
|
+
|
45
|
+
abstract_adapter.drop_all_tables
|
46
|
+
abstract_adapter.create_table :table_name => 'bla',:fields => [
|
47
|
+
{:name => :id, :type => :integer}, {:name => :age, :type => :integer},
|
48
|
+
{:name => :salary,:type => :float}
|
49
|
+
]
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
specify 'should add a column' do
|
54
|
+
|
55
|
+
assert_equal 3, abstract_adapter.get_columns_information(:table_name => 'bla').length
|
56
|
+
abstract_adapter.add_columns :table_name => 'bla', :fields => [{:name => :name, :type => :string},{:name => :some, :type => :integer}]
|
57
|
+
assert_equal 5, abstract_adapter.get_columns_information(:table_name => 'bla').length
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
specify 'should drop a column' do
|
62
|
+
|
63
|
+
assert_equal 3, abstract_adapter.get_columns_information(:table_name => 'bla').length
|
64
|
+
abstract_adapter.drop_columns :table_name => 'bla', :fields => ['id','age']
|
65
|
+
assert_equal 1, abstract_adapter.get_columns_information(:table_name => 'bla').length
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
specify 'should rename a column' do
|
70
|
+
|
71
|
+
abstract_adapter.rename_column :table_name => 'bla', :field => {:id => :idx}
|
72
|
+
abstract_adapter.rename_columns :table_name => 'bla', :fields => {:idx => :id, :age => :agex}
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
specify 'should modify a column' do
|
77
|
+
|
78
|
+
assert_nothing_raised do
|
79
|
+
abstract_adapter.modify_columns :table_name => 'bla', :fields => [{:name => :id, :type => :string, :size => 10},{:name => :age, :type => :float}]
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter Constraints' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
fields = []
|
9
|
+
fields << {:name => :id, :type => :integer}
|
10
|
+
fields << {:name => :name, :type => :string, :size => 50}
|
11
|
+
abstract_adapter.create_table :table_name => 'bla',:fields => fields
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'should add primary key' do
|
16
|
+
|
17
|
+
assert_nothing_raised do
|
18
|
+
abstract_adapter.add_primary_key :table_name => 'bla', :fields => ['id']
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
specify 'should add auto inc' do
|
24
|
+
|
25
|
+
assert_nothing_raised do
|
26
|
+
abstract_adapter.add_auto_increment :table_name => 'bla', :field => 'id'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
specify 'should add default value' do
|
32
|
+
|
33
|
+
assert_nothing_raised do
|
34
|
+
abstract_adapter.add_default_value :table_name => 'bla', :fields => {:id => 1}
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
fields = []
|
9
|
+
fields << {:name => :id, :type => :integer}
|
10
|
+
fields << {:name => :name, :type => :string}
|
11
|
+
abstract_adapter.create_table :table_name => 'bla', :fields => fields
|
12
|
+
abstract_adapter.insert :table_name => 'bla', :values => {:id => 1, :name => 'jota'}
|
13
|
+
abstract_adapter.insert :table_name => 'bla', :values => {:id => 2, :name => 'mauricio'}
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
specify 'should not delete without conditions' do
|
18
|
+
|
19
|
+
assert_raise Imparcial::OptionError do
|
20
|
+
abstract_adapter.delete :table_name => 'bla'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
specify 'should not delete all with conditions' do
|
26
|
+
|
27
|
+
assert_raise Imparcial::OptionError do
|
28
|
+
abstract_adapter.delete_all :table_name => 'bla', :conditions => ['id = 1']
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
specify 'should delete some records' do
|
34
|
+
|
35
|
+
assert_nothing_raised do
|
36
|
+
abstract_adapter.delete :table_name => 'bla', :conditions => ['id = 1']
|
37
|
+
end
|
38
|
+
assert_equal 1, abstract_adapter.total_of_records(:table_name=>'bla')
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
specify 'should delete all records' do
|
43
|
+
|
44
|
+
assert_nothing_raised do
|
45
|
+
abstract_adapter.delete_all :table_name => 'bla'
|
46
|
+
end
|
47
|
+
assert_equal 0, abstract_adapter.total_of_records(:table_name=>'bla')
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
abstract_adapter.drop_all_indexes :table_name => 'bla'
|
9
|
+
fields = []
|
10
|
+
fields << {:name => :id, :type => :integer}
|
11
|
+
fields << {:name => :name, :type => :string}
|
12
|
+
abstract_adapter.create_table :table_name => 'bla', :fields => fields
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
specify 'should create an index' do
|
17
|
+
|
18
|
+
abstract_adapter.create_index :index_name => 'i_id', :table_name => 'bla', :column_name => 'id'
|
19
|
+
assert_equal true, abstract_adapter.index_exists?(:index_name => 'i_id', :table_name => 'bla')
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
specify 'should retrieve all indexes' do
|
24
|
+
|
25
|
+
abstract_adapter.create_index :index_name => 'i_id', :table_name => 'bla', :column_name => 'id'
|
26
|
+
abstract_adapter.create_index :index_name => 'i_id2', :table_name => 'bla', :column_name => 'id'
|
27
|
+
|
28
|
+
assert_equal 2, abstract_adapter.get_indexes(:table_name => 'bla').length
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
specify 'should retrieve indexes for a table' do
|
33
|
+
|
34
|
+
abstract_adapter.create_index :index_name => 'i_id', :table_name => 'bla', :column_name => 'id'
|
35
|
+
indexes = abstract_adapter.get_indexes(:table_name => 'bla')
|
36
|
+
assert_equal 1, indexes.length
|
37
|
+
assert_equal 'bla', indexes[0][:table]
|
38
|
+
assert_equal 'i_id', indexes[0][:name]
|
39
|
+
assert_equal 'id', indexes[0][:column]
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
fields = []
|
9
|
+
fields << {:name => :id, :type => :integer}
|
10
|
+
fields << {:name => :name, :type => :string}
|
11
|
+
abstract_adapter.create_table :table_name => 'bla', :fields => fields
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'should insert with everything ok' do
|
16
|
+
|
17
|
+
assert_nothing_raised do
|
18
|
+
abstract_adapter.insert :table_name => 'bla',:values => {:id => 10, :name => 'pedro'}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
specify 'should not insert when trying to insert non avaliable fields' do
|
24
|
+
|
25
|
+
assert_raise Imparcial::InsertError do
|
26
|
+
abstract_adapter.insert :table_name => 'bla',:values => {:idx => 10, :name => 'pedro'}
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
specify 'should automagically increment id' do
|
32
|
+
|
33
|
+
fields = []
|
34
|
+
fields << {:name => :id, :type => :integer, :auto_increment => true, :pk => true, :allow_null => false}
|
35
|
+
fields << {:name => :name, :type => :string}
|
36
|
+
|
37
|
+
abstract_adapter.create_table :table_name => 'bla2', :fields => fields
|
38
|
+
assert_nothing_raised do
|
39
|
+
abstract_adapter.insert :table_name => 'bla2',:values => { :name => 'pedro'}
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
|
3
|
+
context 'Abstract Adapter' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_tables
|
8
|
+
fields = []
|
9
|
+
fields << {:name => :id, :type => :integer}
|
10
|
+
fields << {:name => :name, :type => :string}
|
11
|
+
abstract_adapter.create_table :table_name => 'bla', :fields => fields
|
12
|
+
abstract_adapter.insert :table_name => 'bla', :values => {:id => 1, :name => 'jota'}
|
13
|
+
abstract_adapter.insert :table_name => 'bla', :values => {:id => 2, :name => 'mauricio'}
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
specify 'should select with defined fields' do
|
18
|
+
|
19
|
+
abstract_adapter.select :table_name => 'bla', :fields => [:name]
|
20
|
+
|
21
|
+
a = abstract_adapter.result.fetch_in_array
|
22
|
+
assert_equal 'jota', a[0][0].value
|
23
|
+
assert_equal 'mauricio', a[1][0].value
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
specify 'should select with all fields' do
|
28
|
+
|
29
|
+
abstract_adapter.select :table_name => 'bla'
|
30
|
+
|
31
|
+
a = abstract_adapter.result.fetch_in_array
|
32
|
+
assert_equal 1, a[0][0].value
|
33
|
+
assert_equal 'jota', a[0][1].value
|
34
|
+
assert_equal 2, a[1][0].value
|
35
|
+
assert_equal 'mauricio', a[1][1].value
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
specify 'should select with conditions' do
|
40
|
+
|
41
|
+
abstract_adapter.select :table_name => 'bla', :conditions => ['name = ?','mauricio']
|
42
|
+
a = abstract_adapter.result.fetch_in_array
|
43
|
+
assert_equal 2, a[0][0].value
|
44
|
+
assert_equal 'mauricio', a[0][1].value
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
specify 'should select with limits' do
|
49
|
+
|
50
|
+
abstract_adapter.select :table_name => 'bla', :limit => 1
|
51
|
+
a = abstract_adapter.result.fetch_first_row
|
52
|
+
assert_equal 1, a[0].column_value
|
53
|
+
assert_equal 'jota', a[1].column_value
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
specify 'should select ordering desc' do
|
58
|
+
|
59
|
+
abstract_adapter.select :table_name => 'bla', :order_desc => :id
|
60
|
+
a = abstract_adapter.result.fetch_in_array
|
61
|
+
assert_equal 2, a[0][0].column_value
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
specify 'should select ordering asc' do
|
66
|
+
|
67
|
+
abstract_adapter.select :table_name => 'bla', :order_asc => :name
|
68
|
+
a = abstract_adapter.result.fetch_in_array
|
69
|
+
assert_equal 1, a[0][0].column_value
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'Abstract Adapter Advanced' do
|
76
|
+
|
77
|
+
def setup
|
78
|
+
|
79
|
+
abstract_adapter.drop_table_if_necessary :table_name => 'person'
|
80
|
+
fields = []
|
81
|
+
fields << {:name => :id, :type => :integer}
|
82
|
+
fields << {:name => :name, :type => :string}
|
83
|
+
abstract_adapter.create_table :table_name => 'person', :fields => fields
|
84
|
+
abstract_adapter.insert :table_name => 'person', :values => {:id => 1, :name => 'jota'}
|
85
|
+
abstract_adapter.insert :table_name => 'person', :values => {:id => 2, :name => 'mauricio'}
|
86
|
+
|
87
|
+
abstract_adapter.drop_table_if_necessary :table_name => 'telephone'
|
88
|
+
fields = []
|
89
|
+
fields << {:name => :id, :type => :integer}
|
90
|
+
fields << {:name => :number, :type => :integer}
|
91
|
+
fields << {:name => :person_id, :type => :integer}
|
92
|
+
abstract_adapter.create_table :table_name => 'telephone', :fields => fields
|
93
|
+
abstract_adapter.insert :table_name => 'telephone', :values => {:id => 1, :number => 42442, :person_id => 1}
|
94
|
+
|
95
|
+
|
96
|
+
abstract_adapter.drop_table_if_necessary :table_name => 'person_to_group'
|
97
|
+
fields = []
|
98
|
+
fields << {:name => :person_id, :type => :integer}
|
99
|
+
fields << {:name => :group_id, :type => :integer}
|
100
|
+
abstract_adapter.create_table :table_name => 'person_to_group', :fields => fields
|
101
|
+
abstract_adapter.insert :table_name => 'person_to_group', :values => {:person_id => 1, :group_id => 1}
|
102
|
+
abstract_adapter.insert :table_name => 'person_to_group', :values => {:person_id => 1, :group_id => 2}
|
103
|
+
abstract_adapter.insert :table_name => 'person_to_group', :values => {:person_id => 2, :group_id => 1}
|
104
|
+
|
105
|
+
abstract_adapter.drop_table_if_necessary :table_name => 'group'
|
106
|
+
fields = []
|
107
|
+
fields << {:name => :id, :type => :integer}
|
108
|
+
fields << {:name => :name, :type => :string}
|
109
|
+
abstract_adapter.create_table :table_name => 'group', :fields => fields
|
110
|
+
abstract_adapter.insert :table_name => 'group', :values => {:id => 1, :name => 'los iluminados'}
|
111
|
+
abstract_adapter.insert :table_name => 'group', :values => {:id => 2, :name => 'los desulididos'}
|
112
|
+
|
113
|
+
abstract_adapter.drop_table_if_necessary :table_name => 'leader'
|
114
|
+
fields = []
|
115
|
+
fields << {:name => :id, :type => :integer}
|
116
|
+
fields << {:name => :name, :type => :string}
|
117
|
+
fields << {:name => :group_id, :type => :integer}
|
118
|
+
abstract_adapter.create_table :table_name => 'leader', :fields => fields
|
119
|
+
abstract_adapter.insert :table_name => 'leader', :values => {:id => 1, :name => 'orson', :group_id => 1}
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
specify 'should select complex' do
|
125
|
+
|
126
|
+
person = {:name => 'person', :key_for_telephone => 'id', :key_for_person_to_group => 'id'}
|
127
|
+
person_to_group = {:name => 'person_to_group', :relkind => :left_join, :key_for_person => 'person_id', :key_for_group => 'group_id' }
|
128
|
+
group = {:name => 'group', :relkind => :left_join, :key_for_person_to_group => 'id', :key_for_leader => 'id'}
|
129
|
+
telephone = {:name => 'telephone', :relkind => :left_join, :key_for_person => 'person_id'}
|
130
|
+
leader = {:name => 'leader', :relkind => :left_join, :key_for_group => 'group_id'}
|
131
|
+
|
132
|
+
abstract_adapter.select :joins =>
|
133
|
+
[ person =>
|
134
|
+
[ person_to_group => [group => [leader => nil]],
|
135
|
+
telephone => nil
|
136
|
+
]
|
137
|
+
]
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../helper'
|
2
|
+
if $ADAPTER != 'mysql'
|
3
|
+
context 'Abstract Adapter' do
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
abstract_adapter.drop_all_sequences
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
specify 'should create a sequence' do
|
12
|
+
|
13
|
+
assert_nothing_raised do
|
14
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id'
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
specify 'should drop a sequence' do
|
20
|
+
|
21
|
+
assert_nothing_raised do
|
22
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id'
|
23
|
+
abstract_adapter.drop_sequence :sequence_name => 'seq_id'
|
24
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
specify 'should verify if a given sequence exists' do
|
30
|
+
|
31
|
+
assert_equal false, abstract_adapter.sequence_exists?(:sequence_name => 'seq_id')
|
32
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id'
|
33
|
+
assert_equal true, abstract_adapter.sequence_exists?(:sequence_name => 'seq_id')
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
specify 'should list sequences' do
|
38
|
+
|
39
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id'
|
40
|
+
abstract_adapter.create_sequence :sequence_name => 'seq_id2'
|
41
|
+
|
42
|
+
seqs = abstract_adapter.get_sequences
|
43
|
+
assert_equal 2, seqs.length
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|