Input from named pipe

Posted by Michael Brandt on 27-Mar-2017 10:32

I am trying to read from a named pipe on linux into a longchar.  I first tried the copy-lob, but this didn't work for named pipes.  Then I tried Input From, and the compiler said longchar is an invalid import source.  Is there any way to read directly from a named pipe into a longchar?  If I used input/import and read the named pipe to a char with a repeat statement, will there be any problems if the pipe contains more data than can fit into a regular char?  Are there any best practices for doing this?  I'm using 10.2B008.

Thanks,

Michael

Posted by Garry Hall on 28-Mar-2017 14:59

IMPORT with CHARACTER vars is line-oriented. Each IMPORT will stop at the end of a line. If your line is longer than the max size of a CHARACTER, then the IMPORT will fail with a message that might not be obvious, but basically means you have exceeded the size of a variable. Easy enough to test:

DEFINE VARIABLE cline AS CHARACTER   NO-UNDO.

OUTPUT TO "longdata.txt".
PUT UNFORMATTED FILL("x",30000).
PUT UNFORMATTED FILL("y",2000).
PUT UNFORMATTED SKIP.
OUTPUT CLOSE.

INPUT FROM "longdata.txt".
IMPORT UNFORMATTED cline.
INPUT CLOSE.

As far as I can tell, reading from a named pipe on unix/linux is the same as reading from a file.

All Replies

Posted by Garry Hall on 27-Mar-2017 11:11

LONGCHARs have a specific IMPORT format. This is why you are getting the "Invalid source for IMPORT of LONGCHAR variable. (14346)" error. If you had the same data in a text file, and tried to read it, I expect you would see the same thing, it is not specific to named pipes.

I am assuming you are trying to read a stream of unknown length into a LONGCHAR. Is this correct? If so, you might try IMPORTing into RAWs of a determined length then appending to a LONGCHAR. I have not tried this.

Posted by Michael Brandt on 28-Mar-2017 14:38

The only way I've found to read from a named pipe is to define a longchar.  Then I place an import inside a repeat, and read the data into a character variable.  Finally I can append the character data to the longchar var.  The copy-lob only seemed to throw an error when the data was in a named pipe.  I only have some basic text in the pipe.  But if the data is in a file, copy-lob is ok.  Can I be sure that the import statement will not read more data than the character variable can hold?

Posted by Garry Hall on 28-Mar-2017 14:59

IMPORT with CHARACTER vars is line-oriented. Each IMPORT will stop at the end of a line. If your line is longer than the max size of a CHARACTER, then the IMPORT will fail with a message that might not be obvious, but basically means you have exceeded the size of a variable. Easy enough to test:

DEFINE VARIABLE cline AS CHARACTER   NO-UNDO.

OUTPUT TO "longdata.txt".
PUT UNFORMATTED FILL("x",30000).
PUT UNFORMATTED FILL("y",2000).
PUT UNFORMATTED SKIP.
OUTPUT CLOSE.

INPUT FROM "longdata.txt".
IMPORT UNFORMATTED cline.
INPUT CLOSE.

As far as I can tell, reading from a named pipe on unix/linux is the same as reading from a file.

This thread is closed