/* pro2jdbc.p - connecting Progress4GL to JDBC via sockets */ {pro2jdbc.i THIS-PROCEDURE} &GLOBAL-DEFINE ERR_NO_ERR 0 &GLOBAL-DEFINE ERR_NO_CONN -1 DEFINE VARIABLE hSocket AS HANDLE. /* There is no main block - this procedure must be persistent */ IF NOT THIS-PROCEDURE:PERSISTENT THEN DO: MESSAGE "{&FILE-NAME} should only be RUN PERSISTENT.". RETURN. END. /*------------------------------------------------------------*/ FUNCTION jdbcExecuteQuery RETURNS LOG ( INPUT queryString AS CHAR ) : DEF VAR ret AS LOG. DEF VAR mBuffer AS MEMPTR. DEF VAR querySize AS INT. SET-BYTE-ORDER(mBuffer) = BIG-ENDIAN. querySize = LENGTH(queryString). SET-SIZE(mBuffer) = querySize * 3. /* why querySize is not enough ??? */ PUT-STRING(mBuffer,1,querySize) = queryString. hSocket:WRITE (mBuffer,1,querySize). ret = TRUE. RETURN ret. END FUNCTION. /*------------------------------------------------------------*/ FUNCTION jdbcGetRecord RETURNS CHAR : DEF VAR recordAsChar AS CHAR. DEF VAR mBuffer AS MEMPTR. DEF VAR recSize AS INT. /* read record size */ SET-BYTE-ORDER(mBuffer) = BIG-ENDIAN. SET-SIZE(mBuffer) = 4. /* 4 bytes for int/long */ hSocket:READ(mBuffer,1,4). recSize = GET-LONG(mBuffer,1). /*Unmarshal data*/ SET-SIZE(mBuffer) = 0. /* free memory */ IF recSize <= 0 THEN /* no more records */ recordAsChar = ?. ELSE DO: /* read record */ SET-SIZE(mBuffer) = recSize. hSocket:READ (mBuffer,1,recSize). recordAsChar = GET-STRING(mBuffer,1). /*Unmarshal data*/ SET-SIZE(mBuffer) = 0. /* free memory */ END. RETURN recordAsChar. END FUNCTION. /*------------------------------------------------------------*/ FUNCTION jdbcOpenConnection RETURNS LOG ( INPUT connectionParams AS CHAR ) : DEF VAR ret AS LOG INITIAL FALSE. jdbcCloseConnection(FALSE). CREATE SOCKET hSocket. hSocket:CONNECT(connectionParams). IF hSocket:CONNECTED() THEN ret = TRUE. RETURN ret. END FUNCTION. /*------------------------------------------------------------*/ FUNCTION jdbcCloseConnection RETURNS LOG ( stopServer AS LOG ) : DEF VAR ret AS LOG INITIAL TRUE. IF VALID-HANDLE(hSocket) THEN DO: IF hSocket:CONNECTED() THEN DO: IF stopServer THEN jdbcExecuteQuery("END_PROCESSING"). ELSE jdbcExecuteQuery("LAST_REQUEST"). hSocket:DISCONNECT(). END. DELETE OBJECT hSocket. END. RETURN TRUE. END FUNCTION.