pg_saurus 2.6.0 → 3.0.0
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.
- checksums.yaml +4 -4
- data/README.markdown +141 -98
- data/lib/core_ext/active_record/connection_adapters/postgresql_adapter.rb +4 -2
- data/lib/pg_saurus/connection_adapters/abstract_adapter.rb +0 -2
- data/lib/pg_saurus/connection_adapters/postgresql_adapter/foreign_key_methods.rb +105 -0
- data/lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb +8 -0
- data/lib/pg_saurus/connection_adapters/postgresql_adapter.rb +14 -2
- data/lib/pg_saurus/connection_adapters/table/comment_methods.rb +6 -6
- data/lib/pg_saurus/connection_adapters/table/trigger_methods.rb +2 -2
- data/lib/pg_saurus/connection_adapters/table.rb +0 -6
- data/lib/pg_saurus/connection_adapters.rb +0 -1
- data/lib/pg_saurus/create_index_concurrently.rb +1 -46
- data/lib/pg_saurus/migration/command_recorder.rb +0 -2
- data/lib/pg_saurus/schema_dumper/foreign_key_methods.rb +49 -0
- data/lib/pg_saurus/schema_dumper.rb +4 -3
- data/lib/pg_saurus/version.rb +1 -1
- metadata +10 -78
- data/lib/pg_saurus/connection_adapters/abstract_adapter/foreigner_methods.rb +0 -67
- data/lib/pg_saurus/connection_adapters/postgresql_adapter/foreigner_methods.rb +0 -221
- data/lib/pg_saurus/connection_adapters/table/foreigner_methods.rb +0 -51
- data/lib/pg_saurus/migration/command_recorder/foreigner_methods.rb +0 -31
- data/lib/pg_saurus/schema_dumper/foreigner_methods.rb +0 -63
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: dabef7560c6d27d491206e5ba2f067d23d05c8bd
         | 
| 4 | 
            +
              data.tar.gz: 8199a937694563d6a5fd411bff53485720280419
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7dadad30b8423ca3ac3ac500542e09d3cfceef0e37d77e7d5747e46f193c157cd7340573d4d64c3002e2d24ba3b9b52f859fbe7f0072b04d8dfc5eac083bdae2
         | 
| 7 | 
            +
              data.tar.gz: d9906693fe2dc28b459dc18fa263714343355c252eb53c9c63264f8cb077c76c41106c79c1b29e9acdd92adf403cc7e2c599befc44c53380b418f3ab09bbbb5e
         | 
    
        data/README.markdown
    CHANGED
    
    | @@ -1,27 +1,43 @@ | |
| 1 1 | 
             
            # PgSaurus
         | 
| 2 2 |  | 
| 3 3 | 
             
            [](http://travis-ci.org/HornsAndHooves/pg_saurus)
         | 
| 4 | 
            -
            [](https://gemnasium.com/HornsAndHooves/pg_saurus)
         | 
| 5 4 | 
             
            [](https://codeclimate.com/github/HornsAndHooves/pg_saurus)
         | 
| 6 | 
            -
            ActiveRecord extension to get more from PostgreSQL:
         | 
| 7 5 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
            *  | 
| 11 | 
            -
            * Use  | 
| 12 | 
            -
            *  | 
| 13 | 
            -
            *  | 
| 14 | 
            -
            *  | 
| 6 | 
            +
            An ActiveRecord extension to get more from PostgreSQL:
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            * Create/drop [schemas](#schemas).
         | 
| 9 | 
            +
            * Use existing functionality in the context of [schemas](#schemas).
         | 
| 10 | 
            +
            * Set/remove [comments on columns and tables](#table-and-column-comments).
         | 
| 11 | 
            +
            * [Enhancements to the Rails 4.2 foreign key support](#foreign-keys).
         | 
| 12 | 
            +
            * Use [partial indexes](#partial-indexes).
         | 
| 13 | 
            +
            * Use [indexes on expressions](#indexes-on-expressions).
         | 
| 14 | 
            +
            * [Run index creation concurrently](#concurrent-index-creation).
         | 
| 15 | 
            +
            * Create/drop [views](#views).
         | 
| 16 | 
            +
            * Create/drop [functions](#functions).
         | 
| 17 | 
            +
            * Create/drop [triggers](#triggers).
         | 
| 18 | 
            +
            * [Load/unload postgres extensions](#loadingunloading-postgresql-extension-modules).
         | 
| 19 | 
            +
            * [Select a specific DB role to conduct a migration](#roles).
         | 
| 20 | 
            +
            * Use yet more [tools](#tools).
         | 
| 15 21 |  | 
| 16 22 | 
             
            PgSaurus is a fork of PgPower.
         | 
| 17 23 |  | 
| 24 | 
            +
            ### More information
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            * [Environment notes](#environment-notes)
         | 
| 27 | 
            +
            * [Running tests](#running-tests)
         | 
| 28 | 
            +
            * [TODO](#todo)
         | 
| 29 | 
            +
            * [Credits](#credits)
         | 
| 30 | 
            +
            * [Copyright and License](#copyright-and-license)
         | 
| 31 | 
            +
            * [Contributing](#contributing)
         | 
| 32 | 
            +
             | 
| 18 33 | 
             
            ## Environment notes
         | 
| 19 34 |  | 
| 20 | 
            -
            PgSaurus was tested with Rails 4. | 
| 35 | 
            +
            PgSaurus v3 was tested with Rails 4.2, Ruby 2.2.4. For Rails 4.1, use PgSaurus v2.5+.
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            NOTE: JRuby is not supported. The current ActiveRecord JDBC adapter has its own Rails4-compatible
         | 
| 38 | 
            +
            method named "create_schema" which conflicts with this gem.
         | 
| 21 39 |  | 
| 22 | 
            -
            NOTE:  | 
| 23 | 
            -
            adapter has its own Rails4-compatible method named "create_schema" which
         | 
| 24 | 
            -
            conflicts with this gem.
         | 
| 40 | 
            +
            NOTE: PgSaurus does not support Rails 3.
         | 
| 25 41 |  | 
| 26 42 | 
             
            ## Schemas
         | 
| 27 43 |  | 
| @@ -45,7 +61,7 @@ end | |
| 45 61 | 
             
            Use schema `:schema` option to specify schema name:
         | 
| 46 62 |  | 
| 47 63 | 
             
            ```ruby
         | 
| 48 | 
            -
            create_table "countries", : | 
| 64 | 
            +
            create_table "countries", schema: "demography" do |t|
         | 
| 49 65 | 
             
              # columns goes here
         | 
| 50 66 | 
             
            end
         | 
| 51 67 | 
             
            ```
         | 
| @@ -93,15 +109,15 @@ remove_column_comment :phone_numbers, :npa | |
| 93 109 | 
             
            Set comments on multiple columns in the table.
         | 
| 94 110 |  | 
| 95 111 | 
             
            ```ruby
         | 
| 96 | 
            -
            set_column_comments :phone_numbers, : | 
| 97 | 
            -
                                                : | 
| 112 | 
            +
            set_column_comments :phone_numbers, npa: 'Numbering Plan Area Code - Allowed ranges: [2-9] for first digit, [0-9] for second and third digit.',
         | 
| 113 | 
            +
                                                nxx: 'Central Office Number'
         | 
| 98 114 | 
             
            ```
         | 
| 99 115 | 
             
            Remove comments from multiple columns in the table.
         | 
| 100 116 |  | 
| 101 117 | 
             
            ```ruby
         | 
| 102 118 | 
             
            remove_column_comments :phone_numbers, :npa, :nxx
         | 
| 103 119 | 
             
            ```
         | 
| 104 | 
            -
            PgSaurus also adds extra methods to change_table.
         | 
| 120 | 
            +
            PgSaurus also adds extra table methods to the `change_table` block.
         | 
| 105 121 |  | 
| 106 122 | 
             
            Set comments:
         | 
| 107 123 |  | 
| @@ -112,8 +128,8 @@ change_table :phone_numbers do |t| | |
| 112 128 | 
             
            end
         | 
| 113 129 |  | 
| 114 130 | 
             
            change_table :phone_numbers do |t|
         | 
| 115 | 
            -
              t.set_column_comments : | 
| 116 | 
            -
                                    : | 
| 131 | 
            +
              t.set_column_comments npa: 'Numbering Plan Area Code - Allowed ranges: [2-9] for first digit, [0-9] for second and third digit.',
         | 
| 132 | 
            +
                                    nxx: 'Central Office Number'
         | 
| 117 133 | 
             
            end
         | 
| 118 134 | 
             
            ```
         | 
| 119 135 | 
             
            Remove comments:
         | 
| @@ -130,46 +146,63 @@ end | |
| 130 146 | 
             
            ```
         | 
| 131 147 | 
             
            ## Foreign keys
         | 
| 132 148 |  | 
| 133 | 
            -
             | 
| 134 | 
            -
            gem and patched it to be schema-aware. Support was also added for index auto-generation.
         | 
| 135 | 
            -
             | 
| 136 | 
            -
            You should disable `foreigner` in your Gemfile if you want to use `pg_saurus`.
         | 
| 137 | 
            -
             | 
| 138 | 
            -
            If you do not want to generate an index, pass the :exclude_index => true option.
         | 
| 149 | 
            +
            PgSaurus v3 augments Rails 4.2's foreign key methods with:
         | 
| 139 150 |  | 
| 140 | 
            -
             | 
| 151 | 
            +
            * schema support
         | 
| 152 | 
            +
            * index auto-generation
         | 
| 141 153 |  | 
| 154 | 
            +
            When you create a foreign key PgSaurus automatically creates an index.
         | 
| 155 | 
            +
            If you do not want to generate an index, pass the `exclude_index: true` option.
         | 
| 156 | 
            +
            The syntax is compatible with Rails 4.2's foreign key handling methods.
         | 
| 142 157 |  | 
| 143 | 
            -
             | 
| 158 | 
            +
            It works with schemas as expected:
         | 
| 144 159 |  | 
| 145 160 | 
             
            ```ruby
         | 
| 146 | 
            -
            add_foreign_key( | 
| 161 | 
            +
            add_foreign_key('blog.comments', 'blog.posts')
         | 
| 147 162 | 
             
            ```
         | 
| 148 | 
            -
             | 
| 163 | 
            +
            Adds the index `'index_comments_on_post_id'`:
         | 
| 149 164 |  | 
| 150 165 | 
             
            ```ruby
         | 
| 151 | 
            -
            add_foreign_key(:comments, :posts | 
| 166 | 
            +
            add_foreign_key(:comments, :posts)
         | 
| 152 167 | 
             
            ```
         | 
| 153 | 
            -
             | 
| 168 | 
            +
            Does not add an index:
         | 
| 154 169 |  | 
| 155 170 | 
             
            ```ruby
         | 
| 156 | 
            -
            add_foreign_key(:comments, :posts, : | 
| 171 | 
            +
            add_foreign_key(:comments, :posts, exclude_index: true)
         | 
| 157 172 | 
             
            ```
         | 
| 158 | 
            -
             | 
| 173 | 
            +
             | 
| 174 | 
            +
            Note that removing a foreign key does not drop the index of the foreign key column.
         | 
| 175 | 
            +
            If you want to remove the index, pass in the `remove_index: true` option.
         | 
| 159 176 |  | 
| 160 177 | 
             
            ```ruby
         | 
| 161 | 
            -
             | 
| 178 | 
            +
            remove_foreign_key(:comments, column: :post_id, remove_index: true)
         | 
| 162 179 | 
             
            ```
         | 
| 163 | 
            -
             | 
| 180 | 
            +
             | 
| 181 | 
            +
             | 
| 182 | 
            +
            ### Migration notes - upgrading from Rails 4.1
         | 
| 183 | 
            +
             | 
| 184 | 
            +
            PgSaurus v3+ now uses the Rails 4.2 semantics for `add_foreign_key` and `remove_foreign_key`. See http://api.rubyonrails.org/v4.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html
         | 
| 185 | 
            +
             | 
| 186 | 
            +
            A few things have changed. The most breaking change is that the syntax `remove_foreign_key :from_table, :to_table, options` no longer works.
         | 
| 164 187 |  | 
| 165 188 | 
             
            ```ruby
         | 
| 166 | 
            -
             | 
| 189 | 
            +
            #THIS FAILS
         | 
| 190 | 
            +
            remove_foreign_key :comments, :posts, remove_index: true
         | 
| 191 | 
            +
             | 
| 192 | 
            +
            #DO THIS INSTEAD
         | 
| 193 | 
            +
            remove_foreign_key :comments, column: :post_id, remove_index: true
         | 
| 167 194 | 
             
            ```
         | 
| 168 | 
            -
             | 
| 195 | 
            +
             | 
| 196 | 
            +
            For adding foreign keys, the `:dependent` option is replaced with `:on_delete` and `:on_update`. The `:delete` value is replaced with `:cascade`.
         | 
| 169 197 |  | 
| 170 198 | 
             
            ```ruby
         | 
| 171 | 
            -
             | 
| 199 | 
            +
            #OLD STYLE - NO LONGER WORKS
         | 
| 200 | 
            +
            add_foreign_key :comments, :posts, dependent: :delete
         | 
| 201 | 
            +
             | 
| 202 | 
            +
            #NEW STYLE - DO THIS INSTEAD
         | 
| 203 | 
            +
            add_foreign_key :comments, :posts, on_delete: :cascade
         | 
| 172 204 | 
             
            ```
         | 
| 205 | 
            +
             | 
| 173 206 | 
             
            ## Partial Indexes
         | 
| 174 207 |  | 
| 175 208 | 
             
            Rails 4.x [pull request](https://github.com/rails/rails/pull/4956) was used as a
         | 
| @@ -177,15 +210,15 @@ starting point to patch it to be schema-aware. | |
| 177 210 |  | 
| 178 211 | 
             
            ### Examples
         | 
| 179 212 |  | 
| 180 | 
            -
            Add a partial index to a table
         | 
| 213 | 
            +
            Add a partial index to a table:
         | 
| 181 214 |  | 
| 182 215 | 
             
            ```ruby
         | 
| 183 | 
            -
            add_index(:comments, [:country_id, :user_id], : | 
| 216 | 
            +
            add_index(:comments, [:country_id, :user_id], where: 'active')
         | 
| 184 217 | 
             
            ```
         | 
| 185 | 
            -
            Add a partial index to a schema table
         | 
| 218 | 
            +
            Add a partial index to a schema table:
         | 
| 186 219 |  | 
| 187 220 | 
             
            ```ruby
         | 
| 188 | 
            -
            add_index('blog.comments', :user_id, : | 
| 221 | 
            +
            add_index('blog.comments', :user_id, where: 'active')
         | 
| 189 222 | 
             
            ```
         | 
| 190 223 | 
             
            ## Indexes on Expressions
         | 
| 191 224 |  | 
| @@ -194,67 +227,67 @@ expressions are supported. | |
| 194 227 |  | 
| 195 228 | 
             
            ### Examples
         | 
| 196 229 |  | 
| 197 | 
            -
            Add an index to a column with a function
         | 
| 230 | 
            +
            Add an index to a column with a function:
         | 
| 198 231 |  | 
| 199 232 | 
             
            ```ruby
         | 
| 200 233 | 
             
            add_index(:comments, "lower(text)")
         | 
| 201 234 | 
             
            ```
         | 
| 202 235 |  | 
| 203 | 
            -
            You can also specify index access method
         | 
| 236 | 
            +
            You can also specify the index access method:
         | 
| 204 237 |  | 
| 205 238 | 
             
            ```ruby
         | 
| 206 239 | 
             
            create_extension 'btree_gist'
         | 
| 207 240 | 
             
            create_extension 'fuzzystrmatch'
         | 
| 208 | 
            -
            add_index(:comments, 'dmetaphone(author)', : | 
| 241 | 
            +
            add_index(:comments, 'dmetaphone(author)', using: 'gist')
         | 
| 209 242 | 
             
            ```
         | 
| 210 243 |  | 
| 211 244 | 
             
            ## Concurrent index creation
         | 
| 212 245 |  | 
| 213 | 
            -
            PostgreSQL supports  | 
| 214 | 
            -
            DSL on index and foreign  | 
| 246 | 
            +
            PostgreSQL supports concurrent index creation. PgSaurus supports that feature by adding support
         | 
| 247 | 
            +
            to the migration DSL on index and foreign key creation.
         | 
| 215 248 |  | 
| 216 249 | 
             
            ### Examples
         | 
| 217 250 |  | 
| 218 | 
            -
            Add an index concurrently to a table
         | 
| 251 | 
            +
            Add an index concurrently to a table:
         | 
| 219 252 |  | 
| 220 253 | 
             
            ```ruby
         | 
| 221 | 
            -
            add_index :table, :column_id, : | 
| 254 | 
            +
            add_index :table, :column_id, concurrently: true
         | 
| 222 255 | 
             
            ```
         | 
| 223 256 |  | 
| 224 | 
            -
            Add an index concurrently along with foreign key
         | 
| 257 | 
            +
            Add an index concurrently along with foreign key:
         | 
| 225 258 |  | 
| 226 259 | 
             
            ```ruby
         | 
| 227 | 
            -
            add_foreign_key :table1, :table2, : | 
| 260 | 
            +
            add_foreign_key :table1, :table2, column: :column_id, concurrent_index: true
         | 
| 228 261 | 
             
            ```
         | 
| 229 262 |  | 
| 230 263 | 
             
            ## Loading/Unloading postgresql extension modules
         | 
| 231 264 |  | 
| 232 | 
            -
             | 
| 265 | 
            +
            PostgreSQL ships with a number of [extension modules](http://www.postgresql.org/docs/9.4/static/contrib.html).
         | 
| 233 266 | 
             
            PgSaurus provides some tools
         | 
| 234 | 
            -
            to [load](http://www.postgresql.org/docs/9. | 
| 235 | 
            -
             | 
| 267 | 
            +
            to [load](http://www.postgresql.org/docs/9.4/static/sql-createextension.html) and
         | 
| 268 | 
            +
            [unload](http://www.postgresql.org/docs/9.4/static/sql-dropextension.html)
         | 
| 269 | 
            +
            such modules using migrations.
         | 
| 236 270 |  | 
| 237 | 
            -
            Please note | 
| 238 | 
            -
            So this functionality  | 
| 271 | 
            +
            Please note: `CREATE`/`DROP EXTENSION` command was introduced in PostgreSQL 9.1.
         | 
| 272 | 
            +
            So this functionality is not available in previous versions.
         | 
| 239 273 |  | 
| 240 274 | 
             
            ### Examples
         | 
| 241 275 |  | 
| 242 | 
            -
            Load [fuzzystrmatch](http://www.postgresql.org/docs/9. | 
| 243 | 
            -
            and create its objects in schema *public*:
         | 
| 276 | 
            +
            Load [fuzzystrmatch](http://www.postgresql.org/docs/9.4/static/fuzzystrmatch.html)
         | 
| 277 | 
            +
            extension module; and create its objects in schema *public*:
         | 
| 244 278 |  | 
| 245 279 | 
             
            ```ruby
         | 
| 246 280 | 
             
            create_extension "fuzzystrmatch"
         | 
| 247 281 | 
             
            ```
         | 
| 248 282 |  | 
| 249 | 
            -
             | 
| 250 | 
            -
             | 
| 251 | 
            -
            and create its objects in schema *demography*.
         | 
| 283 | 
            +
            Load version *1.0* of the [btree_gist](http://www.postgresql.org/docs/9.4/static/btree-gist.html)
         | 
| 284 | 
            +
            extension module; and create its objects in schema *demography*.
         | 
| 252 285 |  | 
| 253 286 | 
             
            ```ruby
         | 
| 254 | 
            -
            create_extension "btree_gist", : | 
| 287 | 
            +
            create_extension "btree_gist", schema_name: "demography", version: "1.0"
         | 
| 255 288 | 
             
            ```
         | 
| 256 289 |  | 
| 257 | 
            -
            Unload extension module:
         | 
| 290 | 
            +
            Unload an extension module:
         | 
| 258 291 |  | 
| 259 292 | 
             
            ```ruby
         | 
| 260 293 | 
             
            drop_extension "fuzzystrmatch"
         | 
| @@ -262,13 +295,15 @@ drop_extension "fuzzystrmatch" | |
| 262 295 |  | 
| 263 296 | 
             
            ## Views
         | 
| 264 297 |  | 
| 265 | 
            -
             | 
| 298 | 
            +
            PgSaurus v1.6.0 introduced experimental support for creating views. This API should only be used
         | 
| 266 299 | 
             
            with the understanding that it is preliminary 'alpha' at best.
         | 
| 267 300 |  | 
| 268 | 
            -
            ###  | 
| 301 | 
            +
            ### Examples
         | 
| 269 302 |  | 
| 270 303 | 
             
            ```ruby
         | 
| 271 304 | 
             
            create_view "demography.citizens_view", "select * from demography.citizens"
         | 
| 305 | 
            +
             | 
| 306 | 
            +
            drop_view "demography.citizens_view"
         | 
| 272 307 | 
             
            ```
         | 
| 273 308 |  | 
| 274 309 | 
             
            ## Roles
         | 
| @@ -303,10 +338,10 @@ end | |
| 303 338 | 
             
            ```
         | 
| 304 339 |  | 
| 305 340 | 
             
            You may force all migrations to have `set_role`, for this, configure PgSaurus with
         | 
| 306 | 
            -
            `ensure_role_set=true`:
         | 
| 341 | 
            +
            `ensure_role_set = true`:
         | 
| 307 342 |  | 
| 308 343 | 
             
            ```ruby
         | 
| 309 | 
            -
            PgSaurus. | 
| 344 | 
            +
            PgSaurus.configure do |config|
         | 
| 310 345 | 
             
              config.ensure_role_set = true
         | 
| 311 346 | 
             
            end
         | 
| 312 347 | 
             
            ```
         | 
| @@ -317,8 +352,9 @@ You can create, list, and drop functions. | |
| 317 352 |  | 
| 318 353 | 
             
            ### Examples
         | 
| 319 354 |  | 
| 355 | 
            +
            Create a function:
         | 
| 356 | 
            +
             | 
| 320 357 | 
             
            ```ruby
         | 
| 321 | 
            -
            # Create a function
         | 
| 322 358 | 
             
            pets_not_empty_function = <<-SQL
         | 
| 323 359 | 
             
            BEGIN
         | 
| 324 360 | 
             
              IF (SELECT COUNT(*) FROM pets) > 0
         | 
| @@ -329,13 +365,18 @@ BEGIN | |
| 329 365 | 
             
              END IF;
         | 
| 330 366 | 
             
            END;
         | 
| 331 367 | 
             
            SQL
         | 
| 368 | 
            +
             | 
| 332 369 | 
             
            # Arguments are: function_name, return_type, function_definition, options (currently, only :schema)
         | 
| 333 370 | 
             
            create_function 'pets_not_empty()', :boolean, pets_not_empty_function, schema: 'public'
         | 
| 371 | 
            +
            ```
         | 
| 372 | 
            +
            Drop a function:
         | 
| 334 373 |  | 
| 335 | 
            -
             | 
| 374 | 
            +
            ```ruby
         | 
| 336 375 | 
             
            drop_function 'pets_not_empty()'
         | 
| 376 | 
            +
            ```
         | 
| 377 | 
            +
            Get a list of defined functions:
         | 
| 337 378 |  | 
| 338 | 
            -
             | 
| 379 | 
            +
            ```ruby
         | 
| 339 380 | 
             
            ActiveRecord::Base.connection.functions
         | 
| 340 381 | 
             
            ```
         | 
| 341 382 |  | 
| @@ -345,28 +386,34 @@ You can create and remove triggers on tables and views. | |
| 345 386 |  | 
| 346 387 | 
             
            ### Examples
         | 
| 347 388 |  | 
| 389 | 
            +
            Create a trigger:
         | 
| 390 | 
            +
             | 
| 348 391 | 
             
            ```ruby
         | 
| 349 | 
            -
            # Create a trigger
         | 
| 350 392 | 
             
            create_trigger :pets,                           # Table or view name
         | 
| 351 393 | 
             
                           :pets_not_empty_trigger_proc,    # Procedure name. Parentheses are optional if you have no arguments.
         | 
| 352 394 | 
             
                           'AFTER INSERT',                  # Trigger event
         | 
| 353 | 
            -
                           for_each: 'ROW',                 # Can be row or statement. Default is row.
         | 
| 395 | 
            +
                           for_each: 'ROW',                 # Can be a row or a statement. Default is row.
         | 
| 354 396 | 
             
                           schema: 'public',                # Optional schema name
         | 
| 355 | 
            -
                           constraint: true,                # Sets  | 
| 356 | 
            -
                           deferrable: true,                # Sets  | 
| 357 | 
            -
                           initially_deferred: true,        # Sets  | 
| 397 | 
            +
                           constraint: true,                # Sets whether the trigger is a constraint. Default is false.
         | 
| 398 | 
            +
                           deferrable: true,                # Sets whether the trigger is immediate or deferrable. Default is immediate.
         | 
| 399 | 
            +
                           initially_deferred: true,        # Sets whether the trigger is initially deferred. Default is immediate.
         | 
| 400 | 
            +
                                                            # Only relevant if the trigger is deferrable.
         | 
| 358 401 | 
             
                           condition: "new.name = 'fluffy'" # Optional when condition. Default is none.
         | 
| 402 | 
            +
            ```
         | 
| 403 | 
            +
            Drop a trigger:
         | 
| 359 404 |  | 
| 360 | 
            -
             | 
| 405 | 
            +
            ```ruby
         | 
| 361 406 | 
             
            remove_trigger :pets, :pets_not_empty_trigger_proc
         | 
| 407 | 
            +
            ```
         | 
| 408 | 
            +
            Get a list of defined triggers on a table or view:
         | 
| 362 409 |  | 
| 363 | 
            -
             | 
| 410 | 
            +
            ```ruby
         | 
| 364 411 | 
             
            ActiveRecord::Base.connection.triggers
         | 
| 365 412 | 
             
            ```
         | 
| 366 413 |  | 
| 367 414 | 
             
            ## Tools
         | 
| 368 415 |  | 
| 369 | 
            -
            PgSaurus::Tools provides a number of useful methods | 
| 416 | 
            +
            PgSaurus::Tools provides a number of useful methods for managing schemas, etc.:
         | 
| 370 417 |  | 
| 371 418 | 
             
            ```ruby
         | 
| 372 419 | 
             
            PgSaurus::Tools.create_schema "services"                 # => create new PG schema "services"
         | 
| @@ -378,51 +425,47 @@ PgSaurus::Tools.schemas                                  # => ["public", "inform | |
| 378 425 | 
             
            PgSaurus::Tools.index_exists?(table, columns, options)   # => returns true if an index exists for the given params
         | 
| 379 426 | 
             
            ```
         | 
| 380 427 |  | 
| 381 | 
            -
            ##  | 
| 382 | 
            -
             | 
| 383 | 
            -
            PgSaurus does not support Rails 3.
         | 
| 384 | 
            -
             | 
| 385 | 
            -
            ## Running tests:
         | 
| 428 | 
            +
            ## Running tests
         | 
| 386 429 |  | 
| 387 | 
            -
            * Ensure your postgresql has postgres-contrib (Ubuntu) package installed. Tests depend on btree_gist and fuzzystrmatch extensions
         | 
| 388 | 
            -
             * If on Mac, see below for installing contrib packages
         | 
| 430 | 
            +
            * Ensure your `postgresql` has `postgres-contrib` (if you're on Ubuntu) package installed. Tests depend on the `btree_gist` and `fuzzystrmatch` extensions
         | 
| 431 | 
            +
             * If you're on a Mac, see below for installing contrib packages
         | 
| 389 432 | 
             
            * Configure `spec/dummy/config/database.yml` for development and test environments.
         | 
| 390 433 | 
             
            * Run `rake spec`.
         | 
| 391 434 | 
             
            * Make sure migrations don't raise exceptions and all specs pass.
         | 
| 392 435 |  | 
| 393 436 | 
             
            ### Installing contrib packages on Mac OS X:
         | 
| 394 | 
            -
            * This assumes you are using MacPorts to install  | 
| 395 | 
            -
            * Assuming you installed with default options (including auto-clean), you will need to rebuild the postgresql port and keep the build files
         | 
| 396 | 
            -
             * `sudo port -k -s build  | 
| 437 | 
            +
            * This assumes you are using [MacPorts](https://www.macports.org) to install `postgresql`. If you're using [Homebrew](http://brew.sh) or the Postgres App, you will need to adjust the instructions accordingly (please add to this README when you do)
         | 
| 438 | 
            +
            * Assuming you installed with default options (including auto-clean), you will need to rebuild the `postgresql` port and keep the build files
         | 
| 439 | 
            +
             * `sudo port -k -s build postgresql94`
         | 
| 397 440 | 
             
             * (adjust the version number above appropriately)
         | 
| 398 | 
            -
            * Now you can make and install the btree_gist and any other contrib modules
         | 
| 399 | 
            -
             * `cd  | 
| 441 | 
            +
            * Now you can make and install the `btree_gist` and any other contrib modules
         | 
| 442 | 
            +
             * `cd $(port work postgresql94)/postgresql-9.4.7/contrib/btree_gist`
         | 
| 400 443 | 
             
             * (again, you may need to adjust the version number to your specific version)
         | 
| 401 444 | 
             
             * `sudo make all`
         | 
| 402 445 | 
             
             * `sudo make install`
         | 
| 403 446 | 
             
            * Done!
         | 
| 404 447 |  | 
| 405 | 
            -
            ## TODO | 
| 448 | 
            +
            ## TODO
         | 
| 406 449 |  | 
| 407 | 
            -
            Support for Rails  | 
| 450 | 
            +
            Support for Rails 5+
         | 
| 408 451 |  | 
| 409 | 
            -
            *  | 
| 452 | 
            +
            * Rails 5 introduces its own schema support. PgSaurus v4+ will have to drop any conflicting support and modify its other features to accommodate Rails 5's schema support.
         | 
| 410 453 |  | 
| 411 | 
            -
             | 
| 454 | 
            +
            Possible support for JRuby:
         | 
| 412 455 |  | 
| 413 456 | 
             
            * Jdbc driver provides its own `create_schema(schema, user)` method - solve conflicts.
         | 
| 414 457 |  | 
| 415 458 | 
             
            ## Credits
         | 
| 416 459 |  | 
| 417 | 
            -
            * [Potapov Sergey](https://github.com/greyblake) - schema support
         | 
| 418 | 
            -
            * [Arthur Shagall](https://github.com/albertosaurus) - function support - and thanks for [pg_comment](https://github.com/albertosaurus/pg_comment)
         | 
| 419 | 
            -
            * [ | 
| 460 | 
            +
            * [Potapov Sergey](https://github.com/greyblake) - schema support, role support
         | 
| 461 | 
            +
            * [Arthur Shagall](https://github.com/albertosaurus) - function and trigger support, Rails 4.2 support - and thanks for [pg_comment](https://github.com/albertosaurus/pg_comment)
         | 
| 462 | 
            +
            * [Mitya Lyubarskyy](https://github.com/MityaLiu) - view support, Rails 4.2 support
         | 
| 420 463 | 
             
            * [Artem Ignatyev](https://github.com/cryo28) - extension modules load/unload support
         | 
| 421 464 | 
             
            * [Marcelo Silveira](https://github.com/mhfs) - thanks for rails partial index support that was backported into this gem
         | 
| 422 465 |  | 
| 423 466 | 
             
            ## Copyright and License
         | 
| 424 467 |  | 
| 425 | 
            -
            * Copyright (c)  | 
| 468 | 
            +
            * Copyright (c) 2016 HornsAndHooves.
         | 
| 426 469 | 
             
            * Initial foreign key code taken from foreigner, Copyright (c) 2009 Matthew Higgins
         | 
| 427 470 | 
             
            * pg_comment Copyright (c) 2011 Arthur Shagall
         | 
| 428 471 | 
             
            * Partial index Copyright (c) 2012 Marcelo Silveira
         | 
| @@ -30,7 +30,8 @@ module ActiveRecord # :nodoc: | |
| 30 30 | 
             
                  # Search using provided schema if table_name includes schema name.
         | 
| 31 31 | 
             
                  #
         | 
| 32 32 | 
             
                  def index_name_exists?(table_name, index_name, default)
         | 
| 33 | 
            -
                     | 
| 33 | 
            +
                    postgre_sql_name = PostgreSQL::Utils.extract_schema_qualified_name(table_name)
         | 
| 34 | 
            +
                    schema, table = postgre_sql_name.schema, postgre_sql_name.identifier
         | 
| 34 35 | 
             
                    schemas = schema ? "ARRAY['#{schema}']" : 'current_schemas(false)'
         | 
| 35 36 |  | 
| 36 37 | 
             
                    exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
         | 
| @@ -65,7 +66,8 @@ module ActiveRecord # :nodoc: | |
| 65 66 | 
             
                  # the custom {PgSaurus::ConnectionAdapters::IndexDefinition}
         | 
| 66 67 | 
             
                  #
         | 
| 67 68 | 
             
                  def indexes(table_name, name = nil)
         | 
| 68 | 
            -
                     | 
| 69 | 
            +
                    postgre_sql_name = PostgreSQL::Utils.extract_schema_qualified_name(table_name)
         | 
| 70 | 
            +
                    schema, table = postgre_sql_name.schema, postgre_sql_name.identifier
         | 
| 69 71 | 
             
                    schemas = schema ? "ARRAY['#{schema}']" : 'current_schemas(false)'
         | 
| 70 72 |  | 
| 71 73 | 
             
                    result = query(<<-SQL, name)
         | 
| @@ -4,14 +4,12 @@ module PgSaurus::ConnectionAdapters::AbstractAdapter | |
| 4 4 | 
             
              extend ActiveSupport::Concern
         | 
| 5 5 |  | 
| 6 6 | 
             
              autoload :CommentMethods
         | 
| 7 | 
            -
              autoload :ForeignerMethods
         | 
| 8 7 | 
             
              autoload :SchemaMethods
         | 
| 9 8 | 
             
              autoload :IndexMethods
         | 
| 10 9 | 
             
              autoload :FunctionMethods
         | 
| 11 10 | 
             
              autoload :TriggerMethods
         | 
| 12 11 |  | 
| 13 12 | 
             
              include CommentMethods
         | 
| 14 | 
            -
              include ForeignerMethods
         | 
| 15 13 | 
             
              include SchemaMethods
         | 
| 16 14 | 
             
              include IndexMethods
         | 
| 17 15 | 
             
              include FunctionMethods
         | 
| @@ -0,0 +1,105 @@ | |
| 1 | 
            +
            module PgSaurus # :nodoc:
         | 
| 2 | 
            +
              # Provides methods to extend {ActiveRecord::ConnectionAdapters::PostgreSQLAdapter}
         | 
| 3 | 
            +
              # to support foreign keys feature.
         | 
| 4 | 
            +
              module ConnectionAdapters::PostgreSQLAdapter::ForeignKeyMethods
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # Drop table and optionally disable triggers.
         | 
| 7 | 
            +
                # Changes adapted from https://github.com/matthuhiggins/foreigner/blob/e72ab9c454c156056d3f037d55e3359cd972af32/lib/foreigner/connection_adapters/sql2003.rb
         | 
| 8 | 
            +
                # NOTE: Disabling referential integrity requires superuser access in postgres.
         | 
| 9 | 
            +
                #       Default AR behavior is just to drop_table.
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                # == Options:
         | 
| 12 | 
            +
                # * :force - force disabling of referential integrity
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                # Note: I don't know a good way to test this -mike 20120420
         | 
| 15 | 
            +
                def drop_table(*args)
         | 
| 16 | 
            +
                  options = args.clone.extract_options!
         | 
| 17 | 
            +
                  if options[:force]
         | 
| 18 | 
            +
                    disable_referential_integrity { super }
         | 
| 19 | 
            +
                  else
         | 
| 20 | 
            +
                    super
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # See activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
         | 
| 25 | 
            +
                # Creates index on the FK column by default. Pass in the option :exclude_index => true
         | 
| 26 | 
            +
                # to disable this.
         | 
| 27 | 
            +
                def add_foreign_key_with_index(from_table, to_table, options = {})
         | 
| 28 | 
            +
                  exclude_index = (options.has_key?(:exclude_index) ? options.delete(:exclude_index) : false)
         | 
| 29 | 
            +
                  column        = options[:column] || foreign_key_column_for(to_table)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  if index_exists?(from_table, column) && !exclude_index
         | 
| 32 | 
            +
                    raise PgSaurus::IndexExistsError,
         | 
| 33 | 
            +
                          "The index, #{index_name(from_table, column)}, already exists." \
         | 
| 34 | 
            +
                      "  Use :exclude_index => true when adding the foreign key."
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  add_foreign_key_without_index from_table, to_table, options
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  unless exclude_index
         | 
| 40 | 
            +
                    add_index from_table, column
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                # See activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
         | 
| 45 | 
            +
                def remove_foreign_key_with_index(from_table, options_or_to_table = {})
         | 
| 46 | 
            +
                  if options_or_to_table.is_a?(Hash) && options_or_to_table[:remove_index]
         | 
| 47 | 
            +
                    column = options_or_to_table[:column]
         | 
| 48 | 
            +
                    remove_index from_table, column
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  remove_foreign_key_without_index(from_table, options_or_to_table)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                # See: activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
         | 
| 55 | 
            +
                def foreign_key_column_for_with_schema(table_name)
         | 
| 56 | 
            +
                  table = table_name.to_s.split('.').last
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  foreign_key_column_for_without_schema table
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                # see activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
         | 
| 62 | 
            +
                def foreign_keys_with_schema(table_name)
         | 
| 63 | 
            +
                  namespace  = table_name.to_s.split('.').first
         | 
| 64 | 
            +
                  table_name = table_name.to_s.split('.').last
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  namespace  = if namespace == table_name
         | 
| 67 | 
            +
                                 "ANY (current_schemas(false))"
         | 
| 68 | 
            +
                               else
         | 
| 69 | 
            +
                                 quote(namespace)
         | 
| 70 | 
            +
                               end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  sql = <<-SQL.strip_heredoc
         | 
| 73 | 
            +
                        SELECT t2.oid::regclass::text AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete, t3.nspname AS from_schema
         | 
| 74 | 
            +
                        FROM pg_constraint c
         | 
| 75 | 
            +
                        JOIN pg_class t1 ON c.conrelid = t1.oid
         | 
| 76 | 
            +
                        JOIN pg_class t2 ON c.confrelid = t2.oid
         | 
| 77 | 
            +
                        JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid
         | 
| 78 | 
            +
                        JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
         | 
| 79 | 
            +
                        JOIN pg_namespace t3 ON c.connamespace = t3.oid
         | 
| 80 | 
            +
                        WHERE c.contype = 'f'
         | 
| 81 | 
            +
                          AND t1.relname = #{quote(table_name)}
         | 
| 82 | 
            +
                          AND t3.nspname = #{namespace}
         | 
| 83 | 
            +
                        ORDER BY c.conname
         | 
| 84 | 
            +
                  SQL
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  fk_info = select_all(sql)
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  fk_info.map do |row|
         | 
| 89 | 
            +
                    options = {
         | 
| 90 | 
            +
                      column:      row['column'],
         | 
| 91 | 
            +
                      name:        row['name'],
         | 
| 92 | 
            +
                      primary_key: row['primary_key'],
         | 
| 93 | 
            +
                      from_schema: row['from_schema']
         | 
| 94 | 
            +
                    }
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    options[:on_delete] = extract_foreign_key_action(row['on_delete'])
         | 
| 97 | 
            +
                    options[:on_update] = extract_foreign_key_action(row['on_update'])
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row['to_table'], options)
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
             | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
            end
         | 
| @@ -34,6 +34,14 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter::SchemaMethods | |
| 34 34 | 
             
                ::PgSaurus::Tools.drop_schema_if_exists(schema_name)
         | 
| 35 35 | 
             
              end
         | 
| 36 36 |  | 
| 37 | 
            +
              # Provide :schema option to +drop_table+ method.
         | 
| 38 | 
            +
              def drop_table_with_schema_option(table_name, options = {})
         | 
| 39 | 
            +
                options     = options.dup
         | 
| 40 | 
            +
                schema_name = options.delete(:schema)
         | 
| 41 | 
            +
                table_name  = "#{schema_name}.#{table_name}" if schema_name
         | 
| 42 | 
            +
                drop_table_without_schema_option(table_name, options)
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 37 45 | 
             
              # Make method +tables+ return tables not only from public schema.
         | 
| 38 46 | 
             
              #
         | 
| 39 47 | 
             
              # @note
         | 
| @@ -8,7 +8,7 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter | |
| 8 8 | 
             
              autoload :ExtensionMethods,   'pg_saurus/connection_adapters/postgresql_adapter/extension_methods'
         | 
| 9 9 | 
             
              autoload :SchemaMethods,      'pg_saurus/connection_adapters/postgresql_adapter/schema_methods'
         | 
| 10 10 | 
             
              autoload :CommentMethods,     'pg_saurus/connection_adapters/postgresql_adapter/comment_methods'
         | 
| 11 | 
            -
              autoload : | 
| 11 | 
            +
              autoload :ForeignKeyMethods,  'pg_saurus/connection_adapters/postgresql_adapter/foreign_key_methods'
         | 
| 12 12 | 
             
              autoload :IndexMethods,       'pg_saurus/connection_adapters/postgresql_adapter/index_methods'
         | 
| 13 13 | 
             
              autoload :TranslateException, 'pg_saurus/connection_adapters/postgresql_adapter/translate_exception'
         | 
| 14 14 | 
             
              autoload :ViewMethods,        'pg_saurus/connection_adapters/postgresql_adapter/view_methods'
         | 
| @@ -18,7 +18,7 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter | |
| 18 18 | 
             
              include ExtensionMethods
         | 
| 19 19 | 
             
              include SchemaMethods
         | 
| 20 20 | 
             
              include CommentMethods
         | 
| 21 | 
            -
              include  | 
| 21 | 
            +
              include ForeignKeyMethods
         | 
| 22 22 | 
             
              include IndexMethods
         | 
| 23 23 | 
             
              include TranslateException
         | 
| 24 24 | 
             
              include ViewMethods
         | 
| @@ -28,6 +28,18 @@ module PgSaurus::ConnectionAdapters::PostgreSQLAdapter | |
| 28 28 | 
             
              included do
         | 
| 29 29 | 
             
                alias_method_chain :tables, :non_public_schema_tables
         | 
| 30 30 | 
             
                alias_method_chain :add_index, :concurrently
         | 
| 31 | 
            +
                alias_method_chain :drop_table, :schema_option
         | 
| 31 32 | 
             
                alias_method_chain :rename_table, :schema_option
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                alias_method_chain :add_foreign_key, :index
         | 
| 35 | 
            +
                alias_method_chain :remove_foreign_key, :index
         | 
| 36 | 
            +
                alias_method_chain :foreign_key_column_for, :schema
         | 
| 37 | 
            +
                alias_method_chain :foreign_keys, :schema
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.module_eval do
         | 
| 40 | 
            +
                  def from_schema
         | 
| 41 | 
            +
                    options[:from_schema] || 'public'
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 32 44 | 
             
              end
         | 
| 33 45 | 
             
            end
         |