
# HG changeset patch # User Jay Gagnon <grendel@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@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;