10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions are 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * met: 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions of source code must retain the above copyright 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions in binary form must reproduce the above 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * in the documentation and/or other materials provided with the 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * distribution. 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Neither the name of Google Inc. nor the names of its 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * contributors may be used to endorse or promote products derived from 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * this software without specific prior written permission. 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#define __STDC_FORMAT_MACROS 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h" 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "SQLiteFileSystem.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 35cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(DATABASE) 36cad810f21b803229eb11403f9209855525a25d57Steve Block 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FileSystem.h" 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "SQLiteDatabase.h" 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "SQLiteStatement.h" 40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <inttypes.h> 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <sqlite3.h> 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochSQLiteFileSystem::SQLiteFileSystem() 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid SQLiteFileSystem::registerSQLiteVFS() 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint SQLiteFileSystem::openDatabase(const String& fileName, sqlite3** database, bool) 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // SQLite expects a null terminator on its UTF-16 strings. 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String path = fileName; 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return sqlite3_open16(path.charactersWithNullTermination(), database); 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString SQLiteFileSystem::getFileNameForNewDatabase(const String& dbDir, const String&, 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const String&, SQLiteDatabase* db) 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // try to get the next sequence number from the given database 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // if we can't get a number, return an empty string 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch SQLiteStatement sequenceStatement(*db, "SELECT seq FROM sqlite_sequence WHERE name='Databases';"); 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (sequenceStatement.prepare() != SQLResultOk) 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return String(); 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int result = sequenceStatement.step(); 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int64_t seq = 0; 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (result == SQLResultRow) 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch seq = sequenceStatement.getColumnInt64(0); 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else if (result != SQLResultDone) 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return String(); 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sequenceStatement.finalize(); 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // increment the number until we can use it to form a file name that doesn't exist 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String fileName; 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch do { 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ++seq; 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen fileName = pathByAppendingComponent(dbDir, String::format("%016"PRIx64".db", seq)); 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } while (fileExists(fileName)); 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return String::format("%016"PRIx64".db", seq); 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString SQLiteFileSystem::appendDatabaseFileNameToPath(const String& path, const String& fileName) 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return pathByAppendingComponent(path, fileName); 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool SQLiteFileSystem::ensureDatabaseDirectoryExists(const String& path) 920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (path.isEmpty()) 940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return makeAllDirectories(path); 960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool SQLiteFileSystem::ensureDatabaseFileExists(const String& fileName, bool checkPathOnly) 990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (fileName.isEmpty()) 1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (checkPathOnly) { 1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String dir = directoryName(fileName); 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return ensureDatabaseDirectoryExists(dir); 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return fileExists(fileName); 1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool SQLiteFileSystem::deleteEmptyDatabaseDirectory(const String& path) 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return deleteEmptyDirectory(path); 1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool SQLiteFileSystem::deleteDatabaseFile(const String& fileName) 1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return deleteFile(fileName); 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochlong long SQLiteFileSystem::getDatabaseFileSize(const String& fileName) 1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch long long size; 1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return getFileSize(fileName, size) ? size : 0; 1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 128cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // ENABLE(DATABASE) 129