imparcial 0.0.4 → 0.0.5
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/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
|