/************************************************************************************************* * Filesystem abstraction * Copyright (C) 2009-2012 FAL Labs * This file is part of Kyoto Cabinet. * This program is free software: you can redistribute it and/or modify it under the terms of * the GNU General Public License as published by the Free Software Foundation, either version * 3 of the License, or any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with this program. * If not, see . *************************************************************************************************/ #ifndef _KCFILE_H // duplication check #define _KCFILE_H #include #include #include namespace kyotocabinet { // common namespace /** * Filesystem abstraction. */ class File { public: struct Status; public: /** Path delimiter character. */ static const char PATHCHR; /** Path delimiter string. */ static const char* const PATHSTR; /** Extension delimiter character. */ static const char EXTCHR; /** Extension delimiter string. */ static const char* const EXTSTR; /** Current directory string. */ static const char* const CDIRSTR; /** Parent directory string. */ static const char* const PDIRSTR; /** * Status information. */ struct Status { bool isdir; ///< whether directory or not int64_t size; ///< file size int64_t mtime; ///< last modified time }; /** * Open modes. */ enum OpenMode { OREADER = 1 << 0, ///< open as a reader OWRITER = 1 << 1, ///< open as a writer OCREATE = 1 << 2, ///< writer creating OTRUNCATE = 1 << 3, ///< writer truncating ONOLOCK = 1 << 4, ///< open without locking OTRYLOCK = 1 << 5 ///< lock without blocking }; /** * Default constructor. */ explicit File(); /** * Destructor. * @note If the file is not closed, it is closed implicitly. */ ~File(); /** * Get the last happened error information. * @return the last happened error information. */ const char* error() const; /** * Open a file. * @param path the path of a file. * @param mode the connection mode. File::OWRITER as a writer, File::OREADER as a reader. * The following may be added to the writer mode by bitwise-or: File::OCREATE, which means it * creates a new file if the file does not exist, File::OTRUNCATE, which means it creates a * new file regardless if the file exists. The following may be added to both of the reader * mode and the writer mode by bitwise-or: File::ONOLOCK, which means it opens the file * without file locking, File::TRYLOCK, which means locking is performed without blocking. * @param msiz the size of the internal memory-mapped region. * @return true on success, or false on failure. */ bool open(const std::string& path, uint32_t mode = OWRITER | OCREATE, int64_t msiz = 0); /** * Close the file. * @return true on success, or false on failure. */ bool close(); /** * Write data. * @param off the offset of the destination. * @param buf the pointer to the data region. * @param size the size of the data region. * @return true on success, or false on failure. */ bool write(int64_t off, const void* buf, size_t size); /** * Write data. * @note Equal to the original File::write method except that the sigunature is different. */ bool write(int64_t off, const std::string& str) { _assert_(off >= 0); return write(off, str.c_str(), str.size()); } /** * Write data with assuring the region does not spill from the file size. * @param off the offset of the destination. * @param buf the pointer to the data region. * @param size the size of the data region. * @return true on success, or false on failure. */ bool write_fast(int64_t off, const void* buf, size_t size); /** * Write data with assuring the region does not spill from the file size. * @note Equal to the original File::write_fast method except that the sigunature is different. */ bool write_fast(int64_t off, const std::string& str) { _assert_(off >= 0); return write_fast(off, str.c_str(), str.size()); } /** * Write data at the end of the file. * @param buf the pointer to the data region. * @param size the size of the data region. * @return true on success, or false on failure. */ bool append(const void* buf, size_t size); /** * Write data at the end of the file. * @note Equal to the original File::append method except that the sigunature is different. */ bool append(const std::string& str) { _assert_(true); return append(str.c_str(), str.size()); } /** * Read data. * @param off the offset of the source. * @param buf the pointer to the destination region. * @param size the size of the data to be read. * @return true on success, or false on failure. */ bool read(int64_t off, void* buf, size_t size); /** * Read data. * @note Equal to the original File::read method except that the sigunature is different. */ bool read(int64_t off, std::string* buf, size_t size) { _assert_(off >= 0 && buf); char* tbuf = new char[size]; if (!read(off, tbuf, size)) { delete[] tbuf; return false; } buf->append(std::string(tbuf, size)); delete[] tbuf; return true; } /** * Read data with assuring the region does not spill from the file size. * @param off the offset of the source. * @param buf the pointer to the destination region. * @param size the size of the data to be read. * @return true on success, or false on failure. */ bool read_fast(int64_t off, void* buf, size_t size); /** * Read data. * @note Equal to the original File::read method except that the sigunature is different. */ bool read_fast(int64_t off, std::string* buf, size_t size) { _assert_(off >= 0 && buf); char* tbuf = new char[size]; if (!read_fast(off, tbuf, size)) { delete[] tbuf; return false; } buf->append(std::string(tbuf, size)); delete[] tbuf; return true; } /** * Truncate the file. * @param size the new size of the file. * @return true on success, or false on failure. */ bool truncate(int64_t size); /** * Synchronize updated contents with the file and the device. * @param hard true for physical synchronization with the device, or false for logical * synchronization with the file system. * @return true on success, or false on failure. */ bool synchronize(bool hard); /** * Refresh the internal state for update by others. * @return true on success, or false on failure. */ bool refresh(); /** * Begin transaction. * @param hard true for physical synchronization with the device, or false for logical * synchronization with the file system. * @param off the beginning offset of the guarded region * @return true on success, or false on failure. */ bool begin_transaction(bool hard, int64_t off); /** * End transaction. * @param commit true to commit the transaction, or false to abort the transaction. * @return true on success, or false on failure. */ bool end_transaction(bool commit); /** * Write a WAL message of transaction explicitly. * @param off the offset of the source. * @param size the size of the data to be read. * @return true on success, or false on failure. */ bool write_transaction(int64_t off, size_t size); /** * Get the size of the file. * @return the size of the file, or 0 on failure. */ int64_t size() const; /** * Get the path of the file. * @return the path of the file in bytes, or an empty string on failure. */ std::string path() const; /** * Check whether the file was recovered or not. * @return true if recovered, or false if not. */ bool recovered() const; /** * Read the whole data from a file. * @param path the path of a file. * @param sp the pointer to the variable into which the size of the region of the return value * is assigned. * @param limit the limit length to read. If it is nagative, no limit is specified. * @return the pointer to the region of the read data, or NULL on failure. * @note Because an additional zero code is appended at the end of the region of the return * value, the return value can be treated as a C-style string. Because the region of the * return value is allocated with the the new[] operator, it should be released with the * delete[] operator when it is no longer in use. */ static char* read_file(const std::string& path, int64_t* sp, int64_t limit = -1); /** * Write the whole data into a file. * @param path the path of a file. * @param buf the data buffer to write. * @param size the size of the data buffer. * @return true on success, or false on failure. * @note The existing file corresponding to the path is overwritten. If no file corresponds * to the path, a new file is created. */ static bool write_file(const std::string& path, const char* buf, int64_t size); /** * Get the status information of a file. * @param path the path of a file. * @param buf a structure of status information. If it is NULL, it is omitted. * @return true on success, or false on failure. */ static bool status(const std::string& path, Status* buf = NULL); /** * Get the absolute path of a file. * @param path the path of a file. * @return the absolute path of the file, or an empty string on failure. */ static std::string absolute_path(const std::string& path); /** * Remove a file. * @param path the path of a file. * @return true on success, or false on failure. */ static bool remove(const std::string& path); /** * Change the name or location of a file. * @param opath the old path of a file. * @param npath the new path of a file. * @return true on success, or false on failure. */ static bool rename(const std::string& opath, const std::string& npath); /** * Read a directory. * @param path the path of a directory. * @param strvec a string list to contain the result. * @return true on success, or false on failure. */ static bool read_directory(const std::string& path, std::vector* strvec); /** * Make a directory. * @param path the path of a directory. * @return true on success, or false on failure. */ static bool make_directory(const std::string& path); /** * Remove a directory. * @param path the path of a directory. * @return true on success, or false on failure. */ static bool remove_directory(const std::string& path); /** * Remove a file or a directory recursively. * @param path the path of a file or a directory. * @return true on success, or false on failure. */ static bool remove_recursively(const std::string& path); /** * Get the path of the current working directory. * @return the path of the current working directory, or an empty string on failure. */ static std::string get_current_directory(); /** * Set the current working directory. * @param path the path of a directory. * @return true on success, or false on failure. */ static bool set_current_directory(const std::string& path); /** * Synchronize the whole of the file system with the device. * @return true on success, or false on failure. */ static bool synchronize_whole(); private: /** Dummy constructor to forbid the use. */ File(const File&); /** Dummy Operator to forbid the use. */ File& operator =(const File&); /** Opaque pointer. */ void* opq_; }; /** * Directory stream abstraction. */ class DirStream { public: /** * Default constructor. */ explicit DirStream(); /** * Destructor. * @note If the file is not closed, it is closed implicitly. */ ~DirStream(); /** * Open a directory. * @param path the path of a directory. * @return true on success, or false on failure. */ bool open(const std::string& path); /** * Close the file. * @return true on success, or false on failure. */ bool close(); /** * Read the next file in the directory. * @param path a string to store the file path. * @return true on success, or false on failure. */ bool read(std::string* path); private: /** Dummy constructor to forbid the use. */ DirStream(const DirStream&); /** Dummy Operator to forbid the use. */ DirStream& operator =(const DirStream&); /** Opaque pointer. */ void* opq_; }; } // common namespace #endif // duplication check // END OF FILE