var returnArray = ArrayNew(1); var tabStruct = StructNew(); var formTabQuery = ''; select TabDisplayName,TabSortName,ID from formControlTabs where FormID = order by TabSortName tabStruct = StructNew(); tabStruct.name = TabDisplayName; tabStruct.id = ID; if(recurse){ tabStruct.fields = getFieldsFromTabID(ID); } ArrayAppend(returnArray,tabStruct); var returnArray = ArrayNew(1); var formFieldQuery = ''; var fieldStruct = StructNew(); select FormInputControlMap.FieldID,FormInputControlMap.ItemPos,FormInputControl.FieldName from FormInputControlMap inner join FormInputControl ON FormInputControl.ID = FormInputControlMap.FieldID where TabID in () order by ItemPos fieldStruct = StructNew(); fieldStruct.FieldID = FieldID; fieldStruct.FieldName = ReplaceNoCase(FieldName, "FIC_", "", "all"); fieldStruct.defaultValues = getFieldDefaultValueFromID(FieldID); ArrayAppend(returnArray,fieldStruct); var rtnStruct = StructNew(); var params = ""; var formFieldQuery = ""; var defaultValues = StructNew(); var multipleFieldQuery = ""; var fieldQuery = ""; var fieldDefaultValues = ''; select FormID from FormInputControlMap where FieldID = select * from multipleFieldQuery where fieldID = fieldDefaultValues = getElementInfoByPageID(pageid=0,formid=formID); rtnStruct = StructNew(); // 2011-05-04 - MFC - Added check for CS 5 to decode the HTML escaped param WDDX. // Check if in CS 5 or lower to decode the HTML in the wddx if ( application.ADF.csVersion LT 6 ){ fieldQuery.params[1] = server.commonspot.udf.data.fromHTML(fieldQuery.params[1]); } params = server.commonspot.udf.util.wddxdecode(fieldQuery.params[1],1); defaultValues = StructNew(); defaultValues.type = fieldQuery.type[1]; if(structKeyExists(params,"req")){ defaultValues.required = params.req; } defaultValues.fieldName = ReplaceNoCase(fieldQuery.fieldName[1], "FIC_", "", "all"); if(len(fieldDefaultValues.values[defaultValues.fieldName])){ defaultValues.defaultValue = fieldDefaultValues.values[defaultValues.fieldName]; } if(structkeyexists(params,"label")){ defaultValues.label = params.label; } if(structkeyexists(params,"vallist") and params.vallist != ""){ defaultValues.OptionListSource = "Value List"; defaultValues.OptionList = params.vallist; } if(structkeyexists(params,"VALSOURCE") and params.VALSOURCE eq "element" and structkeyexists(params,"ELEMENTID") and Len(params.ELEMENTID) ){ //Its an optionlist on a list of elements! And they selected an element. Figure out what element it is! defaultValues.OptionListSource = "Custom Element/Metadata/Simple Form Data"; defaultValues.DynamicData = getCENameByFormID(params.ELEMENTID); } if(structkeyexists(params,"val")){ defaultValues.value = params.val; } if(structkeyexists(params,"height")){ defaultValues.height = params.height; } if(structkeyexists(params,"width")){ defaultValues.width = params.width; } if(structkeyexists(params,"maxlength")){ defaultValues.maxlength = params.maxlength; } if(structkeyexists(params,"size")){ defaultvalues.size = params.size; } if(structkeyexists(params,"cols")){ defaultvalues.size = params.cols; } if(structkeyexists(params,"rows")){ defaultvalues.rows = params.rows; } rtnStruct = defaultValues; var multipleFieldQuery = ''; var formFieldQuery = ''; var fieldQuery = ''; var params = StructNew(); select FormID from FormInputControlMap where FieldID = select * from multipleFieldQuery where fieldID = params = server.commonspot.udf.util.wddxdecode(fieldQuery.params[1],1); // 2011-05-04 - RAK - Added check for CS 5 to decode the HTML escaped param WDDX. // Check if in CS 5 or lower to decode the HTML in the wddx if ( application.ADF.csVersion LT 6 ){ params = server.commonspot.udf.data.fromHTML(params); } // add in some additional params from the query params.type = fieldQuery.type; params.name = fieldQuery.fieldName; // params.description = fieldQuery.description; var ceDataSerialized = ""; var ceData = variables.getCEData(arguments.ceName); var folder = ExpandPath("#arguments.exportFolder#"); var fileName = "#arguments.ceName#--#DateFormat(now(),'YYYY-MM-DD')#-#TimeFormat(now(),'HH-MM')#.txt"; if(!ArrayLen(ceData)){ //We have no CE data! return an empty string back return ""; } var rowData = ''; var tempStruct = ''; var dataToImport = ""; var ceData = ""; var i = 1; var currentCE = ""; var populateResults = ""; var scheduleArray = ArrayNew(1); var scheduleStruct = ""; var scheduleParams = ""; var returnStruct = StructNew(); returnStruct.success = false; application.ADF.utils.logAppend(application.ADF.utils.doDump(cfcatch,"cfcatch",false,true),"importCEData-Errors.html"); if(!len(dataToImport)){ returnStruct.msg = "The file could not be read properly. Please see the logs."; return returnStruct; } // Horray! The file existed and had content ceData = Server.Commonspot.UDF.util.deserialize(dataToImport); if(!Find('"',dataToImport)){ //Wrap everything with quotes. for(i=2;i lte ListLen(dataToImport,chr(10)); i++){ rowData = ListGetAt(dataToImport,i,chr(10)); rowData = '"#Replace(rowData,",",'","',"ALL")#"'; dataToImport = ListSetAt(dataToImport,i,rowData,chr(10)); } //Replace the empty strings with Chr(1) and remove all the quotes we just added. dataToImport = Replace(dataToImport,'""',Chr(1),"ALL"); dataToImport = Replace(dataToImport,'"',"","ALL"); } ceData = variables.data.queryToArrayOfStructures(variables.data.csvToQuery(dataToImport)); for(i=1;i <= ArrayLen(ceData);i++){ tempStruct = StructNew(); tempStruct.values = ceData[i]; tempStruct.formName = arguments.ceName; ceData[i] = tempStruct; } if(!ArrayLen(ceData)){ returnStruct.msg = "There was no data to import"; return returnStruct; } arguments.ceName = ceData[1].formName; if ( LEN(TRIM(arguments.ccapiCEName)) ) arguments.ceName = arguments.ccapiCEName; //We have a valid structure! lets do our clean if requested and continue on. if(arguments.clean){ variables.deleteByElementName(ceName); } for(i=1;i<=ArrayLen(ceData);i=i+1){ //Create the params for the populate content call currentCE = StructNew(); currentCE.elementType = "custom"; currentCE.submitChange = true; currentCE.submitChangeComment = "Element imported using CE Data import utility."; if(StructKeyExists(ceData[i],"pageID")){ currentCE.dataPageID = ceData[i].pageID; } structAppend(currentCE,ceData[i].values); //Build the populateContent call for the schedule scheduleStruct = StructNew(); scheduleStruct.bean = "csContent_1_0"; scheduleStruct.method = "populateContent"; scheduleStruct.args.elementName = ceName; scheduleStruct.args.data = currentCE; //Add the item to the schedule ArrayAppend(scheduleArray,scheduleStruct); } //Application.ADF.utils.doDump(scheduleArray,"scheduleArray",0); //Setup the schedule params scheduleParams = StructNew(); scheduleParams.delay = 1; //minutes till next schedule item scheduleParams.tasksPerBatch = 20; //how many tasks to do per iteration //Schedule it! returnStruct.scheduleID = "import-#ceName#"; application.ADF.scheduler.scheduleProcess(returnStruct.scheduleID,scheduleArray,scheduleParams); returnStruct.msg = "Import scheduled succesfully!"; returnStruct.elementName = ceName; returnStruct.success = true; return returnStruct; var rtnData = StructNew(); var elementWDDX = ""; var elementQuery = ""; var elementPageID = ""; var elementFormID = ""; select dw.elementData,ci.controlType from controlInstance ci inner join data_wddx dw on ( dw.pageID = ci.pageID and dw.controlID = ci.controlID ) where ci.pageid = and controlName = elementWDDX = elementQuery.elementData; elementWDDX = server.commonspot.udf.util.wddxdecode(elementWDDX); elementPageID = ListGetAt(elementWDDX.lastRecord,1,"|"); elementFormID = elementQuery.controlType; rtnData = getElementInfoByPageID(elementPageID,elementFormID); var ceDataArray = arrayNew(1); var itm = ""; var row = ""; var column = ""; var tmp = ""; var defaultTmp = StructNew(); // Default temp for common fields over each loop var formName = ""; var i = ""; //var commonFieldList = "pageID,formID,dateAdded,dateCreated"; var commonFieldList = "pageID,formID"; var fieldStruct = structNew(); // Check that we have a query with values if ( arguments.ceDataQuery.recordCount GTE 1 ){ // Setup the default common fields // get the fields structure for this element fieldStruct = server.ADF.objectFactory.getBean("Forms_1_0").getCEFieldNameData(getCENameByFormID(arguments.ceDataQuery["formID"][1])); } tmp = structNew(); // Set the tmp to the default values from the common fields //tmp = defaultTmp; // add in common fields for( i=1; i lte listLen(commonFieldList); i=i+1 ) { commonField = listGetAt(commonFieldList, i); // handle each of the common fields if( findNoCase(commonField, arguments.ceDataQuery.columnList) ) tmp[commonField] = arguments.ceDataQuery[commonField][row]; else tmp[commonField] = ""; // do special case work for formID/formName if( commonField eq "formID" ) { if( not len(formName) ) formName = getCENameByFormID(tmp.formID); tmp.formName = formName; } } tmp.values = structNew(); // loop through the field query and build the values structure for( itm=1; itm lte listLen(structKeyList(fieldStruct)); itm=itm+1 ) { column = listGetAt(structKeyList(fieldStruct), itm); if( listFindNoCase(arguments.ceDataQuery.columnList, column) ) tmp.values[column] = arguments.ceDataQuery[column][row]; } arrayAppend(ceDataArray, tmp); var deleteView = ''; var viewCreated = false; var formID = getFormIDByCEName(arguments.elementName); var dbType = Request.Site.SiteDBType; var dbInfo = server.commonspot.datasources[request.site.datasource]; var dbVersion = ""; var realTypeView = ''; var fieldsSQL = ''; var fldqry = ''; var intType = ''; // Remove the spaces in the name arguments.viewName = Replace(arguments.viewName, " ", "_", "all"); // Set the db version if available if ( StructKeyExists(dbInfo,"version") ) dbVersion = ListFirst(dbInfo.version,"."); // Set datatypes for different db types switch (dbtype) { case 'Oracle': intType = 'number(12)'; break; case 'MySQL': intType = 'UNSIGNED'; break; case 'SQLServer': intType = 'int'; break; } Drop view #arguments.viewName# select fic.ID, fic.type, fic.fieldName from formINputControl fic, forminputcontrolMap where forminputcontrolMap.fieldID = fic.ID and forminputcontrolMap.formID = CREATE VIEW #arguments.viewName# AS SELECT max( CASE WHEN FieldID = #ID# THEN CAST(fieldvalue as #intType#) ELSE 0 END CASE WHEN FieldID = #ID# THEN CAST(fieldvalue as DECIMAL(7,2)) ELSE 0.0 END CASE WHEN FieldID = #ID# THEN CASE WHEN fieldValue <> '' THEN fieldvalue ELSE CAST([memovalue] AS nvarchar(4000)) ELSE CAST([memovalue] AS nvarchar(max)) WHEN memoValue <> '' THEN memovalue END ELSE null END ) as '#ReplaceNoCase(fieldName, "FIC_", "")#' as [#ReplaceNoCase(fieldName, "FIC_", "")#], PageID, controlID, formID FROM data_fieldvalue where formID = #formID# and versionstate >= 2 and PageID > 0 GROUP BY PageID, ControlID, formID // Log the error creating the view table // Failed to create view table return false; SELECT * FROM Data_WDDX WHERE pageID = AND controlID = AND versionState = 2 // Check that we got records if ( getDataWDDX.RecordCount ) { // Transform the WDDX data elementData = server.commonspot.udf.util.wddxdecode(getDataWDDX.ElementData); // Get the data page ID out retDataPageID = ListFirst(elementData.LASTRECORD,"|"); } return retDataPageID; var returnStruct = StructNew(); var srcElements = ""; var tempStruct = StructNew(); var srcElementStruct = ''; var i = ''; var keysToSync = ''; var syncLen = ''; var currentKey = ''; var currentElement = ''; var isDifferent = ''; var j = ''; var currentKeyValue = ''; var newKeyValue = ''; var commandArray = ArrayNew(1); var deleteList = ''; var dataPageIDList = ''; var scheduleParams = ""; var manualCompare = false; var syncKey = ''; var currSrcElementKey = ""; // Stores the current source element key for building the 'srcElementStruct'. var dupSrcDataPageIDList = ""; // List for DataPageIDs for duplicate recs in source data. returnStruct.success = false; returnStruct.msg = "An unknown error occurred."; //*********************************************Begin validation*********************************************// if(!Len(arguments.elementName)){ returnStruct.msg = "Element name must be defined."; return returnStruct; } if(!ArrayLen(arguments.newElements)){ returnStruct.msg = "The list of elements to by sync'd is not defined."; return returnStruct; } if(!StructIsEmpty(arguments.updateOverride)){ //The defined an override if(!StructKeyExists(arguments.updateOverride,"bean") || !StructKeyExists(arguments.updateOverride,"method") || !Len(arguments.updateOverride.method) || !Len(arguments.updateOverride.bean)){ returnStruct.msg = "Invalid structure for updateOverride, it must be a structure with keys bean and method which are string values."; return returnStruct; } }else{ arguments.updateOverride.bean = "csContent_1_0"; arguments.updateOverride.method = "populateContent"; } arguments.updateOverride.args.elementName = arguments.elementCCAPIName; arguments.updateOverride.args.data = StructNew(); if(!StructIsEmpty(arguments.deleteOverride)){ //The defined an override if(!StructKeyExists(arguments.deleteOverride,"bean") || !StructKeyExists(arguments.deleteOverride,"method") || !Len(arguments.deleteOverride.method) || !Len(arguments.deleteOverride.bean)){ returnStruct.msg = "Invalid structure for deleteOverride, it must be a structure with keys bean and method which are string values."; return returnStruct; } }else{ arguments.deleteOverride.bean = "ceData_1_0"; arguments.deleteOverride.method = "deleteCE"; } arguments.deleteOverride.args.datapageidList = ""; if(!StructIsEmpty(arguments.newOverride)){ //The defined an override if(!StructKeyExists(arguments.newOverride,"bean") || !StructKeyExists(arguments.newOverride,"method") || !Len(arguments.newOverride.method) || !Len(arguments.newOverride.bean)){ returnStruct.msg = "Invalid structure for newOverride, it must be a structure with keys bean and method which are string values."; return returnStruct; } }else{ arguments.newOverride.bean = "csContent_1_0"; arguments.newOverride.method = "populateContent"; } arguments.newOverride.args.elementName = arguments.elementCCAPIName; arguments.newOverride.args.data = StructNew(); //*********************************************End Validation*********************************************// /* Goal: Update the elements that have been changed and don't touch those which have not. 1. Get all the existing records (srcElements) a. first serialize the primary key fields and store them in a lookup struct for detection 2. Loop over newElements (arguments.newElements) 3. If the newElement exists in the srcElements record check to see if it changed. 4. If the subjectID does not exist in struct create a new record 5. Loop over remaining subjectID's and delete them */ //1. Get all the existing records (srcElements) if(StructKeyExists(arguments,"syncSourceContent")){ srcElements = arguments.syncSourceContent; }else{ srcElements = getCEData(arguments.elementName); } //1a. first serialize the primary key fields and store them in a lookup struct for detection srcElementStruct = StructNew(); for(i=1;i<=ArrayLen(srcElements);i++){ // 2011-07-08 - MFC // Set the source element key to a variable. // Check if the key already exists, then we have a duplicate record. currSrcElementKey = generateStructKey(srcElements[i],arguments.primaryKeys); if ( NOT StructKeyExists(srcElementStruct, currSrcElementKey) ) StructInsert(srcElementStruct,currSrcElementKey,srcElements[i],true); else dupSrcDataPageIDList = ListAppend(dupSrcDataPageIDList, srcElements[i].pageID); } //2. Loop over newElements (arguments.newElements) /* However first lets get a list of keys that will be checked. 1. get a list of all keys 2. Remove from the list the ignored keys */ keysToSync = StructKeyList(arguments.newElements[1].values); for(i=1;i<=ListLen(arguments.ignoreFields);i++){ currentKey = ListGetAt(arguments.ignoreFields,i); if(ListFindNoCase(keysToSync,currentKey)){ keysToSync = ListDeleteAt(keysToSync,ListFindNoCase(keysToSync,currentKey)); } } syncLen = ListLen(keysToSync); //If the keys on the input struct dont match the keys on the source then we need to manually compare. if(ArrayLen(srcElements) and ListLen(StructKeyList(arguments.newElements[1].values)) neq ListLen(StructKeyList(srcElements[1].values))){ manualCompare = true; } for(i=1;i<=ArrayLen(arguments.newElements);i++){ newElement = arguments.newElements[i]; //Figure out the element's lookup key currentKey = generateStructKey(newElement,arguments.primaryKeys); // Clear the variable when iterating currentElement = StructNew(); //3. If the newElement exists in the srcElements record check to see if it changed. if(StructKeyExists(srcElementStruct,currentKey)){ currentElement = srcElementStruct[currentKey]; /* Check to see if it changes... 1. Loop over comparing each key in the sync list 2. If we notice a discrepancy flag it for update. 3. Remove the element from the srcElementStruct since we found it */ isDifferent = false; if(Len(ignoreFields) || manualCompare){//Check each key individually for(j=1;j<=syncLen;j++){ syncKey = ListGetAt(keysToSync,j); currentKeyValue = StructFind(currentElement.values,syncKey); newKeyValue = StructFind(newElement.values,syncKey); if(!currentKeyValue.Equals(newKeyValue)){ isDifferent = true; break; } } }else{//check the entire object. Faster. currentKeyValue = currentElement.values; newKeyValue = newElement.values; if(!currentKeyValue.Equals(newKeyValue)){ isDifferent = true; } } if(isDifferent){ //We have a change on our hands! Do something! arguments.updateOverride = duplicate(updateOverride); arguments.updateOverride.args.data = newElement.values; arguments.updateOverride.args.data.dataPageID = currentElement.pageID; ArrayAppend(commandArray,arguments.updateOverride); }else{ //This guy is not different. Do nothing for now. } StructDelete(srcElementStruct,currentKey); }else{ //A new guy eh... arguments.newOverride = duplicate(newOverride); arguments.newOverride.args.data = StructNew(); arguments.newOverride.args.data = newElement.values; ArrayAppend(commandArray,arguments.newOverride); } } //5. Loop over remaining subjectID's and delete them if(arguments.preformDelete and !structIsEmpty(srcElementStruct)){ deleteList = StructKeyList(srcElementStruct); dataPageIDList = ""; for(i=1;i<=ListLen(deleteList);i++){ currentElement = structFind(srcElementStruct,listGetAt(deleteList,i)); dataPageIDList = ListAppend(dataPageIDList,currentElement.pageID); } // 2011-07-08 - MFC - Added Step 5a. // 5a. Get any duplicate records and add to the delete dataPageIDList if ( ListLen(dupSrcDataPageIDList) ) dataPageIDList = ListAppend(dataPageIDList, dupSrcDataPageIDList); // Add the dataPageIDList to the delete command arguments.deleteOverride.args.datapageidList = dataPageIDList; ArrayAppend(commandArray,arguments.deleteOverride); } returnStruct.msg = "Differential sync scheduled succesfully!"; returnStruct.success=true; if(ArrayLen(commandArray)){ returnStruct.scheduleID=arguments.elementName&"-differentialSync"; scheduleParams = StructNew(); scheduleParams.delay = 1; scheduleParams.tasksPerBatch = 25; application.ADF.scheduler.scheduleProcess(returnStruct.scheduleID,commandArray,scheduleParams); } return returnStruct; var tempStruct = StructNew(); var pkLength = ListLen(arguments.primaryKeys); var i = ""; var currentKey = ""; var keyValue = ""; for(i=1;i<=pkLength;i++){ //Insert into the struct the value from the other struct and keep its level currentKey = ListGetAt(arguments.primaryKeys,i); if(currentKey == "_pageID"){//Reserved pageID vkey StructInsert(tempStruct,currentKey,ToString(arguments.element.pageID),true); }else{ // Set the key value and then check if key has a value. keyValue = StructFind(arguments.element.values,currentKey); if ( LEN(keyValue) ) StructInsert(tempStruct,currentKey,StructFind(arguments.element.values,currentKey),true); } } rtn = SerializeJSON(tempStruct); // Encrypt the key to avoid any problems with JSON string as key. return ENCRYPT(rtn, "diffSync", "CFMX_COMPAT", "Hex"); var tabs = ''; var tab = ''; var field = ''; tabs = getTabsFromFormID(getFormIDByCEName(arguments.ceName),true); if(NOT variables.csSecurity.validateProxy("getCEDataSecurity",arguments.customElementName)){ /*Security failed. Append to the log and return nothing useful.*/ application.ADF.utils.logAppend("Get CEData call to non-whitelisted element: #arguments.customElementName#","getCEDataSecurityException.txt"); return ArrayNew(1); }else{ /*Passed security! Pass off to parent.*/ return super.getCEData( arguments.customElementName, arguments.customElementFieldName, arguments.item, arguments.queryType, arguments.searchValues, arguments.searchFields); } ---> var dataStruct = StructNew(); var rtnArray = ArrayNew(1); var i = 1; var key = ""; for(i=1;i<=ArrayLen(array1);i++){ StructInsert(dataStruct,array1[i].pageID,array1[i],true); } for(i=1;i<=ArrayLen(array2);i++){ StructInsert(dataStruct,array2[i].pageID,array2[i],true); } for(key in dataStruct){ ArrayAppend(rtnArray,StructFind(dataStruct,key)); } return rtnArray;