| 
     
      
      
      From: <jc...@us...> - 2008-05-09 22:41:33
      
     
   | 
Revision: 604
          http://omc.svn.sourceforge.net/omc/?rev=604&view=rev
Author:   jcarey
Date:     2008-05-09 15:41:26 -0700 (Fri, 09 May 2008)
Log Message:
-----------
dev chk pnt
Modified Paths:
--------------
    contrib/xen-vm-builder/trunk/src/providers/vm-builder/vmcreation-data.c
Modified: contrib/xen-vm-builder/trunk/src/providers/vm-builder/vmcreation-data.c
===================================================================
--- contrib/xen-vm-builder/trunk/src/providers/vm-builder/vmcreation-data.c	2008-05-09 16:35:47 UTC (rev 603)
+++ contrib/xen-vm-builder/trunk/src/providers/vm-builder/vmcreation-data.c	2008-05-09 22:41:26 UTC (rev 604)
@@ -163,6 +163,120 @@
 
 /*****************************************************************************/
 static void
+add_u8_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
+		const char* prop_name)
+{
+	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	if (!CMIsNullValue(data)) {
+		char wkbfr[32];
+		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint8);
+		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+	} else {
+		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+	}
+}
+
+/*****************************************************************************/
+static void
+add_u16_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
+		const char* prop_name)
+{
+	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	if (!CMIsNullValue(data)) {
+		char wkbfr[32];
+		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint16);
+		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+	} else {
+		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+	}
+}
+
+/*****************************************************************************/
+static void
+add_u32_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
+		const char* prop_name)
+{
+	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	if (!CMIsNullValue(data)) {
+		char wkbfr[32];
+		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint32);
+		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+	} else {
+		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+	}
+}
+
+/*****************************************************************************/
+static void
+add_str_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
+		const char* prop_name, int endstmt)
+{
+	CMPIData data;
+	const char* pnnfmt;
+	const char* pnullfmt;
+	if (endstmt) {
+		pnnfmt = "%Q";
+		pnullfmt = "NULL";
+	} else {
+		pnnfmt = "%Q,";
+		pnullfmt = "NULL,";
+	}
+	data = CMGetProperty(instance, prop_name, NULL);
+	if (!CMIsNullValue(data)) {
+		char *p = (char*) CMGetCharPtr(data.value.string);
+		db_sql_insert(pstrbuf, pnnfmt, p);
+	} else {
+		omcStrBuf_cat(pstrbuf, pnullfmt, 0);
+	}
+}
+
+/*****************************************************************************/
+static void
+add_stra_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
+		const char* prop_name)
+{
+	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	if (!CMIsNullValue(data)) {
+		omcStrBuf* lstrbuf = stringArray2Str(_broker, data.value.array);
+		if (lstrbuf) {
+			db_sql_insert(pstrbuf, "%Q,", lstrbuf->bfr);
+			omcStrBuf_destroy(lstrbuf);
+		} else {
+			omcStrBuf_cat(pstrbuf, "NULL,", 0);
+		}
+	} else {
+		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+	}
+}
+
+
+/*****************************************************************************/
+static int
+instance_on_file(const char* iid, CMPIStatus *pstatus)
+{
+	int cc;
+	char *query, err_msg[256];
+	VMBDBCtx dbctx;
+
+	OMC_SETSTATUS(_broker, pstatus, CMPI_RC_OK, "No Error");
+	query = db_create_formatted_sql("SELECT InstanceID FROM CreationData "
+		"WHERE InstanceID=%Q", iid);
+	cc = db_create_select_results(&dbctx, query, err_msg, sizeof(err_msg));
+	db_destroy_formatted_sql(query);
+	if (cc != 0) {
+		DEBUGOUT("instance_on_file(): Failed to connect to database: %s",
+			err_msg);
+		OMC_SETSTATUS(_broker, pstatus, CMPI_RC_ERROR_SYSTEM, err_msg);
+		return -1;
+	}
+	cc = db_results_have_more_rows(dbctx);
+	db_destroy_select_results(dbctx);
+	return cc;
+}
+
+
+/*****************************************************************************/
+static void
 _fillInstance(
 	VMBDBCtx dbctx,
 	CMPIInstance* instance)
@@ -384,114 +498,301 @@
 	return status;
 }
 
-/******************************************************************************
-ModifyInstance() - modify instance
-   params:  CMPIInstanceMI* self:  [in] Handle to this provider
-            CMPIContext* context:  [in] any additional context info
-            CMPIResult* results:   [out] Results
-            CMPIObjectPath* cop:   [in] target namespace and classname, and objectpath
-            CMPIInstance* newInst: [in] new (modified) instance data
-******************************************************************************/
-static CMPIStatus
-ModifyInstance(
-		CMPIInstanceMI* self,
-		const CMPIContext* context,
-		const CMPIResult* results,
-		const CMPIObjectPath* cop,
-		const CMPIInstance* newinstance,
-		const char** properties)
+
+/*****************************************************************************/
+static int
+get_mod_property(const CMPIInstance* ci, const char* prop_name, const char** properties,
+		CMPIData* pdata)
 {
-	CMPIStatus status = {CMPI_RC_ERR_NOT_SUPPORTED, NULL};
-	return status;
+	if (properties) {
+		int i, found = 0;
+		for (i = 0; properties[i]; i++) {
+			if (strcasecmp(prop_name, properties[i]) == 0) {
+				found = 1;
+				break;
+			}
+		}
+		if (!found) {
+			return 0;
+		}
+	}
+	*pdata = CMGetProperty(ci, prop_name, NULL);
+	return 1;
 }
 
 
 /*****************************************************************************/
-static void
-add_u8_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
-		const char* prop_name)
+void
+mod_add_u16_prop(omcStrArray* pstra, const CMPIInstance* modified_instance,
+		const char* prop_name, const char** properties)
 {
-	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	char wkbfr[256];
+	CMPIData data;
+	if (!get_mod_property(modified_instance, prop_name, properties, &data)) {
+		return;
+	}
 	if (!CMIsNullValue(data)) {
-		char wkbfr[32];
-		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint8);
-		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+		snprintf(wkbfr, sizeof(wkbfr), "%s=%u", prop_name, data.value.uint16);
 	} else {
-		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+		snprintf(wkbfr, sizeof(wkbfr), "%s=NULL", prop_name);
 	}
+	omcStrArray_append(pstra, wkbfr);
 }
 
 /*****************************************************************************/
-static void
-add_u16_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
-		const char* prop_name)
+void
+mod_add_str_prop(omcStrArray* pstra, const CMPIInstance* modified_instance,
+		const char* prop_name, const char** properties)
 {
-	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	CMPIData data;
+	if (!get_mod_property(modified_instance, prop_name, properties, &data)) {
+		return;
+	}
 	if (!CMIsNullValue(data)) {
-		char wkbfr[32];
-		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint16);
-		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+		char *p = (char*) CMGetCharPtr(data.value.string);
+		char* sql = db_create_formatted_sql("%s=%Q", prop_name, p);
+		omcStrArray_append(pstra, sql);
+		db_destroy_formatted_sql(sql);
 	} else {
-		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+		char wkbfr[256];
+		snprintf(wkbfr, sizeof(wkbfr), "%s=NULL", prop_name);
+		omcStrArray_append(pstra, wkbfr);
 	}
 }
 
 /*****************************************************************************/
-static void
-add_u32_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
-		const char* prop_name)
+void
+mod_add_stra_prop(omcStrArray* pstra, const CMPIInstance* modified_instance,
+		const char* prop_name, const char** properties)
 {
-	CMPIData data = CMGetProperty(instance, prop_name, NULL);
+	CMPIData data;
+	if (!get_mod_property(modified_instance, prop_name, properties, &data)) {
+		return;
+	}
 	if (!CMIsNullValue(data)) {
-		char wkbfr[32];
-		snprintf(wkbfr, sizeof(wkbfr), "%u,", data.value.uint32);
-		omcStrBuf_cat(pstrbuf, wkbfr, 0);
+		omcStrBuf* lstrbuf = stringArray2Str(_broker, data.value.array);
+		if (lstrbuf) {
+			char* sql = db_create_formatted_sql("%s=%Q", prop_name, lstrbuf->bfr);
+			omcStrBuf_destroy(lstrbuf);
+			omcStrArray_append(pstra, sql);
+			db_destroy_formatted_sql(sql);
+		} else {
+			char wkbfr[256];
+			snprintf(wkbfr, sizeof(wkbfr), "%s=NULL", prop_name);
+			omcStrArray_append(pstra, wkbfr);
+		}
 	} else {
-		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+		char wkbfr[256];
+		snprintf(wkbfr, sizeof(wkbfr), "%s=NULL", prop_name);
+		omcStrArray_append(pstra, wkbfr);
 	}
 }
 
 /*****************************************************************************/
-static void
-add_str_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
-		const char* prop_name, int endstmt)
+void
+mod_add_u32_prop(omcStrArray* pstra, const CMPIInstance* modified_instance,
+		const char* prop_name, const char** properties)
 {
+	char wkbfr[256];
 	CMPIData data;
-	const char* pnnfmt;
-	const char* pnullfmt;
-	if (endstmt) {
-		pnnfmt = "%Q";
-		pnullfmt = "NULL";
-	} else {
-		pnnfmt = "%Q,";
-		pnullfmt = "NULL,";
+	if (!get_mod_property(modified_instance, prop_name, properties, &data)) {
+		return;
 	}
-	data = CMGetProperty(instance, prop_name, NULL);
 	if (!CMIsNullValue(data)) {
-		char *p = (char*) CMGetCharPtr(data.value.string);
-		db_sql_insert(pstrbuf, pnnfmt, p);
+		snprintf(wkbfr, sizeof(wkbfr), "%s=%u", prop_name, data.value.uint32);
 	} else {
-		omcStrBuf_cat(pstrbuf, pnullfmt, 0);
+		snprintf(wkbfr, sizeof(wkbfr), "%s=NULL", prop_name);
 	}
+	omcStrArray_append(pstra, wkbfr);
 }
 
-/*****************************************************************************/
-static void
-add_stra_prop_to_query(omcStrBuf* pstrbuf, const CMPIInstance* instance,
-		const char* prop_name)
+/******************************************************************************
+ModifyInstance() - modify instance
+   params:  CMPIInstanceMI* self:  [in] Handle to this provider
+            CMPIContext* context:  [in] any additional context info
+            CMPIResult* results:   [out] Results
+            CMPIObjectPath* cop:   [in] target namespace and classname, and objectpath
+            CMPIInstance* newInst: [in] new (modified) instance data
+******************************************************************************/
+static CMPIStatus
+ModifyInstance(
+		CMPIInstanceMI* self,
+		const CMPIContext* context,
+		const CMPIResult* results,
+		const CMPIObjectPath* cop,
+		const CMPIInstance* modified_instance,
+		const char** properties)
 {
-	CMPIData data = CMGetProperty(instance, prop_name, NULL);
-	if (!CMIsNullValue(data)) {
-		omcStrBuf* lstrbuf = stringArray2Str(_broker, data.value.array);
-		if (lstrbuf) {
-			db_sql_insert(pstrbuf, "%Q,", lstrbuf->bfr);
-			omcStrBuf_destroy(lstrbuf);
-		} else {
-			omcStrBuf_cat(pstrbuf, "NULL,", 0);
+	CMPIStatus status = {CMPI_RC_OK, NULL};
+	const char *className, *iid;
+	char *query, wkbfr[256];
+	CMPIData key, data;
+	int cc, prop_cnt, cur_prop_cnt = 0;
+	VMBDBCtx dbctx;
+	omcStrBuf *pstrbuf;
+	omcStrArray *pstra;
+
+	DEBUGOUT("ModifyInstance() called...\n");
+	if (properties) {
+		for (prop_cnt = 0; properties[prop_cnt]; prop_cnt++) {
+			/* empty */
 		}
+		if (!prop_cnt) {
+			DEBUGOUT("ModifyInstance() empty prop list. Did Nothing\n");
+			return status;
+		}
 	} else {
-		omcStrBuf_cat(pstrbuf, "NULL,", 0);
+		prop_cnt = CMGetPropertyCount(modified_instance, &status);
+		if (status.rc != CMPI_RC_OK) {
+			DEBUGOUT("ModifyInstance(): Get Property Count return %d\n", status.rc);
+			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND,
+				"CMGetPropertyCount failed");
+            return status;
+		}
 	}
+
+	if (properties && !properties[0]) {
+		DEBUGOUT("ModifyInstance() empty prop list. Did Nothing\n");
+		return status;
+	}
+
+	className = CMGetCharPtr(CMGetClassName(cop, NULL));
+	if (strcasecmp(className, "XEN_VMBuilderVirtualSystemCreationData") == 0)
+	{
+		key = CMGetKey(cop, "InstanceID", &status);
+		if (status.rc != CMPI_RC_OK || CMIsNullValue(key)) {
+			DEBUGOUT("ModifyInstance(): CMGetKey(\"InstanceID\") failed - %d\n", status.rc);
+			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND, "Cannot get InstanceID property");
+            return status;
+		}
+
+		iid = CMGetCharPtr(key.value.string);
+		if (!iid || !strlen(iid)) {
+			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND, "Empty InstanceID property");
+            return status;
+		}
+		if ((cc = instance_on_file(iid, &status)) < 0) {
+			return status;
+		}
+		if (!cc) {
+			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND, "Instance Not Found");
+			return status;
+		}
+
+		pstra = omcStrArray_create();
+		if (!pstra) {
+			CMSetStatusWithChars(_broker, &status, CMPI_RC_ERROR_SYSTEM,
+				"Failed to create string array");
+			return status;
+		}
+
+		pstrbuf = omcStrBuf_create();
+		if (!pstrbuf) {
+			CMSetStatusWithChars(_broker, &status, CMPI_RC_ERROR_SYSTEM,
+				"Failed to create string buffer");
+			omcStrArray_destroy(pstra);
+			return status;
+		}
+
+		mod_add_u16_prop(pstra, modified_instance, "AutoMaticRecoveryAction", properties);
+		mod_add_u16_prop(pstra, modified_instance, "AutoMaticShutdownAction", properties);
+		mod_add_u16_prop(pstra, modified_instance, "AutoMaticStartupAction", properties);
+		if (get_mod_property(modified_instance, "AutoMaticStartupActionDelay", properties, &data)) {
+			if (!CMIsNullValue(data)) {
+				if (!CMIsInterval(data.value.dateTime, &status)) {
+					CMSetStatusWithChars(_broker, &status,
+						CMPI_RC_ERR_INVALID_PARAMETER,
+						"'AutoMaticStartupActionDelay' must be an interval");
+					omcStrBuf_destroy(pstrbuf);
+					omcStrArray_destroy(pstra);
+					return status;
+				}
+				CMPIUint64 wku64 = CMGetBinaryFormat(data.value.dateTime, &status);
+				snprintf(wkbfr, sizeof(wkbfr), "AutoMaticStartupActionDelay=%llu", wku64);
+				omcStrArray_append(pstra, wkbfr);
+			} else {
+				omcStrArray_append(pstra, "AutoMaticStartupActionDelay=NULL");
+			}
+		}
+		mod_add_u16_prop(pstra, modified_instance, "AutoMaticStartupAction", properties);
+		mod_add_str_prop(pstra, modified_instance, "CPUArchitecture", properties);
+		mod_add_str_prop(pstra, modified_instance, "Caption", properties);
+		mod_add_u16_prop(pstra, modified_instance, "ChangeableType", properties);
+		mod_add_str_prop(pstra, modified_instance, "ConfigurationDataRoot", properties);
+		mod_add_str_prop(pstra, modified_instance, "ConfigurationFile", properties);
+		mod_add_str_prop(pstra, modified_instance, "ConfigurationID", properties);
+		mod_add_str_prop(pstra, modified_instance, "ConfigurationName", properties);
+		if (get_mod_property(modified_instance, "CreationTime", properties, &data)) {
+			if (!CMIsNullValue(data)) {
+				if (CMIsInterval(data.value.dateTime, &status)) {
+					CMSetStatusWithChars(_broker, &status,
+						CMPI_RC_ERR_INVALID_PARAMETER,
+						"'CreationTime' cannot be an interval");
+					omcStrBuf_destroy(pstrbuf);
+					omcStrArray_destroy(pstra);
+					return status;
+				}
+				CMPIUint64 wku64 = CMGetBinaryFormat(data.value.dateTime, &status);
+				snprintf(wkbfr, sizeof(wkbfr), "CreationTime=%llu", wku64);
+				omcStrArray_append(pstra, wkbfr);
+			} else {
+				omcStrArray_append(pstra, "CreationTime=NULL");
+			}
+		}
+		mod_add_str_prop(pstra, modified_instance, "Description", properties);
+		mod_add_stra_prop(pstra, modified_instance, "Disks", properties);
+		mod_add_str_prop(pstra, modified_instance, "ElementName", properties);
+		mod_add_stra_prop(pstra, modified_instance, "ExtraConfigInfo", properties);
+		mod_add_str_prop(pstra, modified_instance, "ExtraInstallArgs", properties);
+		mod_add_u32_prop(pstra, modified_instance, "GraphicsType", properties);
+		mod_add_u32_prop(pstra, modified_instance, "GraphicsViewerType", properties);
+		mod_add_str_prop(pstra, modified_instance, "LogDataRoot", properties);
+
+		mod_add_u32_prop(pstra, modified_instance, "MaxMemory", properties);
+		mod_add_u32_prop(pstra, modified_instance, "Memory", properties);
+
+/*
+
+
+		omcStrBuf_cat(pstrbuf, "UPDATE CreationData SET ", 0);
+				
+
+
+		get_mod_property(modified_instance, "Nics", properties, &data)
+		get_mod_property(modified_instance, "Notes", properties, &data)
+		get_mod_property(modified_instance, "NumVCPUs", properties, &data)
+		get_mod_property(modified_instance, "OSType", properties, &data)
+		get_mod_property(modified_instance, "RecoveryFile", properties, &data)
+		get_mod_property(modified_instance, "ResponseFile", properties, &data)
+		get_mod_property(modified_instance, "SnapshotDataRoot", properties, &data)
+		get_mod_property(modified_instance, "SourceURL", properties, &data)
+		get_mod_property(modified_instance, "SuspendDataRoot", properties, &data)
+		get_mod_property(modified_instance, "SwapFileDataRoot", properties, &data)
+		get_mod_property(modified_instance, "UUID", properties, &data)
+		get_mod_property(modified_instance, "VNCPort", properties, &data)
+		get_mod_property(modified_instance, "VirtType", properties, &data)
+		get_mod_property(modified_instance, "VirtualSystemIdentifier", properties, &data)
+		get_mod_property(modified_instance, "VirtualSystemType", properties, &data) 
+
+
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+	}
+
+	DEBUGOUT("ModifyInstance() returning\n");
+	return status;
 }
 
 /******************************************************************************
@@ -535,18 +836,9 @@
 			return status;
 		}
 
-		query = db_create_formatted_sql("SELECT InstanceID FROM CreationData "
-			"WHERE InstanceID=%Q;", iid);
-		cc = db_create_select_results(&dbctx, query, wkbfr, sizeof(wkbfr));
-		db_destroy_formatted_sql(query);
-		if (cc != 0) {
-			DEBUGOUT("CreateInstance(): Failed to connect to database: %s",
-				wkbfr);
-			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERROR_SYSTEM, wkbfr);
+		if ((cc = instance_on_file(iid, &status)) < 0) {
 			return status;
 		}
-		cc = db_results_have_more_rows(dbctx);
-		db_destroy_select_results(dbctx);
 		if (cc) {
 			/* Got hit on InstanceID - Already on file */
 			CMSetStatus(&status, CMPI_RC_ERR_ALREADY_EXISTS);
@@ -692,29 +984,21 @@
 			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND, "Empty InstanceID property");
             return status;
 		}
-
-		query = db_create_formatted_sql("SELECT InstanceID FROM CreationData "
-			"WHERE InstanceID=%Q", iid);
-		cc = db_create_select_results(&dbctx, query, err_msg, sizeof(err_msg));
-		db_destroy_formatted_sql(query);
-		if (cc != 0) {
-			DEBUGOUT("DeleteInstance(): Failed to connect to database: %s",
-				err_msg);
-			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERROR_SYSTEM, err_msg);
+		if ((cc = instance_on_file(iid, &status)) < 0) {
 			return status;
 		}
-		cc = db_results_have_more_rows(dbctx);
-		db_destroy_select_results(dbctx);
 		if (!cc) {
 			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERR_NOT_FOUND, "Instance Not Found");
 			return status;
 		}
+
 		query = db_create_formatted_sql("DELETE FROM CreationData WHERE InstanceID=%Q", iid);
 		if (db_exec(query, err_msg, sizeof(err_msg)) < 0LL) {
 			DEBUGOUT("DeleteInstance(): failed deleting record from "
 				"database: %s", err_msg);
 			OMC_SETSTATUS(_broker, &status, CMPI_RC_ERROR_SYSTEM, err_msg);
 		}
+		db_destroy_formatted_sql(query);
 	}
 
 	DEBUGOUT("DeleteInstance() returning\n");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |