X-Git-Url: http://git.vrable.net/?p=cumulus.git;a=blobdiff_plain;f=ref.h;h=bbbf5b8c5a483868939c174434a09ebcf801face;hp=9a565ee7961dc02a77db68202e75f577f9a809d8;hb=HEAD;hpb=ab51d5778a1f19c204c935de231737df2e62c20c diff --git a/ref.h b/ref.h index 9a565ee..bbbf5b8 100644 --- a/ref.h +++ b/ref.h @@ -1,7 +1,23 @@ -/* LBS: An LFS-inspired filesystem backup system - * Copyright (C) 2007 Michael Vrable +/* Cumulus: Efficient Filesystem Backup to the Cloud + * Copyright (C) 2007-2008 The Cumulus Developers + * See the AUTHORS file for a list of contributors. * - * Backups are structured as a collection of objects, which may refer to other + * 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 2 of the License, or + * (at your option) 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* Backups are structured as a collection of objects, which may refer to other * objects. Object references are used to name other objects or parts of them. * This file defines the class for representing object references and the * textual representation of these references. */ @@ -38,9 +54,12 @@ * a substring rather than the entire string using a range specifier. If no * range specifier is given, then by default the entire object is used. * ::= "+" + * | + * | "=" * Both and are decimal values. If included, the range is * enclosed in brackets. As an abbreviation, if is 0 then the range - * can be given as just (no "+" needed). + * can be given as just (no "+" needed). The "=" form asserts + * that the underlying object is exactly bytes in size. * * When both a checksum and a range are included, note that the checksum is * taken over the entire original object, before the range is taken into @@ -80,6 +99,7 @@ public: std::string get_segment() const { return segment; } std::string get_sequence() const { return object; } std::string get_basename() const { return segment + "/" + object; } + ObjectReference base() const { return ObjectReference(segment, object); } bool has_checksum() const { return checksum_valid; } std::string get_checksum() const { return checksum; } @@ -90,17 +110,27 @@ public: bool has_range() const { return range_valid; } size_t get_range_start() const { return range_start; } size_t get_range_length() const { return range_length; } - void clear_range() { range_start = range_length = 0; range_valid = false; } - void set_range(size_t start, size_t length) - { range_start = start; range_length = length; range_valid = true; } + bool range_is_exact() const { return range_exact; } + void clear_range() + { range_start = range_length = 0; + range_valid = false; range_exact = false; } + void set_range(size_t start, size_t length, bool exact = false) + { range_start = start; range_length = length; + range_valid = true; range_exact = exact; } bool merge(ObjectReference ref); + // Maybe provide non-string implementations? + bool operator==(const ObjectReference &x) const + { return to_string() == x.to_string(); } + bool operator<(const ObjectReference &x) const + { return to_string() < x.to_string(); } + private: RefType type; std::string segment, object, checksum; size_t range_start, range_length; - bool checksum_valid, range_valid; + bool checksum_valid, range_valid, range_exact; }; #endif // _LBS_REF_H