summaryrefslogtreecommitdiff
path: root/qpid/cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2010-02-03 13:35:58 +0000
committerTed Ross <tross@apache.org>2010-02-03 13:35:58 +0000
commitb5d8b71528b9fcb391bbc4c53c77807830d25581 (patch)
tree69fb9fd810f1fe842dac2edeeb688f8155c526e5 /qpid/cpp
parentf06e46336c1585e4b82cc7f3ddfd799c4ed7166d (diff)
downloadqpid-python-b5d8b71528b9fcb391bbc4c53c77807830d25581.tar.gz
Changes to management code generation:
1) Added readProperties(Buffer) method to ManagementObject to help in the serialization and unserialization of data for cluster replication. 2) Added hooks to ManagementObject and ObjectId to prepare for QMFv2 object naming. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@906038 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
-rw-r--r--qpid/cpp/include/qpid/management/ManagementObject.h6
-rw-r--r--qpid/cpp/managementgen/qmfgen/management-types.xml58
-rwxr-xr-xqpid/cpp/managementgen/qmfgen/schema.py33
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Class.cpp21
-rw-r--r--qpid/cpp/managementgen/qmfgen/templates/Class.h2
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp1
-rw-r--r--qpid/cpp/src/qpid/management/ManagementObject.cpp15
7 files changed, 107 insertions, 29 deletions
diff --git a/qpid/cpp/include/qpid/management/ManagementObject.h b/qpid/cpp/include/qpid/management/ManagementObject.h
index d0a443d6cb..c4921269ba 100644
--- a/qpid/cpp/include/qpid/management/ManagementObject.h
+++ b/qpid/cpp/include/qpid/management/ManagementObject.h
@@ -51,6 +51,7 @@ protected:
const AgentAttachment* agent;
uint64_t first;
uint64_t second;
+ std::string v2Key;
void fromString(const std::string&);
public:
QPID_COMMON_EXTERN ObjectId() : agent(0), first(0), second(0) {}
@@ -63,6 +64,8 @@ public:
QPID_COMMON_EXTERN bool operator<(const ObjectId &other) const;
QPID_COMMON_EXTERN void encode(framing::Buffer& buffer);
QPID_COMMON_EXTERN void decode(framing::Buffer& buffer);
+ QPID_COMMON_EXTERN void setV2Key(const std::string& key) { v2Key = key; }
+ QPID_COMMON_EXTERN const std::string& getV2Key() const { return v2Key; }
friend QPID_COMMON_EXTERN std::ostream& operator<<(std::ostream&, const ObjectId&);
};
@@ -128,6 +131,7 @@ protected:
QPID_COMMON_EXTERN int getThreadIndex();
QPID_COMMON_EXTERN void writeTimestamps(qpid::framing::Buffer& buf);
+ QPID_COMMON_EXTERN void readTimestamps(qpid::framing::Buffer& buf);
public:
QPID_COMMON_EXTERN static int maxThreads;
@@ -141,12 +145,14 @@ protected:
virtual ~ManagementObject() {}
virtual writeSchemaCall_t getWriteSchemaCall() = 0;
+ virtual void readProperties(qpid::framing::Buffer& buf) = 0;
virtual void writeProperties(qpid::framing::Buffer& buf) = 0;
virtual void writeStatistics(qpid::framing::Buffer& buf,
bool skipHeaders = false) = 0;
virtual void doMethod(std::string& methodName,
qpid::framing::Buffer& inBuf,
qpid::framing::Buffer& outBuf) = 0;
+ virtual std::string getKey() const = 0;
QPID_COMMON_EXTERN virtual void setReference(ObjectId objectId);
virtual std::string& getClassName() const = 0;
diff --git a/qpid/cpp/managementgen/qmfgen/management-types.xml b/qpid/cpp/managementgen/qmfgen/management-types.xml
index 626880afb3..f3894cc962 100644
--- a/qpid/cpp/managementgen/qmfgen/management-types.xml
+++ b/qpid/cpp/managementgen/qmfgen/management-types.xml
@@ -19,38 +19,38 @@
under the License.
-->
-<type name="objId" base="REF" cpp="::qpid::management::ObjectId" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::management::ObjectId()" byRef="y"/>
-<type name="uint8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" accessor="direct" init="0"/>
-<type name="uint16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" accessor="direct" init="0"/>
-<type name="uint32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" accessor="direct" init="0"/>
-<type name="uint64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
-<type name="int8" base="S8" cpp="int8_t" encode="@.putInt8(#)" decode="# = @.getInt8()" accessor="direct" init="0"/>
-<type name="int16" base="S16" cpp="int16_t" encode="@.putInt16(#)" decode="# = @.getInt16()" accessor="direct" init="0"/>
-<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" accessor="direct" init="0"/>
-<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" accessor="direct" init="0"/>
-<type name="bool" base="BOOL" cpp="uint8_t" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" accessor="direct" init="0"/>
-<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" accessor="direct" init='""' byRef="y"/>
-<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" accessor="direct" init='""' byRef="y"/>
-<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
-<type name="deltaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
-<type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" accessor="direct" init="0."/>
-<type name="double" base="DOUBLE" cpp="double" encode="@.putDouble(#)" decode="# = @.getDouble()" accessor="direct" init="0."/>
-<type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::Uuid()" byRef="y"/>
-<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/>
+<type name="objId" base="REF" cpp="::qpid::management::ObjectId" encode="#.encode(@)" decode="#.decode(@)" stream="#.getV2Key()" accessor="direct" init="::qpid::management::ObjectId()" byRef="y"/>
+<type name="uint8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" stream="#" accessor="direct" init="0"/>
+<type name="uint16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" stream="#" accessor="direct" init="0"/>
+<type name="uint32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" stream="#" accessor="direct" init="0"/>
+<type name="uint64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" accessor="direct" init="0"/>
+<type name="int8" base="S8" cpp="int8_t" encode="@.putInt8(#)" decode="# = @.getInt8()" stream="#" accessor="direct" init="0"/>
+<type name="int16" base="S16" cpp="int16_t" encode="@.putInt16(#)" decode="# = @.getInt16()" stream="#" accessor="direct" init="0"/>
+<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" stream="#" accessor="direct" init="0"/>
+<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" stream="#" accessor="direct" init="0"/>
+<type name="bool" base="BOOL" cpp="uint8_t" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" accessor="direct" init="0"/>
+<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" stream="#" accessor="direct" init='""' byRef="y"/>
+<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" stream="#" accessor="direct" init='""' byRef="y"/>
+<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" accessor="direct" init="0"/>
+<type name="deltaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" accessor="direct" init="0"/>
+<type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" stream="#" accessor="direct" init="0."/>
+<type name="double" base="DOUBLE" cpp="double" encode="@.putDouble(#)" decode="# = @.getDouble()" stream="#" accessor="direct" init="0."/>
+<type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" stream="#" accessor="direct" init="::qpid::framing::Uuid()" byRef="y"/>
+<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" stream="#" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/>
-<type name="hilo8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" style="wm" accessor="counter" init="0"/>
-<type name="hilo16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" style="wm" accessor="counter" init="0"/>
-<type name="hilo32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="wm" accessor="counter" init="0"/>
-<type name="hilo64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="wm" accessor="counter" init="0"/>
+<type name="hilo8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" style="wm" stream="#" accessor="counter" init="0"/>
+<type name="hilo16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" style="wm" stream="#" accessor="counter" init="0"/>
+<type name="hilo32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="wm" stream="#" accessor="counter" init="0"/>
+<type name="hilo64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="wm" stream="#" accessor="counter" init="0"/>
-<type name="count8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" accessor="counter" init="0" perThread="y"/>
-<type name="count16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" accessor="counter" init="0" perThread="y"/>
-<type name="count32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" accessor="counter" init="0" perThread="y"/>
-<type name="count64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="counter" init="0" perThread="y"/>
+<type name="count8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" stream="#" accessor="counter" init="0" perThread="y"/>
+<type name="count16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" stream="#" accessor="counter" init="0" perThread="y"/>
+<type name="count32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" stream="#" accessor="counter" init="0" perThread="y"/>
+<type name="count64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" accessor="counter" init="0" perThread="y"/>
<!-- Min/Max/Average statistics -->
-<type name="mma32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="mma" accessor="direct" init="0" perThread="y"/>
-<type name="mma64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" accessor="direct" init="0" perThread="y"/>
-<type name="mmaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" accessor="direct" init="0" perThread="y"/>
+<type name="mma32" base="U32" cpp="uint32_t" encode="@.putLong(#)" decode="# = @.getLong()" style="mma" stream="#" accessor="direct" init="0" perThread="y"/>
+<type name="mma64" base="U64" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" stream="#" accessor="direct" init="0" perThread="y"/>
+<type name="mmaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" style="mma" stream="#" accessor="direct" init="0" perThread="y"/>
</schema-types>
diff --git a/qpid/cpp/managementgen/qmfgen/schema.py b/qpid/cpp/managementgen/qmfgen/schema.py
index 3b53830c69..51466c7860 100755
--- a/qpid/cpp/managementgen/qmfgen/schema.py
+++ b/qpid/cpp/managementgen/qmfgen/schema.py
@@ -58,6 +58,7 @@ class SchemaType:
self.encode = None
self.decode = None
self.style = "normal"
+ self.stream = "#"
self.accessor = None
self.init = "0"
self.perThread = False
@@ -85,6 +86,9 @@ class SchemaType:
elif key == 'style':
self.style = val
+ elif key == 'stream':
+ self.stream = val
+
elif key == 'accessor':
self.accessor = val
@@ -200,6 +204,9 @@ class SchemaType:
stream.write (" threadStats->" + varName + "Min = std::numeric_limits<" + cpptype + ">::max();\n")
stream.write (" threadStats->" + varName + "Max = std::numeric_limits<" + cpptype + ">::min();\n")
+ def genRead (self, stream, varName, indent=" "):
+ stream.write(indent + self.decode.replace("@", "buf").replace("#", varName) + ";\n")
+
def genWrite (self, stream, varName, indent=" "):
if self.style != "mma":
stream.write (indent + self.encode.replace ("@", "buf").replace ("#", varName) + ";\n")
@@ -381,6 +388,15 @@ class SchemaProperty:
stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
stream.write (" buf.put (ft);\n\n")
+ def genRead (self, stream):
+ indent = " "
+ if self.isOptional:
+ stream.write(" if (presenceMask[presenceByte_%s] & presenceMask_%s) {\n" % (self.name, self.name))
+ indent = " "
+ self.type.type.genRead (stream, self.name, indent)
+ if self.isOptional:
+ stream.write(" }\n")
+
def genWrite (self, stream):
indent = " "
if self.isOptional:
@@ -1054,6 +1070,19 @@ class SchemaClass:
if element.type.type.perThread:
element.genDeclaration (stream, " ")
+ def genPrimaryKey (self, stream, variables):
+ first = 1
+ for prop in self.properties:
+ if prop.isIndex == 1:
+ if first:
+ first = None
+ else:
+ stream.write(" << \",\";\n")
+ var = prop.type.type.stream.replace("#", prop.getName())
+ stream.write(" key << %s" % var)
+ if not first:
+ stream.write(";")
+
def genNamespace (self, stream, variables):
stream.write("::".join(self.packageName.split(".")))
@@ -1182,6 +1211,10 @@ class SchemaClass:
if inst.type.type.perThread:
inst.genAssign (stream)
+ def genReadProperties (self, stream, variables):
+ for prop in self.properties:
+ prop.genRead (stream)
+
def genWriteProperties (self, stream, variables):
for prop in self.properties:
prop.genWrite (stream)
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Class.cpp b/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
index 973d92586a..8312f35c64 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
+++ b/qpid/cpp/managementgen/qmfgen/templates/Class.cpp
@@ -26,6 +26,7 @@
#include "qpid//*MGEN:Class.AgentHeaderLocation*//ManagementAgent.h"
#include "/*MGEN:Class.NameCap*/.h"
/*MGEN:Class.MethodArgIncludes*/
+#include <iostream>
using namespace qmf::/*MGEN:Class.Namespace*/;
using namespace qpid::framing;
@@ -123,6 +124,17 @@ void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* tota
}
/*MGEN:ENDIF*/
+void /*MGEN:Class.NameCap*/::readProperties (Buffer& buf)
+{
+ ::qpid::sys::Mutex::ScopedLock mutex(accessLock);
+ readTimestamps(buf);
+/*MGEN:IF(Class.ExistOptionals)*/
+ for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++)
+ presenceMask[idx] = buf.getOctet();
+/*MGEN:ENDIF*/
+/*MGEN:Class.ReadProperties*/
+}
+
void /*MGEN:Class.NameCap*/::writeProperties (Buffer& buf)
{
::qpid::sys::Mutex::ScopedLock mutex(accessLock);
@@ -178,3 +190,12 @@ void /*MGEN:Class.NameCap*/::doMethod (/*MGEN:Class.DoMethodArgs*/)
outBuf.putLong(status);
outBuf.putShortString(Manageable::StatusText(status, text));
}
+
+std::string /*MGEN:Class.NameCap*/::getKey() const
+{
+ std::stringstream key;
+
+/*MGEN:Class.PrimaryKey*/
+ return key.str();
+}
+
diff --git a/qpid/cpp/managementgen/qmfgen/templates/Class.h b/qpid/cpp/managementgen/qmfgen/templates/Class.h
index 225090f0a9..298f339381 100644
--- a/qpid/cpp/managementgen/qmfgen/templates/Class.h
+++ b/qpid/cpp/managementgen/qmfgen/templates/Class.h
@@ -75,12 +75,14 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
/*MGEN:ENDIF*/
// Private Methods
static void writeSchema(::qpid::framing::Buffer& buf);
+ void readProperties(::qpid::framing::Buffer& buf);
void writeProperties(::qpid::framing::Buffer& buf);
void writeStatistics(::qpid::framing::Buffer& buf,
bool skipHeaders = false);
void doMethod(std::string& methodName,
::qpid::framing::Buffer& inBuf,
::qpid::framing::Buffer& outBuf);
+ std::string getKey() const;
writeSchemaCall_t getWriteSchemaCall() { return writeSchema; }
/*MGEN:IF(Class.NoStatistics)*/
// Stub for getInstChanged. There are no statistics in this class.
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
index e00f394a01..460a11d0f0 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
@@ -194,6 +194,7 @@ ObjectId ManagementAgent::addObject(ManagementObject* object,
}
ObjectId objId(0 /*flags*/ , sequence, brokerBank, 0, objectNum);
+ objId.setV2Key(object->getKey());
object->setObjectId(objId);
newManagementObjects[objId] = object;
diff --git a/qpid/cpp/src/qpid/management/ManagementObject.cpp b/qpid/cpp/src/qpid/management/ManagementObject.cpp
index bcb6159663..6cbe386517 100644
--- a/qpid/cpp/src/qpid/management/ManagementObject.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementObject.cpp
@@ -169,6 +169,21 @@ void ManagementObject::writeTimestamps (framing::Buffer& buf)
objectId.encode(buf);
}
+void ManagementObject::readTimestamps (framing::Buffer& buf)
+{
+ std::string unused;
+ uint8_t unusedUuid[16];
+ ObjectId unusedObjectId;
+
+ buf.getShortString(unused);
+ buf.getShortString(unused);
+ buf.getBin128(unusedUuid);
+ updateTime = buf.getLongLong();
+ createTime = buf.getLongLong();
+ destroyTime = buf.getLongLong();
+ unusedObjectId.decode(buf);
+}
+
void ManagementObject::setReference(ObjectId) {}
int ManagementObject::getThreadIndex() {