diff options
author | schneems <richard.schneeman@gmail.com> | 2013-08-05 11:12:12 -0400 |
---|---|---|
committer | schneems <richard.schneeman@gmail.com> | 2013-08-05 12:10:52 -0400 |
commit | f036239447c79843983ee1c0d3dfe68484d63203 (patch) | |
tree | fcb37f07ccb111253bb2385d8955d1dbbc1655fd /activerecord | |
parent | 3baee0982d25e64cab2eeb046369f0fcf9ee2436 (diff) | |
download | rails-f036239447c79843983ee1c0d3dfe68484d63203.tar.gz rails-f036239447c79843983ee1c0d3dfe68484d63203.tar.bz2 rails-f036239447c79843983ee1c0d3dfe68484d63203.zip |
Create sqlite3 directory if not present
If the `db/` directory is not present on a remote machine it will blow up in unexpected ways with error messages that do not indicate there is a missing directory:
```
SQLite3::CantOpenException: unable to open database file
```
This PR checks to see if a directory exists for the sqlite3 file and if not creates it for you.
This PR is an alternative to #11692 as suggested by @josevalim
Diffstat (limited to 'activerecord')
3 files changed, 30 insertions, 3 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 74f2b2287f..f60ea9838b 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,7 @@ +* Create a directory for sqlite3 file if not present on the system. + + *Richard Schneeman* + * Removed redundant override of `xml` column definition for PG, in order to use `xml` column type instead of `text`. diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb index 7d940fe1c9..16306a78cf 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb @@ -17,12 +17,14 @@ module ActiveRecord # Allow database path relative to Rails.root, but only if # the database path is not the special path that tells # Sqlite to build a database only in memory. - if defined?(Rails.root) && ':memory:' != config[:database] - config[:database] = File.expand_path(config[:database], Rails.root) + if ':memory:' != config[:database] + config[:database] = Pathname.new(config[:database]) + config[:database] = config[:database].expand_path(Rails.root) if defined?(Rails.root) + config[:database].dirname.mkdir unless config[:database].dirname.directory? end db = SQLite3::Database.new( - config[:database], + config[:database].to_s, :results_as_hash => true ) diff --git a/activerecord/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb b/activerecord/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb new file mode 100644 index 0000000000..5a4fe63580 --- /dev/null +++ b/activerecord/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +require "cases/helper" +require 'models/owner' + +module ActiveRecord + module ConnectionAdapters + class SQLite3CreateFolder < ActiveRecord::TestCase + def test_sqlite_creates_directory + Dir.mktmpdir do |dir| + dir = Pathname.new(dir) + @conn = Base.sqlite3_connection :database => dir.join("db/foo.sqlite3"), + :adapter => 'sqlite3', + :timeout => 100 + + assert Dir.exists? dir.join('db') + assert File.exist? dir.join('db/foo.sqlite3') + end + end + end + end +end |