long Cx_CfgRecord::SubmitRecord() { if (m_arrValue.empty()) return 0; std::vector<FieldValue> arrValue(m_arrValue); std::wostringstream sql, ssField, ssValues; m_arrValue.clear(); if (m_bAdd) { ASSERT(DbFunc::IsDBName(m_wstrSQL.c_str())); sql << L"INSERT INTO " << m_wstrSQL << L" ("; ssValues << L") VALUES ("; } else { ASSERT(StrStrIW(m_wstrSQL.c_str(), L"SELECT ") == m_wstrSQL.c_str()); const wchar_t* pszFrom = StrStrIW(m_wstrSQL.c_str(), L"FROM "); ASSERT_MESSAGE(pszFrom != NULL, "The SQL command must contains 'FROM' keyword."); std::wstring table(DbFunc::GetLevel1Name(pszFrom + 5)); sql << L"UPDATE " << table; ssValues << L" SET "; } std::vector<FieldValue>::iterator it = arrValue.begin(); for (long i = 0; it != arrValue.end(); ++it, ++i) { std::wstring wstrField(it->first); std::wstring wstrValue(it->second); ASSERT(!wstrValue.empty()); if (StrCmpW(L"@NEWID", wstrValue.c_str()) == 0) { ASSERT(m_bAdd); m_wstrKeyField = wstrField; m_nKeyNewID = 0; if (!m_pDB->GetRecordNewID(m_nKeyNewID, m_wstrSQL, wstrField)) { return 0; } wchar_t szNum[35]; _ltow_s(m_nKeyNewID, szNum, _countof(szNum), 10); wstrValue = szNum; } else if (L'@' == wstrValue[0]) { wstrValue = GetSQLFunc(wstrValue.c_str() + 1, m_pDB->GetSQLParser()); } if (i > 0) { ssField << L","; ssValues << L","; } if (m_bAdd) { ssField << wstrField; ssValues << wstrValue; } else { ssValues << wstrField << L"=" << wstrValue; } } if (m_bAdd) { sql << ssField.str() << ssValues.str() << L") "; } else { sql << ssValues.str(); const wchar_t* pszWhere = StrStrIW(m_wstrSQL.c_str(), L" WHERE"); if (pszWhere != NULL) { sql << pszWhere; } } bool bRet = false; long nAffected = 0; try { bRet = (m_pDB->ExecuteSQL(sql.str().c_str(), __FILE__, __LINE__) != NULL); nAffected = m_pDB->GetRecordsAffected(); } CATCH_DB_STR_ERROR; return nAffected; }
BOOL CCxStructTreeUpdateParamsData::Parse( LPCTSTR lpszData, CCxStructTree * pTree ) { Clear(); CString strSrc = lpszData == NULL ? "" : lpszData; if (strSrc.IsEmpty()) return FALSE; CString str; Json::Reader reader; Json::Value obj( Json::objectValue ), arrValue( Json::arrayValue ); //CCxStructTreeRunResultParam * pValue = NULL; CCxStructTreeNode * pNode = NULL; CCxStructTreeNodeGroup * pGroupNode = NULL; CCxStructTreeNodeParam * pParamNode = NULL; CCxStructTreeUpdateParamsOperatorData * pOperatorData = NULL; try { if (!reader.parse((char*)(LPCTSTR)strSrc, obj, false)) return FALSE; if (!obj.isObject()) return FALSE; //m_strFlowNodeId = ( obj["flowId"].isString()) ? obj["flowId"].asCString() : _T(""); //str = ( obj["startIndex"].isString()) ? obj["startIndex"].asCString() : _T(""); //if ( !str.IsEmpty() ) //{ // m_nStartIndex = strtol( (char*)(LPCTSTR)str, NULL, 10 ); //} if ( !obj["groupList"].isNull() && obj["groupList"].isArray() ) { arrValue = obj["groupList"]; if ( pTree != NULL ) { pTree->m_bNodeParseing = TRUE; pTree->m_mapParseNodeCache.clear(); } for ( Json::Value::iterator itr = arrValue.begin(); itr != arrValue.end(); ++itr) { str = ( (*itr)["nodeType"].isString() ) ? (*itr)["nodeType"].asCString() : _T(""); int nNodeType = CCxStructTreeNode::ConvertNodeType( (LPCTSTR)str ); pNode = CCxStructTreeNode::GetNewNodeByType( nNodeType, pTree ); if ( pNode == NULL ) { Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } if ( !pNode->Parse( *itr/*reinterpret_cast< LPVOID > ( (Json::Value *)& (*itr) )*/ , pNode, nNodeType, NULL ) ) { delete pNode; pNode = NULL; Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } if ( !pNode->IsGroupNode() ) { delete pNode; pNode = NULL; Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } pGroupNode = (CCxStructTreeNodeGroup *)pNode; m_vGroups.push_back( pGroupNode ); } } for ( int i=0; i<(int)m_vGroups.size(); i++ ) { m_mapGroupNode.insert( make_pair( m_vGroups[i]->m_strID, m_vGroups[i] ) ); } if ( !obj["paramList"].isNull() && obj["paramList"].isArray() ) { arrValue = obj["paramList"]; if ( pTree != NULL ) { pTree->m_bNodeParseing = TRUE; pTree->m_mapParseNodeCache.clear(); } for ( Json::Value::iterator itr = arrValue.begin(); itr != arrValue.end(); ++itr) { str = ( (*itr)["nodeType"].isString() ) ? (*itr)["nodeType"].asCString() : _T(""); int nNodeType = CCxStructTreeNode::ConvertNodeType( (LPCTSTR)str ); pNode = CCxStructTreeNode::GetNewNodeByType( nNodeType, pTree ); if ( pNode == NULL ) { Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } if ( !pNode->Parse( *itr/*reinterpret_cast< LPVOID > ( (Json::Value *)& (*itr) )*/ , pNode, nNodeType, NULL ) ) { delete pNode; pNode = NULL; Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } if ( !pNode->IsParamNode() ) { delete pNode; pNode = NULL; Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } pParamNode = (CCxStructTreeNodeParam *)pNode; m_vParams.push_back( pParamNode ); } } for ( int i=0; i<(int)m_vParams.size(); i++ ) { m_mapParamNode.insert( make_pair( m_vParams[i]->m_strID, m_vParams[i] ) ); } if ( !obj["operateList"].isNull() && obj["operateList"].isArray() ) { arrValue = obj["operateList"]; for ( Json::Value::iterator itr = arrValue.begin(); itr != arrValue.end(); ++itr) { pOperatorData = new CCxStructTreeUpdateParamsOperatorData(); pOperatorData->m_strId = ( (*itr)["id"].isString() ) ? (*itr)["id"].asCString() : _T(""); pOperatorData->m_strFlag = ( (*itr)["flag"].isString() ) ? (*itr)["flag"].asCString() : _T(""); m_vOperators.push_back( pOperatorData ); } } if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } } catch (...) { Clear(); if ( pTree != NULL ) { pTree->m_bNodeParseing = FALSE; pTree->m_mapParseNodeCache.clear(); } return FALSE; } return TRUE; }