8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-27 17:23:03 +01:00
firebird-mirror/src/jrd/os/path_utils.h
2009-01-03 09:14:29 +00:00

159 lines
6.2 KiB
C++

/*
* PROGRAM: JRD FileSystem Path Handler
* MODULE: path_utils.h
* DESCRIPTION: Abstract class for file path management
*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
*
* Software distributed under the License is distributed AS IS,
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
* See the License for the specific language governing rights
* and limitations under the License.
*
* The Original Code was created by John Bellardo
* for the Firebird Open Source RDBMS project.
*
* Copyright (c) 2002 John Bellardo <bellardo at cs.ucsd.edu>
* and all contributors signed below.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*
*/
#ifndef JRD_OS_PATH_UTILS_H
#define JRD_OS_PATH_UTILS_H
#include "../common/classes/fb_string.h"
#include "../../common/classes/alloc.h"
/** This is a utility class that provides a platform independent way to do some
file path operations. The operations include determining if a path is
relative ro absolute, combining to paths to form a new path (adding directory
separator), isolating the last component in a path, and getting a listing
of all the files in a given directory. Each supported platform will require
an implementation of these abstractions that is appropriate for that platform.
**/
class PathUtils
{
public:
/// The directory separator for the platform.
static const char dir_sep;
/// String used to point to parent directory
static const char* up_dir_link;
/** An abstract base class for iterating through the contents of a directory.
Instances of this class are created using the newDirItr method of
the PathUtils class. Each platform implementation is expected to
subclass dir_iterator to create dir_iterator objects that function
correctly on the platform.
**/
class dir_iterator : protected Firebird::AutoStorage
{
public:
/// The constructor requires a string that is the path of the
/// directory being iterater.
/// dir_iterator may be located on stack, therefore use AutoStorage
dir_iterator(MemoryPool& p, const Firebird::PathName& dir)
: AutoStorage(p), dirPrefix(getPool(), dir)
{}
dir_iterator(const Firebird::PathName& dir)
: AutoStorage(), dirPrefix(getPool(), dir)
{}
/// destructor provided for memory cleanup.
virtual ~dir_iterator() {}
/// The prefix increment operator (++itr) advances the iteration by
/// one and returns a reference to itself to allow cascading operations.
virtual const dir_iterator& operator++() = 0;
/// The dereference operator returns a reference to the current
/// item in the iteration. This path is prefixed with the path of
/// the directory. If the last element of the path is wanted use
/// PathUtils::splitLastComponent on the result of this function.
virtual const Firebird::PathName& operator*() = 0;
/// Tests if the iterator has reached the end of the iteration.
/// It is implemented in such a way to make the following for loop
/// work correctly: for (dir_iterator *itr = PathUtils::newDirItr(); *itr; ++(*itr))
virtual operator bool() = 0;
protected:
/// Stores the path to the directory as given in the constructor.
const Firebird::PathName dirPrefix;
private:
/// default constructor not allowed.
dir_iterator(); // no impl
/// copy constructor not allowed
dir_iterator(const dir_iterator&); // no impl
/// assignment operator not allowed
const dir_iterator& operator=(const dir_iterator&); // no impl
};
/** isRelative returns true if the given path is relative, and false if not.
A relative path is one specified in relation to the current directory.
For example, the path 'firebird/bin' is a relative path in unix while
the path '/opt/firebird/bin' is not.
**/
static bool isRelative(const Firebird::PathName& path);
/** isSymLink returns true if the given path is symbolic link, and false if not.
Use of this links may provide way to override system security.
Example: ln -s /usr/firebird/ExternalTables/mytable /etc/xinet.d/remoteshell
and insert desired rows into mytable.
**/
static bool isSymLink(const Firebird::PathName& path);
/** canAccess returns true if the given path can be accessed
by this process. mode - like in ACCESS(2).
**/
static bool canAccess(const Firebird::PathName& path, int mode);
/** Concatenates the two paths given in the second and third parameters,
and writes the resulting path into the first parameter. The
two path input arguments (arg 2 and 3) are concatenated in the order
arg2 arg3. The concatenation is done is such a way as to remove
any duplicate directory separators that may have resulted from
a simple string concatenation of the arguments with the directory
separator character.
**/
static void concatPath(Firebird::PathName&, const Firebird::PathName&,
const Firebird::PathName&);
// Tries to ensure our path finishes with a platform-specific directory separator.
// We don't work correctly with MBCS.
static void ensureSeparator(Firebird::PathName& in_out);
/** splitLastComponent takes a path as the third argument and
removes the last component in that path (usually a file or directory name).
The removed component is returned in the second parameter, and the path left
after the component is removed is returned in the first parameter.
If the input path has only one component that component is returned in the
second parameter and the first parameter is set to the empty string.
**/
static void splitLastComponent(Firebird::PathName&, Firebird::PathName&,
const Firebird::PathName&);
/** This is the factory method for allocating dir_iterator objects.
It takes a reference to a memory pool to use for all heap allocations,
and the path of the directory to iterate (in that order). It is the
responsibility of the caller to delete the object when they are done with it.
All errors result in either exceptions being thrown, or a valid empty
dir_iterator being returned.
**/
static dir_iterator* newDirItr(MemoryPool&, const Firebird::PathName&);
};
#endif // JRD_OS_PATH_UTILS_H