dbagile 0.0.1
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/LICENCE.textile +12 -0
- data/README.textile +89 -0
- data/bin/dba +22 -0
- data/lib/dbagile/adapter/sequel/class_methods.rb +18 -0
- data/lib/dbagile/adapter/sequel/connection.rb +38 -0
- data/lib/dbagile/adapter/sequel/data/table_driven.rb +30 -0
- data/lib/dbagile/adapter/sequel/data/transaction_driven.rb +43 -0
- data/lib/dbagile/adapter/sequel/schema/concrete_script.rb +135 -0
- data/lib/dbagile/adapter/sequel/schema/physical_dump.rb +106 -0
- data/lib/dbagile/adapter/sequel/schema/schema2sequel_args.rb +71 -0
- data/lib/dbagile/adapter/sequel/schema/table_driven.rb +52 -0
- data/lib/dbagile/adapter/sequel/schema/transaction_driven.rb +46 -0
- data/lib/dbagile/adapter/sequel/sequel_tracer.rb +144 -0
- data/lib/dbagile/adapter/sequel.rb +46 -0
- data/lib/dbagile/adapter.rb +15 -0
- data/lib/dbagile/command/api.rb +49 -0
- data/lib/dbagile/command/bulk/commons.rb +130 -0
- data/lib/dbagile/command/bulk/export.rb +99 -0
- data/lib/dbagile/command/bulk/import.rb +147 -0
- data/lib/dbagile/command/bulk.rb +3 -0
- data/lib/dbagile/command/class_methods.rb +103 -0
- data/lib/dbagile/command/db/add.rb +94 -0
- data/lib/dbagile/command/db/list.rb +40 -0
- data/lib/dbagile/command/db/ping.rb +49 -0
- data/lib/dbagile/command/db/rm.rb +52 -0
- data/lib/dbagile/command/db/stage.rb +81 -0
- data/lib/dbagile/command/db/use.rb +48 -0
- data/lib/dbagile/command/db.rb +6 -0
- data/lib/dbagile/command/dba.rb +121 -0
- data/lib/dbagile/command/help.rb +50 -0
- data/lib/dbagile/command/repo/create.rb +54 -0
- data/lib/dbagile/command/repo.rb +1 -0
- data/lib/dbagile/command/robust.rb +86 -0
- data/lib/dbagile/command/schema/check.rb +59 -0
- data/lib/dbagile/command/schema/commons.rb +118 -0
- data/lib/dbagile/command/schema/diff.rb +101 -0
- data/lib/dbagile/command/schema/dump.rb +48 -0
- data/lib/dbagile/command/schema/merge.rb +55 -0
- data/lib/dbagile/command/schema/sql_script.rb +124 -0
- data/lib/dbagile/command/schema.rb +6 -0
- data/lib/dbagile/command/sql/drop.rb +40 -0
- data/lib/dbagile/command/sql/heading.rb +34 -0
- data/lib/dbagile/command/sql/send.rb +67 -0
- data/lib/dbagile/command/sql/show.rb +42 -0
- data/lib/dbagile/command/sql.rb +4 -0
- data/lib/dbagile/command/web/tools.rb +23 -0
- data/lib/dbagile/command/web.rb +1 -0
- data/lib/dbagile/command.rb +158 -0
- data/lib/dbagile/contract/connection.rb +66 -0
- data/lib/dbagile/contract/data/dataset.rb +69 -0
- data/lib/dbagile/contract/data/table_driven.rb +49 -0
- data/lib/dbagile/contract/data/transaction_driven.rb +74 -0
- data/lib/dbagile/contract/data.rb +3 -0
- data/lib/dbagile/contract/robust/helpers.rb +19 -0
- data/lib/dbagile/contract/robust/optimistic/data/table_driven.rb +31 -0
- data/lib/dbagile/contract/robust/optimistic/data/transaction_driven.rb +45 -0
- data/lib/dbagile/contract/robust/optimistic/schema/table_driven.rb +53 -0
- data/lib/dbagile/contract/robust/optimistic/schema/transaction_driven.rb +45 -0
- data/lib/dbagile/contract/robust/optimistic.rb +18 -0
- data/lib/dbagile/contract/robust.rb +20 -0
- data/lib/dbagile/contract/schema/table_driven.rb +89 -0
- data/lib/dbagile/contract/schema/transaction_driven.rb +68 -0
- data/lib/dbagile/contract/schema.rb +2 -0
- data/lib/dbagile/contract/utils/delegate.rb +17 -0
- data/lib/dbagile/contract/utils/full.rb +13 -0
- data/lib/dbagile/contract/utils.rb +2 -0
- data/lib/dbagile/contract.rb +5 -0
- data/lib/dbagile/core/chain.rb +92 -0
- data/lib/dbagile/core/connection.rb +51 -0
- data/lib/dbagile/core/database.rb +221 -0
- data/lib/dbagile/core/io/dsl.rb +95 -0
- data/lib/dbagile/core/io/robustness.rb +82 -0
- data/lib/dbagile/core/io.rb +2 -0
- data/lib/dbagile/core/repository/builder.rb +67 -0
- data/lib/dbagile/core/repository/yaml_methods.rb +82 -0
- data/lib/dbagile/core/repository.rb +211 -0
- data/lib/dbagile/core/schema/builder/coercion.rb +210 -0
- data/lib/dbagile/core/schema/builder/concept_factory.rb +61 -0
- data/lib/dbagile/core/schema/builder.rb +187 -0
- data/lib/dbagile/core/schema/composite.rb +239 -0
- data/lib/dbagile/core/schema/computations/filter.rb +40 -0
- data/lib/dbagile/core/schema/computations/merge.rb +55 -0
- data/lib/dbagile/core/schema/computations/minus.rb +44 -0
- data/lib/dbagile/core/schema/computations/split.rb +37 -0
- data/lib/dbagile/core/schema/computations.rb +4 -0
- data/lib/dbagile/core/schema/database_schema.rb +129 -0
- data/lib/dbagile/core/schema/errors.rb +173 -0
- data/lib/dbagile/core/schema/logical/attribute.rb +68 -0
- data/lib/dbagile/core/schema/logical/constraint/candidate_key.rb +70 -0
- data/lib/dbagile/core/schema/logical/constraint/foreign_key.rb +121 -0
- data/lib/dbagile/core/schema/logical/constraint.rb +58 -0
- data/lib/dbagile/core/schema/logical/constraints.rb +28 -0
- data/lib/dbagile/core/schema/logical/heading.rb +47 -0
- data/lib/dbagile/core/schema/logical/relvar.rb +81 -0
- data/lib/dbagile/core/schema/logical.rb +24 -0
- data/lib/dbagile/core/schema/migrate/abstract_script.rb +35 -0
- data/lib/dbagile/core/schema/migrate/collapse_table.rb +15 -0
- data/lib/dbagile/core/schema/migrate/create_table.rb +15 -0
- data/lib/dbagile/core/schema/migrate/drop_table.rb +15 -0
- data/lib/dbagile/core/schema/migrate/expand_table.rb +15 -0
- data/lib/dbagile/core/schema/migrate/operation.rb +141 -0
- data/lib/dbagile/core/schema/migrate/stager.rb +282 -0
- data/lib/dbagile/core/schema/migrate.rb +2 -0
- data/lib/dbagile/core/schema/part.rb +114 -0
- data/lib/dbagile/core/schema/physical/index.rb +64 -0
- data/lib/dbagile/core/schema/physical/indexes.rb +12 -0
- data/lib/dbagile/core/schema/physical.rb +26 -0
- data/lib/dbagile/core/schema/robustness.rb +39 -0
- data/lib/dbagile/core/schema/schema_object.rb +94 -0
- data/lib/dbagile/core/schema.rb +254 -0
- data/lib/dbagile/core/transaction.rb +74 -0
- data/lib/dbagile/core.rb +7 -0
- data/lib/dbagile/environment/buffering.rb +45 -0
- data/lib/dbagile/environment/delegator.rb +59 -0
- data/lib/dbagile/environment/interactions.rb +208 -0
- data/lib/dbagile/environment/on_error.rb +47 -0
- data/lib/dbagile/environment/repository.rb +161 -0
- data/lib/dbagile/environment/robustness.rb +7 -0
- data/lib/dbagile/environment/testing.rb +23 -0
- data/lib/dbagile/environment.rb +122 -0
- data/lib/dbagile/errors.rb +30 -0
- data/lib/dbagile/io/csv.rb +99 -0
- data/lib/dbagile/io/json.rb +41 -0
- data/lib/dbagile/io/pretty_table.rb +128 -0
- data/lib/dbagile/io/ruby.rb +62 -0
- data/lib/dbagile/io/text.rb +18 -0
- data/lib/dbagile/io/type_safe.rb +65 -0
- data/lib/dbagile/io/xml.rb +35 -0
- data/lib/dbagile/io/yaml.rb +30 -0
- data/lib/dbagile/io.rb +94 -0
- data/lib/dbagile/loader.rb +16 -0
- data/lib/dbagile/plugin.rb +29 -0
- data/lib/dbagile/restful/client/delete.rb +22 -0
- data/lib/dbagile/restful/client/get.rb +24 -0
- data/lib/dbagile/restful/client/post.rb +22 -0
- data/lib/dbagile/restful/client/utils.rb +16 -0
- data/lib/dbagile/restful/client.rb +41 -0
- data/lib/dbagile/restful/middleware/delete.rb +22 -0
- data/lib/dbagile/restful/middleware/get.rb +27 -0
- data/lib/dbagile/restful/middleware/one_database.rb +82 -0
- data/lib/dbagile/restful/middleware/post.rb +23 -0
- data/lib/dbagile/restful/middleware/utils.rb +65 -0
- data/lib/dbagile/restful/middleware.rb +54 -0
- data/lib/dbagile/restful/server.rb +65 -0
- data/lib/dbagile/restful.rb +9 -0
- data/lib/dbagile/robustness/dependencies.rb +36 -0
- data/lib/dbagile/robustness/file_system.rb +53 -0
- data/lib/dbagile/robustness.rb +14 -0
- data/lib/dbagile/tools/file_system.rb +24 -0
- data/lib/dbagile/tools/math.rb +11 -0
- data/lib/dbagile/tools/ordered_hash.rb +39 -0
- data/lib/dbagile/tools/ruby.rb +78 -0
- data/lib/dbagile/tools/string.rb +6 -0
- data/lib/dbagile/tools/tuple.rb +49 -0
- data/lib/dbagile/tools.rb +6 -0
- data/lib/dbagile.rb +66 -0
- data/test/assumptions/equality.spec +11 -0
- data/test/assumptions/fixtures.rb +39 -0
- data/test/assumptions/inheritance.spec +17 -0
- data/test/assumptions/sequel/autonumber.spec +19 -0
- data/test/assumptions/sequel/connect.spec +29 -0
- data/test/assumptions/sequel/test.db +0 -0
- data/test/assumptions/stdlib/pathname.spec +13 -0
- data/test/assumptions/yaml/fixtures.rb +25 -0
- data/test/assumptions/yaml/to_yaml.spec +10 -0
- data/test/assumptions.spec +2 -0
- data/test/commands/bulk/export.spec +100 -0
- data/test/commands/bulk/import.spec +49 -0
- data/test/commands/db/add.spec +31 -0
- data/test/commands/db/list.spec +29 -0
- data/test/commands/db/ping.spec +21 -0
- data/test/commands/db/rm.spec +18 -0
- data/test/commands/db/use.spec +18 -0
- data/test/commands/dba.spec +54 -0
- data/test/commands/repo/create.spec +30 -0
- data/test/commands/schema/check.spec +25 -0
- data/test/commands/schema/diff.spec +30 -0
- data/test/commands/schema/dump.spec +23 -0
- data/test/commands/schema/fixtures/add_constraint.yaml +30 -0
- data/test/commands/schema/fixtures/announced.yaml +28 -0
- data/test/commands/schema/fixtures/effective.yaml +20 -0
- data/test/commands/schema/fixtures/invalid.yaml +6 -0
- data/test/commands/schema/sql_script.spec +56 -0
- data/test/commands/sql/drop.spec +25 -0
- data/test/commands/sql/heading.spec +7 -0
- data/test/commands/sql/scripts/delete.sql +1 -0
- data/test/commands/sql/scripts/insert.sql +2 -0
- data/test/commands/sql/send.spec +29 -0
- data/test/commands/sql/show.spec +17 -0
- data/test/commands.spec +138 -0
- data/test/contract/connection/transaction.ex +11 -0
- data/test/contract/connection.spec +9 -0
- data/test/contract/data/dataset/columns.ex +5 -0
- data/test/contract/data/dataset/count.ex +5 -0
- data/test/contract/data/dataset.spec +9 -0
- data/test/contract/data/table_driven/dataset.ex +31 -0
- data/test/contract/data/table_driven/exists_q.ex +27 -0
- data/test/contract/data/table_driven.spec +9 -0
- data/test/contract/data/transaction_driven/delete.ex +29 -0
- data/test/contract/data/transaction_driven/direct_sql.ex +19 -0
- data/test/contract/data/transaction_driven/insert.ex +8 -0
- data/test/contract/data/transaction_driven/update.ex +19 -0
- data/test/contract/data/transaction_driven.spec +18 -0
- data/test/contract/robust/data/table_driven.spec +15 -0
- data/test/contract/robust/data/transaction_driven.spec +21 -0
- data/test/contract/robust/schema/table_driven.spec +21 -0
- data/test/contract/robust/schema/transaction_driven.spec +19 -0
- data/test/contract/schema/table_driven/column_names.ex +5 -0
- data/test/contract/schema/table_driven/has_column_q.ex +13 -0
- data/test/contract/schema/table_driven/has_table_q.ex +11 -0
- data/test/contract/schema/table_driven/heading.ex +5 -0
- data/test/contract/schema/table_driven.spec +9 -0
- data/test/contract/schema/transaction_driven/create_table.ex +10 -0
- data/test/contract/schema/transaction_driven/drop_table.ex +10 -0
- data/test/contract/schema/transaction_driven.spec +18 -0
- data/test/contract.spec +66 -0
- data/test/fixtures/basics/data/basic_values.rb +13 -0
- data/test/fixtures/basics/data/empty_table.rb +3 -0
- data/test/fixtures/basics/data/non_empty_table.rb +4 -0
- data/test/fixtures/basics/data/parts.rb +8 -0
- data/test/fixtures/basics/data/suppliers.rb +7 -0
- data/test/fixtures/basics/data/supplies.rb +14 -0
- data/test/fixtures/basics/dbagile.idx +20 -0
- data/test/fixtures/basics/fixtures.yaml +28 -0
- data/test/fixtures/basics/robust.db +0 -0
- data/test/fixtures/basics/suppliers.yaml +30 -0
- data/test/fixtures/basics/test.db +0 -0
- data/test/fixtures/empty/dbagile.idx +5 -0
- data/test/fixtures.rb +152 -0
- data/test/restful/delete/no_format.ex +32 -0
- data/test/restful/delete.spec +8 -0
- data/test/restful/get/csv_format.ex +12 -0
- data/test/restful/get/json_format.ex +19 -0
- data/test/restful/get/query_string.ex +11 -0
- data/test/restful/get/text_format.ex +12 -0
- data/test/restful/get/yaml_format.ex +14 -0
- data/test/restful/get.spec +5 -0
- data/test/restful/post/no_format.ex +22 -0
- data/test/restful/post.spec +8 -0
- data/test/restful.spec +32 -0
- data/test/run_all_suite.rb +51 -0
- data/test/spec_helper.rb +26 -0
- data/test/support/be_a_valid_json_string.rb +19 -0
- data/test/support/be_a_valid_yaml_string.rb +18 -0
- data/test/unit/adapter/factor.spec +13 -0
- data/test/unit/adapter/sequel/new.spec +19 -0
- data/test/unit/command/api.spec +12 -0
- data/test/unit/command/command_for.spec +36 -0
- data/test/unit/command/command_name_of.spec +21 -0
- data/test/unit/command/ruby_method_for.spec +21 -0
- data/test/unit/command/sanity.spec +34 -0
- data/test/unit/contract/utils/delegate/delegate.spec +23 -0
- data/test/unit/core/chain/chain.spec +57 -0
- data/test/unit/core/chain/connect.spec +22 -0
- data/test/unit/core/chain/delegate_chain.spec +16 -0
- data/test/unit/core/chain/initialize.spec +19 -0
- data/test/unit/core/chain/plug.spec +31 -0
- data/test/unit/core/io/dsl/scope.spec +9 -0
- data/test/unit/core/repository/create_bang.spec +31 -0
- data/test/unit/core/repository/current.spec +31 -0
- data/test/unit/core/repository/database.spec +47 -0
- data/test/unit/core/repository/fixtures/corrupted/dbagile.idx +1 -0
- data/test/unit/core/repository/fixtures/test_and_prod/dbagile.idx +21 -0
- data/test/unit/core/repository/fixtures.rb +25 -0
- data/test/unit/core/repository/has_database_q.spec +16 -0
- data/test/unit/core/repository/load.spec +51 -0
- data/test/unit/core/repository/to_yaml.spec +17 -0
- data/test/unit/core/schema/check.spec +32 -0
- data/test/unit/core/schema/empty_q.spec +18 -0
- data/test/unit/core/schema/filter.spec +42 -0
- data/test/unit/core/schema/fixtures/dbagile.yaml +7 -0
- data/test/unit/core/schema/fixtures/empty.yaml +11 -0
- data/test/unit/core/schema/fixtures/invalid.yaml +54 -0
- data/test/unit/core/schema/fixtures/left.yaml +46 -0
- data/test/unit/core/schema/fixtures/left_minus_right.yaml +31 -0
- data/test/unit/core/schema/fixtures/right.yaml +46 -0
- data/test/unit/core/schema/fixtures/right_minus_left.yaml +31 -0
- data/test/unit/core/schema/fixtures/suppliers_and_parts.yaml +30 -0
- data/test/unit/core/schema/fixtures.rb +32 -0
- data/test/unit/core/schema/merge.spec +72 -0
- data/test/unit/core/schema/minus.spec +26 -0
- data/test/unit/core/schema/sanity.spec +39 -0
- data/test/unit/core/schema/split.spec +58 -0
- data/test/unit/core/schema/stage_script.spec +26 -0
- data/test/unit/core/schema/to_yaml.spec +13 -0
- data/test/unit/core/schema/yaml_display.spec +14 -0
- data/test/unit/core/schema/yaml_load.spec +20 -0
- data/test/unit/core/transaction/transaction.spec +10 -0
- data/test/unit/fixtures.rb +67 -0
- data/test/unit/io/to_xxx.spec +52 -0
- data/test/unit/plugin/options.spec +21 -0
- data/test/unit/plugin/tuple_heading.spec +11 -0
- data/test/unit/plugin/with_options.spec +12 -0
- data/test/unit/tools/ruby/class_unqualified_name.spec +26 -0
- data/test/unit/tools/ruby/extract_file_rdoc.spec +10 -0
- data/test/unit/tools/ruby/fixtures/rdoc.txt +12 -0
- data/test/unit/tools/ruby/fixtures.rb +19 -0
- data/test/unit/tools/ruby/optional_args_block_call.spec +35 -0
- data/test/unit/tools/ruby/parent_module.spec +21 -0
- data/test/unit/tools/ruby/rdoc_file_paragraphs.spec +13 -0
- data/test/unit/tools/tuple/tuple_heading.spec +11 -0
- data/test/unit/tools/tuple/tuple_key.spec +27 -0
- data/test/unit/tools/tuple/tuple_project.spec +23 -0
- data/test/unit.spec +3 -0
- metadata +422 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Robust
|
|
4
|
+
class Optimistic
|
|
5
|
+
module Schema
|
|
6
|
+
module TableDriven
|
|
7
|
+
|
|
8
|
+
# @see DbAgile::Contract::Schema::TableDriven#has_column?
|
|
9
|
+
def has_column?(*args, &block)
|
|
10
|
+
delegate.has_column?(*args, &block)
|
|
11
|
+
rescue
|
|
12
|
+
has_table!(args[0])
|
|
13
|
+
raise
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @see DbAgile::Contract::Schema::TableDriven#heading
|
|
17
|
+
def heading(*args, &block)
|
|
18
|
+
delegate.heading(*args, &block)
|
|
19
|
+
rescue
|
|
20
|
+
has_table!(args[0])
|
|
21
|
+
raise
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @see DbAgile::Contract::Schema::TableDriven#column_names
|
|
25
|
+
def column_names(*args, &block)
|
|
26
|
+
delegate.column_names(*args, &block)
|
|
27
|
+
rescue
|
|
28
|
+
has_table!(args[0])
|
|
29
|
+
raise
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @see DbAgile::Contract::Schema::TableDriven#is_key
|
|
33
|
+
def is_key?(*args, &block)
|
|
34
|
+
delegate.is_key?(*args, &block)
|
|
35
|
+
rescue
|
|
36
|
+
has_table!(args[0])
|
|
37
|
+
raise
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @see DbAgile::Contract::Schema::TableDriven#keys
|
|
41
|
+
def keys(*args, &block)
|
|
42
|
+
delegate.keys(*args, &block)
|
|
43
|
+
rescue
|
|
44
|
+
has_table!(args[0])
|
|
45
|
+
raise
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end # module Schema
|
|
49
|
+
end # module Data
|
|
50
|
+
end # class Optimistic
|
|
51
|
+
end # module Robust
|
|
52
|
+
end # module Contract
|
|
53
|
+
end # module DbAgile
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Robust
|
|
4
|
+
class Optimistic
|
|
5
|
+
module Schema
|
|
6
|
+
module TransactionDriven
|
|
7
|
+
|
|
8
|
+
# @see DbAgile::Contract::Schema::TransactionDriven#create_table
|
|
9
|
+
def create_table(*args, &block)
|
|
10
|
+
delegate.create_table(*args, &block)
|
|
11
|
+
rescue
|
|
12
|
+
not_has_table!(args[1])
|
|
13
|
+
raise
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @see DbAgile::Contract::Schema::TransactionDriven#drop_table
|
|
17
|
+
def drop_table(*args, &block)
|
|
18
|
+
delegate.drop_table(*args, &block)
|
|
19
|
+
rescue
|
|
20
|
+
has_table!(args[1])
|
|
21
|
+
raise
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @see DbAgile::Contract::Schema::TransactionDriven#add_columns
|
|
25
|
+
def add_columns(*args, &block)
|
|
26
|
+
delegate.add_columns(*args, &block)
|
|
27
|
+
rescue
|
|
28
|
+
has_table!(args[1])
|
|
29
|
+
raise
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @see DbAgile::Contract::Schema::TransactionDriven#key!
|
|
33
|
+
def key!(*args, &block)
|
|
34
|
+
delegate.key!(*args, &block)
|
|
35
|
+
rescue
|
|
36
|
+
has_table!(args[1])
|
|
37
|
+
raise
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end # module TransactionDriven
|
|
41
|
+
end # module Schema
|
|
42
|
+
end # class Optimistic
|
|
43
|
+
end # module Robust
|
|
44
|
+
end # module Contract
|
|
45
|
+
end # module DbAgile
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'dbagile/contract/robust/optimistic/data/table_driven'
|
|
2
|
+
require 'dbagile/contract/robust/optimistic/data/transaction_driven'
|
|
3
|
+
require 'dbagile/contract/robust/optimistic/schema/table_driven'
|
|
4
|
+
require 'dbagile/contract/robust/optimistic/schema/transaction_driven'
|
|
5
|
+
module DbAgile
|
|
6
|
+
module Contract
|
|
7
|
+
module Robust
|
|
8
|
+
class Optimistic
|
|
9
|
+
include DbAgile::Contract::Utils::Delegate
|
|
10
|
+
include DbAgile::Contract::Robust::Helpers
|
|
11
|
+
include DbAgile::Contract::Robust::Optimistic::Data::TableDriven
|
|
12
|
+
include DbAgile::Contract::Robust::Optimistic::Data::TransactionDriven
|
|
13
|
+
include DbAgile::Contract::Robust::Optimistic::Schema::TableDriven
|
|
14
|
+
include DbAgile::Contract::Robust::Optimistic::Schema::TransactionDriven
|
|
15
|
+
end # class Optimistic
|
|
16
|
+
end # module Robust
|
|
17
|
+
end # module Contract
|
|
18
|
+
end # module DbAgile
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
|
|
3
|
+
# All errors related to the contract
|
|
4
|
+
class ContractError < DbAgile::Error; end
|
|
5
|
+
|
|
6
|
+
# Raised when a table should not exists but does
|
|
7
|
+
class TableAlreadyExistsError < ContractError; end
|
|
8
|
+
|
|
9
|
+
# Raised when possible when a table does not exists
|
|
10
|
+
class NoSuchTableError < ContractError; end
|
|
11
|
+
|
|
12
|
+
# Raised when a key is violated
|
|
13
|
+
class KeyViolationError < ContractError; end
|
|
14
|
+
|
|
15
|
+
# Internal error used when transaction are aborted
|
|
16
|
+
class AbordTransactionError < ContractError; end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
require 'dbagile/contract/robust/helpers'
|
|
20
|
+
require 'dbagile/contract/robust/optimistic'
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Schema
|
|
4
|
+
#
|
|
5
|
+
# Table-driven adapter read-only methods about schemas.
|
|
6
|
+
#
|
|
7
|
+
module TableDriven
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Returns true if a given table exists in the database, false otherwise.
|
|
11
|
+
#
|
|
12
|
+
# @param [Symbol] table_name name of a table
|
|
13
|
+
# @return true if the table exists, false otherwise
|
|
14
|
+
#
|
|
15
|
+
def has_table?(table_name)
|
|
16
|
+
Kernel.raise NotImplementedError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Returns true if a column exists, false otherwise.
|
|
21
|
+
#
|
|
22
|
+
# A default implementation is provided that relies on column_names.
|
|
23
|
+
#
|
|
24
|
+
# @param [Symbol] table_name the name of a table
|
|
25
|
+
# @param [Symbol] column_name the name of a column
|
|
26
|
+
# @return true if the column exists on that table, false otherwise
|
|
27
|
+
#
|
|
28
|
+
# @pre [table_name] the table must exist
|
|
29
|
+
#
|
|
30
|
+
def has_column?(table_name, column_name)
|
|
31
|
+
column_names(table_name).include?(column_name)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# Returns the heading of a given table.
|
|
36
|
+
#
|
|
37
|
+
# @param [Symbol] table_name the name of a table
|
|
38
|
+
# @return [Hash<Symbol => Class>] table heading
|
|
39
|
+
#
|
|
40
|
+
# @pre [table_name] the table must exist
|
|
41
|
+
#
|
|
42
|
+
def heading(table_name)
|
|
43
|
+
Kernel.raise NotImplementedError
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Returns the list of column names for a given table.
|
|
48
|
+
#
|
|
49
|
+
# @param [Symbol] table_name the name of a table
|
|
50
|
+
# @param [Boolean] sort sort column by names?
|
|
51
|
+
# @return [Array<Symbol>] column names
|
|
52
|
+
#
|
|
53
|
+
# @pre [table_name] the table must exist
|
|
54
|
+
#
|
|
55
|
+
def column_names(table_name, sort = false)
|
|
56
|
+
Kernel.raise NotImplementedError
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# Checks if an array of column names for a key for a given table.
|
|
61
|
+
#
|
|
62
|
+
# @param [Symbol] table_name the name of a table
|
|
63
|
+
# @param [Array<Symbol>] columns column names, in any order
|
|
64
|
+
# @return [Boolean] true if the table contains such a unique key,
|
|
65
|
+
# false otherwise
|
|
66
|
+
#
|
|
67
|
+
# @pre [table_name] the table must exist
|
|
68
|
+
#
|
|
69
|
+
def is_key?(table_name, columns)
|
|
70
|
+
keys(table_name).include?(columns)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
#
|
|
74
|
+
# Returns available keys for a given table as an array of column
|
|
75
|
+
# names.
|
|
76
|
+
#
|
|
77
|
+
# @param [Symbol] table_name the name of a table
|
|
78
|
+
# @return [Array<Array<Symbol>>] keys of the table
|
|
79
|
+
#
|
|
80
|
+
# @pre [table_name] the table must exist
|
|
81
|
+
#
|
|
82
|
+
def keys(table_name)
|
|
83
|
+
Kernel.raise NotImplementedError
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end # module TableDriven
|
|
87
|
+
end # module Schema
|
|
88
|
+
end # module Contract
|
|
89
|
+
end # module DbAgile
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Schema
|
|
4
|
+
module TransactionDriven
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Creates a table with some columns.
|
|
8
|
+
#
|
|
9
|
+
# @param [DbAgile::Core::Transaction] transaction the current transaction
|
|
10
|
+
# @param [Symbol] table_name the name of a table
|
|
11
|
+
# @param [Hash] a table heading
|
|
12
|
+
# @return [Hash] the actual table heading that has been created
|
|
13
|
+
#
|
|
14
|
+
# @pre [table_name] the table must not exist
|
|
15
|
+
#
|
|
16
|
+
def create_table(transaction, table_name, columns)
|
|
17
|
+
Kernel.raise NotImplementedError
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Drops a table
|
|
22
|
+
#
|
|
23
|
+
# @param [DbAgile::Core::Transaction] transaction the current transaction
|
|
24
|
+
# @param [Symbol] table_name the name of a table
|
|
25
|
+
# @return [Boolean] true to indicate that everything is fine
|
|
26
|
+
#
|
|
27
|
+
# @pre [table_name] the table must not exist
|
|
28
|
+
#
|
|
29
|
+
def drop_table(transaction, table_name)
|
|
30
|
+
Kernel.raise NotImplementedError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Adds some columns to a table
|
|
35
|
+
#
|
|
36
|
+
# @param [DbAgile::Core::Transaction] transaction the current transaction
|
|
37
|
+
# @param [Symbol] table_name the name of a table
|
|
38
|
+
# @param [Hash] columns column definitions
|
|
39
|
+
# @return [Boolean] true to indicate that everything is fine
|
|
40
|
+
#
|
|
41
|
+
# @pre [table_name] the table must not exist
|
|
42
|
+
# @pre [columns] the table may not contain any of the columns
|
|
43
|
+
# @post the table has gained the additional columns
|
|
44
|
+
#
|
|
45
|
+
def add_columns(transaction, table_name, columns)
|
|
46
|
+
Kernel.raise NotImplementedError
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Make columns be a candidate key for the table.
|
|
51
|
+
#
|
|
52
|
+
# @param [DbAgile::Core::Transaction] transaction the current transaction
|
|
53
|
+
# @param [Symbol] table_name the name of a table
|
|
54
|
+
# @param [Array<Symbol>] columns column names
|
|
55
|
+
# @return [Boolean] true to indicate that everything is fine
|
|
56
|
+
#
|
|
57
|
+
# @pre [table_name] the table must not exist
|
|
58
|
+
# @pre [columns] the table must have all columns
|
|
59
|
+
# @post the table has gained the candidate key
|
|
60
|
+
#
|
|
61
|
+
def key!(transaction, table_name, columns)
|
|
62
|
+
Kernel.raise NotImplementedError
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end # module TransactionDriven
|
|
66
|
+
end # module Schema
|
|
67
|
+
end # module Contract
|
|
68
|
+
end # module DbAgile
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Utils
|
|
4
|
+
module Delegate
|
|
5
|
+
|
|
6
|
+
DbAgile::Contract::Utils::Full.instance_methods(true).each do |meth|
|
|
7
|
+
module_eval <<-EOF
|
|
8
|
+
def #{meth}(*args, &block)
|
|
9
|
+
delegate.#{meth}(*args, &block)
|
|
10
|
+
end
|
|
11
|
+
EOF
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end # module Delegate
|
|
15
|
+
end # module Utils
|
|
16
|
+
end # module Contract
|
|
17
|
+
end # module DbAgile
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Contract
|
|
3
|
+
module Utils
|
|
4
|
+
module Full
|
|
5
|
+
include DbAgile::Contract::Connection
|
|
6
|
+
include DbAgile::Contract::Data::TableDriven
|
|
7
|
+
include DbAgile::Contract::Data::TransactionDriven
|
|
8
|
+
include DbAgile::Contract::Schema::TableDriven
|
|
9
|
+
include DbAgile::Contract::Schema::TransactionDriven
|
|
10
|
+
end # module Full
|
|
11
|
+
end # module Utils
|
|
12
|
+
end # module Contract
|
|
13
|
+
end # module DbAgile
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'delegate'
|
|
2
|
+
require 'enumerator'
|
|
3
|
+
module DbAgile
|
|
4
|
+
module Core
|
|
5
|
+
class Chain
|
|
6
|
+
|
|
7
|
+
# A participant in the chain
|
|
8
|
+
module Participant
|
|
9
|
+
def __getobj__() @__delegate__ end
|
|
10
|
+
alias :delegate :__getobj__
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Returns the delegator chain
|
|
14
|
+
attr_reader :delegate_chain
|
|
15
|
+
|
|
16
|
+
# Creates a chain instance. Shortcut for Chain.new(*args)
|
|
17
|
+
def self.[](*args)
|
|
18
|
+
Chain.new(*args)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Creates an empty chain
|
|
22
|
+
def initialize(*chain)
|
|
23
|
+
@delegate_chain = []
|
|
24
|
+
plug(*chain) unless chain.empty?
|
|
25
|
+
__install_chain__
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Handles the magic of delegation through \_\_getobj\_\_.
|
|
29
|
+
def method_missing(m, *args, &block)
|
|
30
|
+
target = self.__getobj__
|
|
31
|
+
unless target.respond_to?(m)
|
|
32
|
+
super
|
|
33
|
+
end
|
|
34
|
+
target.__send__(m, *args, &block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Builds some participants
|
|
38
|
+
def __build_participants__(args)
|
|
39
|
+
delegates = []
|
|
40
|
+
until args.empty?
|
|
41
|
+
case arg = args.shift
|
|
42
|
+
when Class
|
|
43
|
+
mod_args = []
|
|
44
|
+
until args.empty? or args[0].kind_of?(Module)
|
|
45
|
+
mod_args << args.shift
|
|
46
|
+
end
|
|
47
|
+
delegates << arg.new(*mod_args)
|
|
48
|
+
else
|
|
49
|
+
delegates << arg
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
delegates
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Installs the chain
|
|
56
|
+
def __install_chain__
|
|
57
|
+
delegate_chain.each_cons(2) do |part, its_del|
|
|
58
|
+
part.extend(Participant)
|
|
59
|
+
part.instance_eval{ @__delegate__ = its_del }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns the delegation object
|
|
64
|
+
def __getobj__
|
|
65
|
+
delegate_chain.first
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Plugs some chain participants
|
|
69
|
+
def plug(*args)
|
|
70
|
+
@delegate_chain = __build_participants__(args) + delegate_chain
|
|
71
|
+
__install_chain__
|
|
72
|
+
self
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Returns a connected version of self.
|
|
76
|
+
def connect(last)
|
|
77
|
+
chain = delegate_chain + [ last ]
|
|
78
|
+
Chain.new(*chain)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Inspects this chain
|
|
82
|
+
def inspect
|
|
83
|
+
debug = delegate_chain.collect{|c|
|
|
84
|
+
c.kind_of?(Chain) ? c.inspect : c.class.name
|
|
85
|
+
}.join(', ')
|
|
86
|
+
"[#{debug}]"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
protected :__getobj__
|
|
90
|
+
end # class Chain
|
|
91
|
+
end # module Core
|
|
92
|
+
end # module DbAgile
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module DbAgile
|
|
2
|
+
module Core
|
|
3
|
+
class Connection
|
|
4
|
+
|
|
5
|
+
attr_reader :chain
|
|
6
|
+
|
|
7
|
+
# About creation ###############################################################
|
|
8
|
+
|
|
9
|
+
# Creates a database instance with an underlying adapter
|
|
10
|
+
def initialize(chain)
|
|
11
|
+
@chain = chain
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# About delegate chains ########################################################
|
|
15
|
+
|
|
16
|
+
# Hot plug
|
|
17
|
+
def plug(*args)
|
|
18
|
+
@chain.plug(*args)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Delegated to the chain
|
|
22
|
+
def inspect
|
|
23
|
+
@chain.inspect
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
### DELEGATE PATTERN ON CONNECTION ################################################
|
|
27
|
+
|
|
28
|
+
# Automatically install methods of the Connection and *::TableDriven contracts
|
|
29
|
+
[ DbAgile::Contract::Connection,
|
|
30
|
+
DbAgile::Contract::Data::TableDriven,
|
|
31
|
+
DbAgile::Contract::Schema::TableDriven ].each do |mod|
|
|
32
|
+
|
|
33
|
+
mod.instance_methods(false).each do |method|
|
|
34
|
+
self.module_eval <<-EOF
|
|
35
|
+
def #{method}(*args, &block)
|
|
36
|
+
@chain.#{method}(*args, &block)
|
|
37
|
+
end
|
|
38
|
+
EOF
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Executes the block inside a transaction.
|
|
44
|
+
def transaction(&block)
|
|
45
|
+
raise ArgumentError, "Missing transaction block" unless block
|
|
46
|
+
Transaction.new(self).execute(&block)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end # class Connection
|
|
50
|
+
end # module Core
|
|
51
|
+
end # module DbAgile
|