Skip to content

Instantly share code, notes, and snippets.

@NielsLiisberg
Last active July 24, 2020 08:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NielsLiisberg/3a5ea6d03687310f877ec65a7748e196 to your computer and use it in GitHub Desktop.
Save NielsLiisberg/3a5ea6d03687310f877ec65a7748e196 to your computer and use it in GitHub Desktop.
SQL write IFS file
-- Simple way to write a stream file to the IFS, by using C runtime as inline code
-- This will produce stream files UTF-8 encoded
-- I doubt it is a good idea to build huge applications this way, however it
-- is a cool example how far you can go with SQL:
----------------------------------------------------------------------------------------------
call qcmdexc ('addlible qsysinc');
call qcmdexc ('crtsrcpf FILE(QTEMP/C) MBR(C)');
delete from qtemp.c;
insert into qtemp.c (srcdta) values
('{'),
('#include <sys/types.h>'),
('#include <sys/stat.h>'),
('#include <fcntl.h>'),
('int f,l,o;'),
('mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR;'),
('o = O_WRONLY | O_CREAT | O_TRUNC | O_CCSID ;'),
('IFS_WRITE.NAME.DAT[IFS_WRITE.NAME.LEN] =0;'),
('f = open(IFS_WRITE.NAME.DAT, o, mode, 1208);'),
('l = write(f, IFS_WRITE.BUF.DAT,IFS_WRITE.BUF.LEN);'),
('close (f);'),
('}')
;
create or replace procedure qusrsys.ifs_write(name varchar(256), buf varchar(32700) ccsid 1208 )
external action
modifies sql data
set option output=*print, commit=*none, dbgview = *source
begin
if buf is not null then
include qtemp/c(c);
end if;
end;
-- Test it like this:
call qusrsys.ifs_write('/tmp/test.txt' , 'Hello');
-- And a binary version:
delete from qtemp.c;
insert into qtemp.c (srcdta) values
('{'),
('#include <sys/types.h>'),
('#include <sys/stat.h>'),
('#include <fcntl.h>'),
('int f,l,o;'),
('mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR;'),
('o = O_WRONLY | O_CREAT | O_TRUNC | O_CCSID ;'),
('IFS_WRITE_BIN.NAME.DAT[IFS_WRITE_BIN.NAME.LEN] =0;'),
('f = open(IFS_WRITE_BIN.NAME.DAT, o, mode, 1208);'),
('l = write(f, IFS_WRITE_BIN.BUF.DAT,IFS_WRITE_BIN.BUF.LEN);'),
('close (f);'),
('}')
;
create or replace procedure qusrsys.ifs_write_bin(name varchar(256), buf varchar(32700))
external action
modifies sql data
set option output=*print, commit=*none, dbgview = *source
begin
if buf is not null then
include qtemp/c(c);
end if;
end;
-- Test it like this ex place the bom code:
call qusrsys.ifs_write_bin('/tmp/test.txt' , x'EFBBBF' );
@daframe
Copy link

daframe commented Dec 5, 2019

Hi Niels ...
Thank you for this tool.
Please, verify line #10.

('#includ<sys/stat.h>'),

A letter is missed.

('#include <sys/stat.h>'),

@NielsLiisberg
Copy link
Author

Thanx for the feedback - Yes and also QSYSINC need to be installed and added to library list. In early version this dependency was not required.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment