// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
 * Ceph - scalable distributed file system
 *
 * Copyright (C) 2015 Red Hat
 *
 * This is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1, as published by the Free Software
 * Foundation.  See file COPYING.
 *
 */

#include "include/encoding.h"

/**
 * Value class for the xattr we'll use to accumulate
 * the highest object seen for a given inode
 */
class ObjCeiling {
  public:
    uint64_t id;
    uint64_t size;

    ObjCeiling()
      : id(0), size(0)
    {}

    ObjCeiling(uint64_t id_, uint64_t size_)
      : id(id_), size(size_)
    {}

    bool operator >(ObjCeiling const &rhs) const
    {
      return id > rhs.id;
    }

    void encode(bufferlist &bl) const
    {
      ENCODE_START(1, 1, bl);
      ::encode(id, bl);
      ::encode(size, bl);
      ENCODE_FINISH(bl);
    }

    void decode(bufferlist::iterator &p)
    {
      DECODE_START(1, p);
      ::decode(id, p);
      ::decode(size, p);
      DECODE_FINISH(p);
    }
};
WRITE_CLASS_ENCODER(ObjCeiling)

class AccumulateArgs
{
public:
  uint64_t obj_index;
  uint64_t obj_size;
  int64_t mtime;
  std::string obj_xattr_name;
  std::string mtime_xattr_name;
  std::string obj_size_xattr_name;

  AccumulateArgs(
      uint64_t obj_index_,
      uint64_t obj_size_,
      time_t mtime_,
      std::string obj_xattr_name_,
      std::string mtime_xattr_name_,
      std::string obj_size_xattr_name_)
   : obj_index(obj_index_),
     obj_size(obj_size_),
     mtime(mtime_),
     obj_xattr_name(obj_xattr_name_),
     mtime_xattr_name(mtime_xattr_name_),
     obj_size_xattr_name(obj_size_xattr_name_)
  {}

  AccumulateArgs()
    : obj_index(0), obj_size(0), mtime(0)
  {}

  void encode(bufferlist &bl) const
  {
    ENCODE_START(1, 1, bl);
    ::encode(obj_xattr_name, bl);
    ::encode(mtime_xattr_name, bl);
    ::encode(obj_size_xattr_name, bl);
    ::encode(obj_index, bl);
    ::encode(obj_size, bl);
    ::encode(mtime, bl);
    ENCODE_FINISH(bl);
  }

  void decode(bufferlist::iterator &bl)
  {
    DECODE_START(1, bl);
    ::decode(obj_xattr_name, bl);
    ::decode(mtime_xattr_name, bl);
    ::decode(obj_size_xattr_name, bl);
    ::decode(obj_index, bl);
    ::decode(obj_size, bl);
    ::decode(mtime, bl);
    DECODE_FINISH(bl);
  }
};

class AccumulateResult
{
public:
  // Index of the highest-indexed object seen
  uint64_t ceiling_obj_index;
  // Size of the highest-index object seen
  uint64_t ceiling_obj_size;
  // Largest object seen
  uint64_t max_obj_size;
  // Highest mtime seen
  time_t   max_mtime;

  AccumulateResult()
    : ceiling_obj_index(0), ceiling_obj_size(0), max_obj_size(0), max_mtime(0)
  {}
};

