Revision: 813 http://trac.macosforge.org/projects/darwinbuild/changeset/813 Author: wsiegrist@apple.com Date: 2010-04-19 16:32:00 -0700 (Mon, 19 Apr 2010) Log Message: ----------- Pre-flight some access checks so we can exit with meaningful errors instead of assertions. Modified Paths: -------------- branches/PR-6973110/darwinup/Database.cpp branches/PR-6973110/darwinup/Database.h branches/PR-6973110/darwinup/Depot.cpp Modified: branches/PR-6973110/darwinup/Database.cpp =================================================================== --- branches/PR-6973110/darwinup/Database.cpp 2010-04-19 21:25:32 UTC (rev 812) +++ branches/PR-6973110/darwinup/Database.cpp 2010-04-19 23:32:00 UTC (rev 813) @@ -121,8 +121,22 @@ fprintf(stderr, "Error: pre-connection failed.\n"); return res; } - + + // test our access level int exists = is_regular_file(m_path); + bool readonly = false; + if (!exists && access(dirname(m_path), W_OK | X_OK)) { + // does not exist and we cannot write to the directory + fprintf(stderr, + "Error: Unable to create new darwinup database. " + "Try running as root."); + return DB_ERROR; + } + if (exists && access(m_path, W_OK)) { + // db exists already but we cannot write to it + readonly = true; + } + res = sqlite3_open(m_path, &m_db); if (res) { sqlite3_close(m_db); @@ -137,7 +151,7 @@ fprintf(stderr, "Error: post-connection failed.\n"); return res; } - + if (!exists) { // create schema since it is empty assert(this->create_tables() == 0); @@ -150,12 +164,23 @@ } if (version < this->m_schema_version) { + if (readonly) { + fprintf(stderr, + "Error: the darwinup database needs to be upgraded " + "but darwinup cannot write to database. " + "Try running as root.\n"); + sqlite3_close(m_db); + m_db = NULL; + return DB_ERROR; + } IF_DEBUG("Upgrading schema from %u to %u \n", version, this->m_schema_version); assert(this->upgrade_schema(version) == 0); assert(this->set_schema_version(this->m_schema_version) == 0); } if (version > this->m_schema_version) { fprintf(stderr, "Error: this client is too old!\n"); + sqlite3_close(m_db); + m_db = NULL; return DB_ERROR; } } @@ -203,6 +228,10 @@ return this->connect(); } +bool Database::is_connected() { + return m_db != NULL; +} + int Database::begin_transaction() { return this->execute(m_begin_transaction); } Modified: branches/PR-6973110/darwinup/Database.h =================================================================== --- branches/PR-6973110/darwinup/Database.h 2010-04-19 21:25:32 UTC (rev 812) +++ branches/PR-6973110/darwinup/Database.h 2010-04-19 23:32:00 UTC (rev 813) @@ -136,6 +136,7 @@ const char* error(); int connect(); int connect(const char* path); + bool is_connected(); int begin_transaction(); int rollback_transaction(); Modified: branches/PR-6973110/darwinup/Depot.cpp =================================================================== --- branches/PR-6973110/darwinup/Depot.cpp 2010-04-19 21:25:32 UTC (rev 812) +++ branches/PR-6973110/darwinup/Depot.cpp 2010-04-19 23:32:00 UTC (rev 813) @@ -98,8 +98,8 @@ int Depot::connect() { m_db = new DarwinupDatabase(m_database_path); - if (!m_db) { - fprintf(stderr, "Error: unable to connect to database in Depot::connect().\n"); + if (!m_db || !m_db->is_connected()) { + fprintf(stderr, "Error: unable to connect to database.\n"); return 1; } return 0;
participants (1)
-
source_changes@macosforge.org