1
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2
// vim: ts=8 sw=2 smarttab
4
* Ceph - scalable distributed file system
6
* Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
8
* This is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License version 2.1, as published by the Free Software
11
* Foundation. See file COPYING.
15
#ifndef CEPH_CLASSLIBRARY_H
16
#define CEPH_CLASSLIBRARY_H
18
#include "include/types.h"
19
#include "include/encoding.h"
21
#include "common/ClassVersion.h"
28
void encode(bufferlist& bl) const {
34
void decode(bufferlist::iterator& bl) {
43
WRITE_CLASS_ENCODER(ClassImpl)
50
void encode(bufferlist& bl) const {
54
::encode(version, bl);
56
void decode(bufferlist::iterator& bl) {
60
::decode(version, bl);
64
WRITE_CLASS_ENCODER(ClassInfo)
73
struct ClassLibraryIncremental {
78
void encode(bufferlist& bl) const {
81
__u32 _op = (__u32)op;
86
void decode(bufferlist::iterator& bl) {
91
op = (ClassLibraryIncOp)_op;
92
assert( op >= CLASS_INC_NOP && op <= CLASS_INC_ACTIVATE);
97
void decode_impl(ClassImpl& i) {
98
bufferlist::iterator iter = impl.begin();
102
void decode_info(ClassInfo& l) {
103
bufferlist::iterator iter = info.begin();
108
WRITE_CLASS_ENCODER(ClassLibraryIncremental)
110
typedef map<ClassVersion, ClassInfo> tClassVersionMap;
111
class ClassVersionMap
117
void encode(bufferlist& bl) const {
122
void decode(bufferlist::iterator& bl) {
128
tClassVersionMap::iterator begin() { return m.begin(); }
129
tClassVersionMap::iterator end() { return m.end(); }
131
void add(ClassInfo& library) {
132
m[library.version] = library;
133
if (default_ver.length() == 0)
134
default_ver = library.version.ver;
137
void remove(ClassInfo& library) {
138
tClassVersionMap::iterator iter;
139
iter = m.find(library.version);
140
if (iter != m.end()) {
145
ClassInfo *get(ClassVersion& ver);
146
void set_default(string ver) { default_ver = ver; }
148
WRITE_CLASS_ENCODER(ClassVersionMap)
150
struct ClassLibrary {
152
map<string, ClassVersionMap> library_map;
154
ClassLibrary() : version(0) {}
156
void add(const string& name, const ClassVersion& version) {
158
library.version = version;
163
void add(ClassInfo& library) {
164
ClassVersionMap& vmap = library_map[library.name];
168
void remove(const string& name, const ClassVersion& version) {
169
map<string, ClassVersionMap>::iterator mapiter = library_map.find(name);
170
if (mapiter == library_map.end())
172
library_map.erase(mapiter);
175
bool contains(string& name) {
176
return (library_map.find(name) != library_map.end());
178
bool get_ver(string& name, ClassVersion& reqver, ClassVersion *ver) {
179
map<string, ClassVersionMap>::iterator mapiter = library_map.find(name);
180
if (mapiter == library_map.end())
183
ClassVersionMap& map = mapiter->second;
184
ClassInfo *info = map.get(reqver);
186
*ver = info->version;
188
return (info != NULL);
190
void encode(bufferlist& bl) const {
193
::encode(version, bl);
194
::encode(library_map, bl);
196
void decode(bufferlist::iterator& bl) {
199
::decode(version, bl);
200
::decode(library_map, bl);
203
WRITE_CLASS_ENCODER(ClassLibrary)
205
inline ostream& operator<<(ostream& out, const ClassInfo& e)
207
return out << e.name << " (v" << e.version << ")";