/* | |
* Copyright (C) 2009 Google Inc. All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are | |
* met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* * Redistributions in binary form must reproduce the above | |
* copyright notice, this list of conditions and the following disclaimer | |
* in the documentation and/or other materials provided with the | |
* distribution. | |
* * Neither the name of Google Inc. nor the names of its | |
* contributors may be used to endorse or promote products derived from | |
* this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
#include "config.h" | |
#include "SQLiteFileSystem.h" | |
#include "FileSystem.h" | |
#include "SQLiteDatabase.h" | |
#include "SQLiteStatement.h" | |
#include <sqlite3.h> | |
namespace WebCore { | |
SQLiteFileSystem::SQLiteFileSystem() | |
{ | |
} | |
void SQLiteFileSystem::registerSQLiteVFS() | |
{ | |
} | |
int SQLiteFileSystem::openDatabase(const String& fileName, sqlite3** database) | |
{ | |
// SQLite expects a null terminator on its UTF-16 strings. | |
String path = fileName; | |
return sqlite3_open16(path.charactersWithNullTermination(), database); | |
} | |
String SQLiteFileSystem::getFileNameForNewDatabase(const String& dbDir, const String&, | |
const String&, SQLiteDatabase* db) | |
{ | |
// try to get the next sequence number from the given database | |
// if we can't get a number, return an empty string | |
SQLiteStatement sequenceStatement(*db, "SELECT seq FROM sqlite_sequence WHERE name='Databases';"); | |
if (sequenceStatement.prepare() != SQLResultOk) | |
return String(); | |
int result = sequenceStatement.step(); | |
int64_t seq = 0; | |
if (result == SQLResultRow) | |
seq = sequenceStatement.getColumnInt64(0); | |
else if (result != SQLResultDone) | |
return String(); | |
sequenceStatement.finalize(); | |
// increment the number until we can use it to form a file name that doesn't exist | |
String fileName; | |
do { | |
++seq; | |
fileName = pathByAppendingComponent(dbDir, String::format("%016llx.db", seq)); | |
} while (fileExists(fileName)); | |
return String::format("%016llx.db", seq); | |
} | |
String SQLiteFileSystem::appendDatabaseFileNameToPath(const String& path, const String& fileName) | |
{ | |
return pathByAppendingComponent(path, fileName); | |
} | |
bool SQLiteFileSystem::ensureDatabaseDirectoryExists(const String& path) | |
{ | |
if (path.isEmpty()) | |
return false; | |
return makeAllDirectories(path); | |
} | |
bool SQLiteFileSystem::ensureDatabaseFileExists(const String& fileName, bool checkPathOnly) | |
{ | |
if (fileName.isEmpty()) | |
return false; | |
if (checkPathOnly) { | |
String dir = directoryName(fileName); | |
return ensureDatabaseDirectoryExists(dir); | |
} | |
return fileExists(fileName); | |
} | |
bool SQLiteFileSystem::deleteEmptyDatabaseDirectory(const String& path) | |
{ | |
return deleteEmptyDirectory(path); | |
} | |
bool SQLiteFileSystem::deleteDatabaseFile(const String& fileName) | |
{ | |
return deleteFile(fileName); | |
} | |
long long SQLiteFileSystem::getDatabaseFileSize(const String& fileName) | |
{ | |
long long size; | |
return getFileSize(fileName, size) ? size : 0; | |
} | |
} // namespace WebCore |