imparcial 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/History.txt +2 -5
  2. data/Manifest.txt +79 -5
  3. data/README.txt +71 -7
  4. data/Rakefile +1 -1
  5. data/lib/imparcial/driver/abstract/expression/column.rb +313 -0
  6. data/lib/imparcial/driver/abstract/expression/constraint.rb +149 -0
  7. data/lib/imparcial/driver/abstract/expression/delete.rb +88 -0
  8. data/lib/imparcial/driver/abstract/expression/index.rb +206 -0
  9. data/lib/imparcial/driver/abstract/expression/insert.rb +49 -0
  10. data/lib/imparcial/driver/abstract/expression/lock.rb +11 -0
  11. data/lib/imparcial/driver/abstract/expression/record.rb +41 -0
  12. data/lib/imparcial/driver/abstract/expression/select.rb +38 -0
  13. data/lib/imparcial/driver/abstract/expression/sequence.rb +260 -0
  14. data/lib/imparcial/driver/abstract/expression/statement.rb +128 -0
  15. data/lib/imparcial/driver/abstract/expression/table.rb +416 -0
  16. data/lib/imparcial/driver/abstract/expression/transaction.rb +143 -0
  17. data/lib/imparcial/driver/abstract/expression/update.rb +50 -0
  18. data/lib/imparcial/driver/abstract/expression.rb +23 -0
  19. data/lib/imparcial/driver/abstract/result.rb +95 -0
  20. data/lib/imparcial/driver/abstract/sql/column.rb +103 -0
  21. data/lib/imparcial/driver/abstract/sql/constraint.rb +42 -0
  22. data/lib/imparcial/driver/abstract/sql/delete.rb +22 -0
  23. data/lib/imparcial/driver/abstract/sql/index.rb +45 -0
  24. data/lib/imparcial/driver/abstract/sql/insert.rb +63 -0
  25. data/lib/imparcial/driver/abstract/sql/record.rb +19 -0
  26. data/lib/imparcial/driver/abstract/sql/select.rb +101 -0
  27. data/lib/imparcial/driver/abstract/sql/sequence.rb +55 -0
  28. data/lib/imparcial/driver/abstract/sql/table.rb +42 -0
  29. data/lib/imparcial/driver/abstract/sql/transaction.rb +43 -0
  30. data/lib/imparcial/driver/abstract/sql/update.rb +29 -0
  31. data/lib/imparcial/driver/abstract/sql.rb +21 -0
  32. data/lib/imparcial/driver/abstract/typemap.rb +168 -0
  33. data/lib/imparcial/driver/abstract/util.rb +53 -0
  34. data/lib/imparcial/driver/abstract.rb +255 -0
  35. data/lib/imparcial/driver/mysql/expression/table.rb +17 -0
  36. data/lib/imparcial/driver/mysql/expression.rb +11 -0
  37. data/lib/imparcial/driver/mysql/result.rb +33 -0
  38. data/lib/imparcial/driver/mysql/sql/column.rb +59 -0
  39. data/lib/imparcial/driver/mysql/sql/constraint.rb +39 -0
  40. data/lib/imparcial/driver/mysql/sql/index.rb +42 -0
  41. data/lib/imparcial/driver/mysql/sql/sequence.rb +39 -0
  42. data/lib/imparcial/driver/mysql/sql/table.rb +67 -0
  43. data/lib/imparcial/driver/mysql/sql.rb +15 -0
  44. data/lib/imparcial/driver/mysql/typemap.rb +13 -0
  45. data/lib/imparcial/driver/mysql/util.rb +13 -0
  46. data/lib/imparcial/driver/mysql.rb +49 -0
  47. data/lib/imparcial/driver/postgre/expression.rb +32 -0
  48. data/lib/imparcial/driver/postgre/result.rb +35 -0
  49. data/lib/imparcial/driver/postgre/sql/column.rb +53 -0
  50. data/lib/imparcial/driver/postgre/sql/constraint.rb +37 -0
  51. data/lib/imparcial/driver/postgre/sql/index.rb +53 -0
  52. data/lib/imparcial/driver/postgre/sql/sequence.rb +30 -0
  53. data/lib/imparcial/driver/postgre/sql/table.rb +46 -0
  54. data/lib/imparcial/driver/postgre/sql.rb +15 -0
  55. data/lib/imparcial/driver/postgre/typemap.rb +36 -0
  56. data/lib/imparcial/driver/postgre/util.rb +19 -0
  57. data/lib/imparcial/driver/postgre.rb +43 -0
  58. data/lib/imparcial/driver.rb +1 -0
  59. data/lib/imparcial/exception.rb +71 -0
  60. data/lib/imparcial/extension.rb +90 -0
  61. data/lib/imparcial/initializer.rb +30 -0
  62. data/lib/imparcial.rb +1 -1
  63. data/test/unit/base/common/tc_quote.rb +30 -0
  64. data/test/unit/base/expression/tc_column.rb +84 -0
  65. data/test/unit/base/expression/tc_constraint.rb +39 -0
  66. data/test/unit/base/expression/tc_delete.rb +51 -0
  67. data/test/unit/base/expression/tc_index.rb +43 -0
  68. data/test/unit/base/expression/tc_insert.rb +44 -0
  69. data/test/unit/base/expression/tc_select.rb +142 -0
  70. data/test/unit/base/expression/tc_sequence.rb +48 -0
  71. data/test/unit/base/expression/tc_table.rb +68 -0
  72. data/test/unit/base/expression/tc_table_diff.rb +41 -0
  73. data/test/unit/base/expression/tc_transaction.rb +46 -0
  74. data/test/unit/base/expression/tc_update.rb +29 -0
  75. data/test/unit/base/statement/tc_conditions.rb +84 -0
  76. data/test/unit/base/statement/tc_limit.rb +25 -0
  77. data/test/unit/base/statement/tc_order.rb +25 -0
  78. data/test/unit/helper.rb +64 -0
  79. data/test/unit/mysql/tc_sequence.rb +41 -0
  80. 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
@@ -11,6 +11,6 @@ require 'imparcial/initializer'
11
11
 
12
12
  module Imparcial
13
13
 
14
- VERSION = '0.0.4'
14
+ VERSION = '0.0.5'
15
15
 
16
16
  end
@@ -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