# # patch "ChangeLog" # from [3e5ee0a748faa548a5c1960c74a1c1df3bcadd5e] # to [5e4e187101bf5df8e847e24ef7f5887ed4fcafdc] # # patch "database.cc" # from [e9d9e9705f90c63727646989a770d9d35101c1cd] # to [40ff00daadefb82b98ce4e263753f5e8130910af] # # patch "database.hh" # from [a25c05b9b4ae523a61d846f7d21817cde40580bb] # to [48185472bf59290407f62e46e7f620b5c625e386] # ======================================================================== --- ChangeLog 3e5ee0a748faa548a5c1960c74a1c1df3bcadd5e +++ ChangeLog 5e4e187101bf5df8e847e24ef7f5887ed4fcafdc @@ -1,5 +1,10 @@ 2005-12-01 Matthew Gregan + * database.cc: Revert last change; db version and db migrate need + to be able to open databases with old schema versions. Calling + sql() directly broke this. Moved a db existence check scattered + through the code into db_check_exists(), and added calls to this + into ::version and ::migrate. * database.cc (database::version, database::migrate): Improve error handling where user has supplied the path to a non-existant database file. Submitted by Neil Conway. ======================================================================== --- database.cc e9d9e9705f90c63727646989a770d9d35101c1cd +++ database.cc 40ff00daadefb82b98ce4e263753f5e8130910af @@ -130,33 +130,29 @@ sqlite3_result_blob(f, unpacked().c_str(), unpacked().size(), SQLITE_TRANSIENT); } -void +void database::set_app(app_state * app) { __app = app; } -static void +static void check_sqlite_format_version(system_path const & filename) { - require_path_is_file(filename, - F("database %s does not exist") % filename, - F("%s is a directory, not a database") % filename); - // sqlite 3 files begin with this constant string // (version 2 files begin with a different one) std::string version_string("SQLite format 3"); - + std::ifstream file(filename.as_external().c_str()); N(file, F("unable to probe database version in file %s") % filename); - + for (std::string::const_iterator i = version_string.begin(); i != version_string.end(); ++i) { char c; file.get(c); N(c == *i, F("database %s is not an sqlite version 3 file, " - "try dump and reload") % filename); + "try dump and reload") % filename); } } @@ -201,9 +197,7 @@ if (! init) { - require_path_is_file(filename, - F("database %s does not exist") % filename, - F("%s is a directory, not a database") % filename); + check_db_exists(); check_sqlite_format_version(filename); } @@ -466,15 +460,27 @@ { string id; - calculate_schema_id(sql(), id); + check_filename(); + check_db_exists(); + open(); + calculate_schema_id(__sql, id); + + close(); + out << F("database schema version: %s") % id << endl; } void database::migrate() { - migrate_monotone_schema(sql(), __app); + check_filename(); + check_db_exists(); + open(); + + migrate_monotone_schema(__sql, __app); + + close(); } void @@ -2508,6 +2514,14 @@ } +void +database::check_db_exists() +{ + require_path_is_file(filename, + F("database %s does not exist") % filename, + F("%s is a directory, not a database") % filename); +} + bool database::database_specified() { ======================================================================== --- database.hh a25c05b9b4ae523a61d846f7d21817cde40580bb +++ database.hh 48185472bf59290407f62e46e7f620b5c625e386 @@ -203,6 +203,7 @@ database & db); void check_filename(); + void check_db_exists(); void open(); void close();