Consultor Eletrônico



Kbase P130080: How to Chunk BLOB data from Socket Server
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   4/1/2008
Status: Unverified

GOAL:

How to Chunk BLOB data from Socket Server

GOAL:

Example: Chunking BLOB data from SERVER-SOCKET


FACT(s) (Environment):

All Supported Operating Systems
OpenEdge 10.x

FIX:

The following code sample demonstrates starting a SERVER-SOCKET listener object and responding to requests with 8K chunks of data. Any socket client that connects to this server will have to know how to put the BLOB data back together.

DEFINE VARIABLE hServer AS HANDLE NO-UNDO.

CREATE SERVER-SOCKET hServer.
hServer:SET-CONNECT-PROCEDURE('ServerResponse') NO-ERROR.
hServer:ENABLE-CONNECTIONS('-S 9989') NO-ERROR.

DO ON STOP UNDO, LEAVE:
/* This is simply to cause the server to wait for a connection.
To avoid using a WAIT-FOR you could put this in a REPEAT loop that
looks for a variable change, which could be affected by socket input
or a flag file or even a UI trigger (using PROCESS EVENTS) */
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.

PROCEDURE serverResponse:
DEFINE INPUT PARAMETER phSocket AS HANDLE NO-UNDO.

DEFINE VARIABLE mBuffer AS MEMPTR NO-UNDO.

DEFINE VARIABLE iChunk AS INTEGER NO-UNDO.
DEFINE VARIABLE iLength AS INTEGER NO-UNDO.
DEFINE VARIABLE iPiece AS INTEGER NO-UNDO.

FIND LAST lobTable.
IF NOT AVAILABLE lobTable THEN
RETURN.

iLength = LENGTH(lobTable.lobField).
DO iChunk = 1 TO iLength BY 8000:
IF iChunk + 1 + MIN(iLength - iChunk,8000) LE iLength THEN
iChunk = iChunk + 1.

iPiece = MIN(LENGTH(lobTable.lobField) - iChunk,8000).
SET-SIZE(mBuffer) = iPiece + 1.
COPY-LOB FROM OBJECT lobTable.lobField
STARTING AT iChunk FOR iPiece
TO mBuffer.
phSocket:WRITE(mBuffer,1,iPiece).
SET-SIZE(mBuffer) = 0.
END.
phSocket:DISCONNECT().
END PROCEDURE.