Hello,
This script use another script (see "Database engine written in rexx") through the use of SysAddRexxMacro available in Rexxutil that come with Object Rexx and is included with eComstation.
Please note that cut and paste may not work reliably for certain special characters, so please ensure to double check the code before usage.
This script also contain some functions you may want to try somewhere else.
rxProgress can handle up to 6 values for progress at once.
It can be quite handy if you want to show how large each processing step is and how much of that has been handled.
It only update the progress bar every second even though you may call it more often.
Notice the use of RIGHT( STREAM( file.i, 'C', 'QUERY SIZE' ), 10 ) to be able to order output according to numeric file size with SELECT ... ORDER BY FILESIZE in rxdb.cmd (see "Database engine written in rexx").
/*
* Filename: add2db.cmd
* Author: JAN-ERIK
* Created: Sat Dec 24 2011
* Purpose: Script that use another script to add data to database (csv-like)
* Changes:
*/
/* Load RexxUtil Library */
If RxFuncQuery('SysLoadFuncs') Then
Do
Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
Call SysLoadFuncs
End
CALL SysCls
SAY ''
SAY ''
SAY ''
If RxFuncQuery('SysAddRexxMacro') Then
RETURN 1
retval = SysAddRexxMacro( 'rxSQL','rxdb.cmd', 'B' )
IF ARG() = 0 THEN
DO
CALL CHAROUT , 'Specify drive to list and add to database: '
PARSE PULL answer
END
ELSE answer = ARG(1)
IF rxProcess( LEFT( answer, 1 )||':' ) THEN
Call rxProgress 2, 1
RETURN 0
rxProcess: PROCEDURE EXPOSE __meter.
PARSE ARG path, progress, chunk
IF progress = '' THEN progress = 0
IF chunk = '' THEN chunk = 1
rc = SysFileTree( path||'\*.*', 'folder', 'DO' )
rc = SysFileTree( path||'\*.*', 'file', 'FO' )
DO i = 1 TO file.0
CALL rxBusy 1, file.i
CALL rxProgress 2, progress + ( i - 1 ) / ( file.0 + folder.0 ) * chunk
CALL rxSQL "INSERT INTO files (COMPUTER,PATH,NAME,DRIVE,FILESIZE) VALUES ('"||VALUE( 'HOSTNAME',, 'OS2ENVIRONMENT' )||"','"||FILESPEC( 'P', file.i )||"','"||FILESPEC( 'N', file.i )||"','"||FILESPEC( 'D', file.i )||"','"||RIGHT( STREAM( file.i, 'C', 'QUERY SIZE' ), 10 )||"')"
END
DO i = 1 TO folder.0
CALL rxBusy 1, folder.i
Call rxProgress 2, progress + ( i + file.0 - 1 ) / ( file.0 + folder.0 ) * chunk
CALL rxProcess folder.i, progress + ( i + file.0 - 1 ) / ( file.0 + folder.0 ) * chunk, chunk / ( file.0 + folder.0 )
END
RETURN 1
/* display_on_row, part */
rxProgress: PROCEDURE EXPOSE __meter.
/* IF TRACE() <> 'O' THEN RETURN 0*/
row = ARG(1)
chr = '█▓▒░■█ '
IF \DATATYPE( __meter.width, 'W' ) THEN
PARSE VALUE SysTextScreenSize() WITH . __meter.width
DO i = 2 TO MIN( ARG(), LENGTH( chr ) )
j = i - 1
IF \DATATYPE( ARG(i), 'N' ) THEN RETURN 0
progress.j = FORMAT( ARG(i),,, 0 )
IF LENGTH( FORMAT( 100 * progress.j,, 0, 0 ) ) > 3 THEN
RETURN 0
END
progress.0 = j
processed.0 = 0
output = ''
CALL SysStemSort 'progress'
DO i = 1 TO MIN( progress.0, LENGTH( chr ) )
j = i - 1
processed.i = FORMAT( MIN( ( __meter.width - 4 ) * progress.i , __meter.width - 4 ),, 0, 0 )
progress.i = FORMAT( 100 * progress.i, 3, 0, 0 )
IF processed.i > processed.j THEN
output = output||COPIES( SUBSTR( chr, i, 1 ), processed.i - processed.j )
END
i = i - 1
output = output||COPIES( SUBSTR( chr, LENGTH( chr ), 1 ), __meter.width - 4 - processed.i )
CALL rxOut ARG(1), output||RIGHT( progress.1||'%', 4 )
RETURN 0
/* display_on_row, text */
rxBusy: PROCEDURE EXPOSE __meter.
/* IF TRACE() <> 'O' THEN RETURN 0*/
PARSE ARG row, txt
IF \DATATYPE( __meter.row.t_stamp , 'N' ) THEN
__meter.row.t_stamp = TIME( 'S' )
IF __meter.row.t_stamp + 1 < TIME( 'S' ) THEN
DO
SELECT
WHEN __meter.counter = 1 THEN
CALL rxOut row, '/ '||txt
WHEN __meter.counter = 2 THEN
CALL rxOut row, '- '||txt
WHEN __meter.counter = 3 THEN
CALL rxOut row, '\ '||txt
OTHERWISE
__meter.counter = 0
CALL rxOut row, '| '||txt
END
__meter.counter = __meter.counter + 1
END
RETURN 0
/* display_on_row, text */
rxOut: PROCEDURE EXPOSE __meter.
/* IF TRACE() <> 'O' THEN RETURN 0*/
PARSE ARG row, txt
IF \DATATYPE( __meter.row.t_stamp, 'W' ) THEN
PARSE VALUE SysTextScreenSize() WITH . __meter.width
isNum = DATATYPE( row, 'W' )
IF isNum THEN
DO
IF DATATYPE( __meter.row.t_stamp, 'W' ) THEN
IF __meter.row.t_stamp + 1 > TIME( 'S' ) THEN RETURN 0
PARSE VALUE SysCurPos( row, 0 ) with prev_row prev_col
END
ELSE IF DATATYPE( __meter.row.t_stamp, 'W' ) THEN
IF __meter.row.t_stamp + 1 > TIME( 'S' ) THEN RETURN 0
SAY LEFT( txt, MAX( __meter.width, MIN( LENGTH( ARG(2) ), __meter.width ) ) )
IF isNum THEN
DO
CALL SysCurPos prev_row, prev_col
__meter.row.t_stamp = TIME( 'S' )
END
ELSE
__meter.row.t_stamp = TIME( 'S' )
RETURN 0
Merry XMas from Sweden
//Jan-Erik