# HG changeset patch
# User Jay Gagnon <grendel(a)linux.vnet.ibm.com>
# Date 1202236785 18000
# Node ID f9065b274d0a1e689f8e0b4d8d5ca0642db470f6
# Parent ab0e3b05a10e7b5db7eb493920f01bb402d2feae
[CU] Add dup_instance function to libcmpiutil
It appears there are some situations where we have to duplicate an instance; this seemed
like the kind of thing that would belong in libcmpiutil.
Changes from #1 to #2:
cu dup_instance returns instance, sets status using pointer
cu_dup_instance copies all properties
Signed-off-by: Jay Gagnon <grendel(a)linux.vnet.ibm.com>
diff -r ab0e3b05a10e -r f9065b274d0a instance_util.c
--- a/instance_util.c Wed Jan 30 11:15:32 2008 -0800
+++ b/instance_util.c Tue Feb 05 13:39:45 2008 -0500
@@ -202,6 +202,52 @@ CMPIStatus cu_copy_prop(const CMPIBroker
out:
return s;
+}
+
+CMPIInstance *cu_dup_instance(const CMPIBroker *broker,
+ CMPIInstance *src,
+ CMPIStatus *s)
+{
+ int i;
+ int prop_count;
+ CMPIData data;
+ CMPIObjectPath *ref;
+ CMPIInstance *dest = NULL;
+
+ ref = CMGetObjectPath(src, NULL);
+ if ((s->rc != CMPI_RC_OK) || CMIsNullObject(ref)) {
+ cu_statusf(broker, s,
+ CMPI_RC_ERR_FAILED,
+ "Could not get objectpath from instance");
+ goto out;
+ }
+
+ dest = CMNewInstance(broker, ref, s);
+
+ prop_count = CMGetPropertyCount(src, s);
+ if (s->rc != CMPI_RC_OK) {
+ cu_statusf(broker, s,
+ CMPI_RC_ERR_FAILED,
+ "Could not get property count for copy");
+ goto out;
+ }
+
+ for (i = 0; i < prop_count; i++) {
+ CMPIString *prop_name;
+ data = CMGetPropertyAt(src, i, &prop_name, s);
+ if (s->rc != CMPI_RC_OK) {
+ goto out;
+ }
+
+ *s = CMSetProperty(dest, (char *)(prop_name->hdl),
+ &(data.value), data.type);
+ if (s->rc != CMPI_RC_OK) {
+ goto out;
+ }
+ }
+
+ out:
+ return dest;
}
/*
diff -r ab0e3b05a10e -r f9065b274d0a libcmpiutil.h
--- a/libcmpiutil.h Wed Jan 30 11:15:32 2008 -0800
+++ b/libcmpiutil.h Tue Feb 05 13:39:45 2008 -0500
@@ -164,6 +164,18 @@ CMPIrc cu_get_u16_path(const CMPIObjectP
CMPIrc cu_get_u16_path(const CMPIObjectPath *reference,
const char *key,
uint16_t *target);
+
+/**
+ * Create a copy of an instance
+ *
+ * @param src Source instance
+ * @param dest Destination instance
+ * @returns {CMPI_RC_OK, NULL} if success, CMPI_RC ERR_FAILED and
+ * error message otherwise
+ */
+CMPIInstance *cu_dup_instance(const CMPIBroker *broker,
+ CMPIInstance *src,
+ CMPIStatus *s);
/* Forward declaration */
struct inst_list;