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.
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