Esempio n. 1
0
void processWindowMessage(LONG_PTR source, LONG_PTR hwnd, WPARAM wParam, LPARAM lParam)
{
    char							procVar[30] = ST_TRAYNOTIFICATION;
    LONG_PTR							procNbr = 0;
    PA_Variable						fourDVar;
    BOOL							bFuncReturn;


    bFuncReturn = SetForegroundWindow(windowHandles.fourDhWnd);
    switch (source)
    {
    case TRAY_ICON_FUNCTION :
        if( ( PA_Get4DVersion() & 0x0000FFFF ) < 0x00001100 ) {
            // REB #17503 8/8/08 in v11 we can no longer call PA_GetVariable from this subclass.
            //   Instead of setting the ST_TRAYNOTIFICATION variable, we will just do a call
            //   back to the monitoring process in 4D on double clicks.
            strcpy(procVar, ST_TRAYNOTIFICATION);
            fourDVar = PA_GetVariable(procVar);
            if (PA_GetVariableKind(fourDVar) == eVK_Longint) {
                PA_SetLongintVariable(&fourDVar, lParam);
                PA_SetVariable(procVar, fourDVar, 1);
                findIconID( &startPtr, (LONG_PTR)wParam, &procNbr); // find icon id and get process number
                PA_UpdateProcessVariable(procNbr);
            }
        } else {
            if((lParam==515)|(lParam==518)) {
                findIconID( &startPtr, (LONG_PTR)wParam, &procNbr); // find icon id and get process number
                PA_UpdateProcessVariable(procNbr);
            };
        };
        break;

    case RESPECT_TOOL_BAR_FUNCTION :
        // REB #16207 1/7/09 In v11 we can no longer call PA_GetVariable from this subclass.
        // Unfortunately we won't be able to support use of <>TB_NOTIFICATION anymore.
        if( ( PA_Get4DVersion() & 0x0000FFFF ) < 0x00001100 ) {
            strcpy(procVar, TB_NOTIFICATION);
            fourDVar = PA_GetVariable(procVar);
            if (PA_GetVariableKind(fourDVar) == eVK_ArrayLongint) {
                if (PA_GetArrayNbElements(fourDVar) == 4) {
                    if (toolBarRestrictions.leftProcessNbr > 0) {
                        PA_SetLongintInArray(fourDVar, 1, hwnd);
                        PA_SetVariable(procVar, fourDVar, 0);
                        PA_UpdateProcessVariable(toolBarRestrictions.leftProcessNbr);
                    }
                    if (toolBarRestrictions.topProcessNbr > 0) {
                        PA_SetLongintInArray(fourDVar, 2, hwnd);
                        PA_SetVariable(procVar, fourDVar, 0);
                        PA_UpdateProcessVariable(toolBarRestrictions.topProcessNbr);
                    }
                    if (toolBarRestrictions.rightProcessNbr > 0) {
                        PA_SetLongintInArray(fourDVar, 3, hwnd);
                        PA_SetVariable(procVar, fourDVar, 0);
                        PA_UpdateProcessVariable(toolBarRestrictions.rightProcessNbr);
                    }
                    if (toolBarRestrictions.bottomProcessNbr > 0) {
                        PA_SetLongintInArray(fourDVar, 4, hwnd);
                        PA_SetVariable(procVar, fourDVar, 0);
                        PA_UpdateProcessVariable(toolBarRestrictions.bottomProcessNbr);
                    }
                }
            }
        } else {
            // REB 3/29/10 #22878 Since we can't update the TB_NOTIFICATION array, just do a call to the toolbar processes.
            if (toolBarRestrictions.leftProcessNbr > 0) {
                PA_UpdateProcessVariable(toolBarRestrictions.leftProcessNbr);
            }
            if (toolBarRestrictions.topProcessNbr > 0) {
                PA_UpdateProcessVariable(toolBarRestrictions.topProcessNbr);
            }
            if (toolBarRestrictions.rightProcessNbr > 0) {
                PA_UpdateProcessVariable(toolBarRestrictions.rightProcessNbr);
            }
            if (toolBarRestrictions.bottomProcessNbr > 0) {
                PA_UpdateProcessVariable(toolBarRestrictions.bottomProcessNbr);
            }
        }

        break;

    }
}
void OD_Set_SQL_in_cursor(sLONG_PTR *pResult, PackagePtr pParams)
{
	C_LONGINT Param1;
	C_TEXT Param2;
	C_LONGINT Param3;	
	C_LONGINT returnValue;
	
	Param1.fromParamAtIndex(pParams, 1);
	Param2.fromParamAtIndex(pParams, 2);
	Param3.fromParamAtIndex(pParams, 3);
	
	uint32_t cursorId = Param1.getIntValue();
	
	sword err = 0;
	
	ORACLE_SQL_CURSOR *cursor = _cursorGetAndCheckInactive(cursorId);
	
	if(cursor)
	{
		sessionInfo *session = _sessionGet(cursor->sessionId);
		
		if(session)
		{
			_cursorClearBind(session, cursor);
			
			//convert 4D bindings to oracle bindings
			CUTF8String sql, substr;
			Param2.copyUTF8String(&sql);
			
			size_t start, end, pos; 
			end = 0;
			pos = 0;
			
			C_TEXT variableName;
			PA_Variable variable;
			
			CUTF8String parsedSql;
			
			ORACLE_SQL_SUBSTITUTION_LIST substitutions;
			//ORACLE_SQL_BIND_TYPE_LIST isByName;
			ORACLE_SQL_BIND_NAME_LIST names;
			
			C_TEXT temp;
			CUTF16String u16;
			
			for(start = sql.find((const uint8_t *)"<<"); start != CUTF8String::npos; start = sql.find((const uint8_t *)"<<", end))
			{
				end = sql.find((const uint8_t *)">>", start);
				if(end != CUTF8String::npos)
				{
					start += 2;//length of "<<"
					substr = sql.substr(start, end-start);
					
					variableName.setUTF8String(&substr);
					variable = PA_GetVariable((PA_Unichar *)variableName.getUTF16StringPtr());
					
					parsedSql += sql.substr(pos, start - pos - 2);
					parsedSql += (const uint8_t *)":";
					
					if(substr.length()){
						
						parsedSql += substr;
						//isByName.push_back(true);
						temp.setUTF8String(&substr);
						temp.copyUTF16String(&u16);
						
					}else{
						
						char buf[10];
						size_t len;
						
						len = sprintf(buf,"%d", (int)substitutions.size() + 1);
						parsedSql += CUTF8String((const uint8_t *)buf, len);
						//isByName.push_back(false);
						u16.clear();
						
					}
					
					pos = end + 2;//length of ">>"
					
					names.push_back(u16);
					substitutions.push_back(variable);	
					
				}
				
			}
			
			//remaining text
			parsedSql += sql.substr(pos);			

			temp.setUTF8String(&parsedSql);
			temp.copyUTF16String(&cursor->sql);
			
			cursor->substitutions = substitutions;
//			cursor->isByName = isByName;
			cursor->names = names;
			
			size_t count = substitutions.size();
			
			_cursorResize(session, cursor, count);

			unsigned int sql_type = 0;
			
			ub4 language = OCI_NTV_SYNTAX;
			
			switch (Param3.getIntValue())
			{
				case 2:
					language = OCI_V7_SYNTAX;
					break;

				case 3:
					language = OCI_V8_SYNTAX;
					break;					
			}
			
			err = OCIStmtPrepare(cursor->stmtp, cursor->errhp, 
						   (CONST text *)cursor->sql.c_str(), 
						   (ub4)cursor->sql.length() * sizeof(PA_Unichar),								 
						   language,
						   OCI_DEFAULT);
			
			//in characters or in number of bytes, depending on the encoding
			//http://docs.oracle.com/cd/B10500_01/appdev.920/a96584/oci16ms6.htm
			
			if(!err)
			{
				err = OCIAttrGet(cursor->stmtp, OCI_HTYPE_STMT, (dvoid *)&sql_type, 0, OCI_ATTR_STMT_TYPE, cursor->errhp);
				//http://docs.oracle.com/cd/B10500_01/appdev.920/a96584/oci15r20.htm#443771
				
				if(!err)
				{
					cursor->sql_type = sql_type;
					//http://docs.oracle.com/cd/E14072_01/appdev.112/e10646/oci04sql.htm#CIHEHCEJ	
					
					switch (sql_type)
					{
						case OCI_STMT_SELECT:
							cursor->isTowardsSQL.assign(count, false);//SELECT is towards 4D
							break;					
						default:
							cursor->isTowardsSQL.assign(count, true);//INSERT is towards SQL
							break;
					}
					
					returnValue.setIntValue(1);

				}

			}
			
			if(err)
			{
				_errorInfoSet(0, cursor->errhp, cursor->sessionId, cursorId, false, PA_GetCurrentProcessNumber(), 0);	
				returnValue.setIntValue(err);
			}
			
		}

	}
		
	returnValue.setReturn(pResult);	
	
}