home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 18 REXX
/
18-REXX.zip
/
dbmplus.zip
/
DBMPLUS.CMD
next >
Wrap
OS/2 REXX Batch file
|
1996-04-06
|
17KB
|
550 lines
/******************************************************************/
/* DBMPLUS - DBM Command Line Interpreter */
/* Version 0.7 */
/* Author Joachim Hagen */
/******************************************************************/
say
say "--------------------------------------------------"
say "DBMPLUS - DBM Command Line Interpreter Version 0.7"
say " By Joachim Hagen"
say " Last modification on 4/6/96"
say
say "Type h for help"
say "--------------------------------------------------"
say
call RxFuncAdd 'SysCurPos','RexxUtil','SysCurPos'
call RxFuncAdd 'SysFileDelete','RexxUtil','SysFileDelete'
call RxFuncAdd 'SysGetKey','RexxUtil','SysGetKey'
call RxFuncAdd 'SysFileTree','RexxUtil','SysFileTree'
i = 0
befehl.0 = 0
last_befehl.0 = 0
erste_zeile = 1
spoolfile = ""
spoolopt = ""
echoopt = ""
editor = "e.exe"
previous_dateiname = ""
parse arg argumente
call init argumente
do forever
if erste_zeile = 1 then promptst = "DBM> "; else promptst = format(i+1,4)||" "
kommando = prompt(promptst)
parse var kommando wort1 rest
if translate(kommando) = ".C" then do
erste_zeile = 1
iterate
end /* Do */
if erste_zeile = 1 then do
select
when kommando = "" then iterate
when abbrev("HELP",translate(kommando),1) then do
call help_anzeige
iterate
end /* Do */
when abbrev("EXIT",translate(kommando),2) then leave
when abbrev("RUN",translate(kommando),1) then do
call show_befehl
say
call dbm echoopt,
spoolopt,
anweisung
erste_zeile = 1
iterate
end /* Do */
when abbrev("List",translate(wort1),1) then do
if rest = "" then call show_befehl
else do
ix = get_zeilennr("List",rest)
if translate(ix) = ".C" then iterate
say format(ix,4) befehl.ix
end /* Do */
iterate
end /* Do */
when abbrev("EDIT",translate(wort1),1) then do
if rest="" then rest = "temp.dbm"
dn = get_dateinm(rest)
if dn = "temp.dbm" then call save_befehl dn
if translate(dn) = ".C" then iterate
'@'editor dn
if dn = "temp.dbm" then do
call load_befehl dn
call build_anweisung
call show_befehl
end /* Do */
iterate
end /* Do */
when abbrev("SAVE",translate(wort1),1) then do
dn = get_dateinm(rest)
if translate(dn) = ".C" then iterate
call save_befehl dn
iterate
end /* Do */
when abbrev("LOAD",translate(wort1),2) then do
dn = get_dateinm(rest)
if translate(dn) = ".C" then iterate
call save_last_befehl
call load_befehl dn
call build_anweisung
call show_befehl
iterate
end /* Do */
when abbrev("COMPILE",translate(wort1),1) then do
dn = get_dateinm(rest)
if translate(dn) = ".C" then iterate
rc=lineout(dn,,1)
rc=lineout(dn,"/* Generated by DBMPLUS */");
do i=1 to befehl.0
select
when i=1 & i<befehl.0 then
rc=lineout(dn,"call dbm '" || befehl.i || "',")
when i=1 & befehl.0=1 then
rc=lineout(dn,"call dbm '" || befehl.i || "'")
when i>1 & i<befehl.0 then
rc=lineout(dn," '" || befehl.i || "',")
when i>1 & i=befehl.0 then
rc=lineout(dn," '" || befehl.i || "'")
otherwise nop
end /* select */
end /* do */
rc=lineout(dn)
iterate
end /* Do */
when abbrev("STORE",translate(wort1),2) then do
rg = get_register(rest);
if translate(rg) = ".C" then iterate
do i = 0 to befehl.0
register.rg.i = befehl.i
end /* do */
iterate
end /* Do */
when abbrev("RECALL",translate(wort1),2) then do
rg = get_register(rest);
if translate(rg) = ".C" then iterate
call save_last_befehl
do i = 0 to register.rg.0
befehl.i = register.rg.i
end /* do */
call build_anweisung
call show_befehl
iterate
end /* Do */
when abbrev("DESCRIBE",translate(wort1),1) then do
tn = get_tablenm(rest);
if translate(tn) = ".C" then iterate
call show_columns tn
iterate
end /* Do */
when abbrev("TABLES",translate(wort1),1) then do
cr = get_creator(rest);
if translate(cr) = ".C" then iterate
call show_tables cr
iterate
end /* Do */
when abbrev("INDEXES",translate(wort1),1) then do
tn = rest
if tn="" then tn = "%"
call show_indexes tn
iterate
end /* Do */
when abbrev("FOREIGN",translate(wort1),1) then do
tn = rest
if tn="" then tn = "%"
call show_foreign_keys tn
iterate
end /* Do */
when abbrev("UNDO",translate(kommando),1) then do
do i = 0 to last_befehl.0
befehl.i = last_befehl.i
end /* do */
call build_anweisung
call show_befehl
iterate
end /* Do */
when abbrev("HOST",translate(wort1),2) then do
if rest="" then 'cmd.exe'
else 'cmd.exe /C' rest
say
iterate
end /* Do */
when abbrev("SPOOL",translate(wort1),2) then do
call control_spool rest
iterate
end /* Do */
when abbrev("ECHO",translate(wort1),2) then do
call control_echo rest
iterate
end /* Do */
when abbrev("LOGON",translate(wort1),3) then do
call dbm 'connect reset'
call init_benutzer rest
call init_datenbank ""
iterate
end /* Do */
when abbrev("SHOW",translate(kommando),2) then do
say "User " translate(benutzer)
say "Editor" editor
if spoolopt = "" then say "Spool OFF ("spoolfile")"
else say "Spool ON " spoolfile
if echoopt = "" then say "Echo ON"
else say "Echo OFF"
iterate
end /* Do */
otherwise
if length(wort1) < 3 & wort1 \= "?" then do
say " Invalid command"
iterate
end /* Do */
end /* select */
end /* Do */
if erste_zeile = 1 then do
i = 0
call save_last_befehl
end /* Do */
i = i + 1; befehl.0 = i; befehl.i = kommando
if right(befehl.i,1) <> ";" then do
erste_zeile = 0
end /* Do */
else do
befehl.i = left(befehl.i,length(befehl.i)-1)
if befehl.i = "" then befehl.0 = i-1
call build_anweisung
say
call dbm echoopt,
spoolopt,
anweisung
erste_zeile = 1
end /* Do */
end /* do */
call terminate
exit
prompt: procedure
parse arg promptst
say promptst
call move_cursor length(promptst)
parse pull promptvl
return promptvl
prompt_ok: procedure
parse arg promptst
do until promptvl = "Y" | promptvl = "N"
promptvl = translate(prompt(promptst||"? (y/n): "))
end /* do */
if promptvl = "Y" then return 1
return 0
prompt_noecho: procedure
parse arg promptst
say promptst
call move_cursor length(promptst)
promptvl = ""
do until c2d(taste) = 13
taste = SysGetKey('NOECHO')
if c2d(taste) \= 13 then promptvl = promptvl || taste
end /* do */
return promptvl
move_cursor: procedure
parse arg sp
parse value SysCurPos() with zl sp0
zl = zl - 1
cp = SysCurPos(zl,sp)
return
show_befehl: procedure expose befehl.
do i = 1 to befehl.0
say format(i,4) befehl.i
end /* do */
return
save_last_befehl: procedure expose befehl. last_befehl.
do i = 0 to befehl.0
last_befehl.i = befehl.i
end /* do */
return
build_anweisung: procedure expose anweisung befehl.
anweisung=""
do i=1 to befehl.0
anweisung = anweisung befehl.i
end /* do */
return
check_index: procedure expose befehl.
parse arg ix
if translate(ix) = ".C" then return 1
if datatype(ix,'W') = 0 then return 0
if ix < 1 | ix > befehl.0 then return 0
return 1
get_zeilennr: procedure expose befehl.
funktext = arg(1)
parm = arg(2)
do forever
if parm<>"" then do
ix = parm
parm = ""
end /* Do */
else do
ix = prompt(funktext || " line: ")
end /* Do */
ix = strip(ix)
if check_index(ix) then leave
else say " Invalid line specification"
end /* do */
return ix
get_dateinm: procedure expose previous_dateiname
dn = arg(1)
if dn="" then dn = prompt("File: ")
if dn = "*" then do
dn = previous_dateiname
if dn \= "" then do
if prompt_ok("File "||dn) = 0 then dn = ".C"
end /* Do */
end /* do */
if dn="" then dn = ".C"
if translate(dn) = ".C" then return dn
if dn \= "temp.dbm" then previous_dateiname = dn
return dn
get_register: procedure
parm = arg(1)
do forever
if parm<>"" then do
rg = parm
parm = ""
end /* Do */
else do
rg = prompt("Reg#: ")
end /* Do */
rg = strip(rg)
if datatype(rg,'W') then leave
else say " Invalid register specification"
end /* do */
return rg
get_tablenm: procedure
tn = arg(1)
if tn = "" then tn = prompt("Table: ");
return tn
get_creator: procedure expose benutzer
cr = arg(1)
if cr = "" then cr = benutzer
return cr
save_befehl: procedure expose befehl.
parse arg dn
rc = SysFileDelete(dn)
if rc > 2 then do
say "Zugriff auf die Datei" dn "nicht möglich; RC =" rc
return
end /* Do */
rc=lineout(dn,,1)
do i=1 to befehl.0
rc=lineout(dn,befehl.i)
end /* do */
rc = lineout(dn)
return
load_befehl: procedure expose befehl.
parse arg dn
zeile=linein(dn,1,0)
i = 0
do forever
zeile=linein(dn)
if zeile="" then leave
i = i + 1
befehl.i = zeile
end /* do */
rc = lineout(dn)
befehl.0 = i
return
show_columns: procedure expose echoopt spoolopt
parse upper arg tn
p = pos('.', tn)
say
if p=0 then do
call dbm echoopt,
spoolopt,
'select colno, keyseq, name, coltype, length, scale, nulls',
'from sysibm.syscolumns',
'where tbname =' "'"tn"'",
'order by colno'
end /* Do */
else do
tc = left(tn,p-1)
tn = substr(tn,p+1)
call dbm echoopt,
spoolopt,
'select colno, name, coltype, length, scale, nulls',
'from sysibm.syscolumns',
'where tbcreator =' "'"tc"'",
'and tbname =' "'"tn"'",
'order by colno'
end /* Do */
return
show_tables: procedure expose echoopt spoolopt
parse upper arg cr
say
call dbm echoopt,
spoolopt,
'select name, type, remarks',
'from sysibm.systables',
'where creator =' "'"cr"'",
'order by name'
return
show_indexes: procedure expose echoopt spoolopt benutzer
parse upper arg tn
say
call dbm echoopt,
spoolopt,
'select name, tbname, cc, ur, colnames',
'from usrindexes',
'where (tbname like' "'"tn"'",
'and tbcreator =' "'"translate(benutzer)"')",
'or tbname =' "'"tn"'",
'order by name'
return
show_foreign_keys: procedure expose echoopt spoolopt benutzer
parse upper arg tn
say
call dbm echoopt,
spoolopt,
'select relation, rules, fkcolnames, pkcolnames',
'from usrrels',
'where tbname like' "'"tn"'",
'and creator =' "'"translate(benutzer)"'",
'order by relation'
return
control_spool: procedure expose spoolfile spoolopt
parse upper arg parm
select
when parm="ON" | parm="" then do
if spoolfile="" then do
dn = get_dateinm("")
if translate(dn)=".C" then return
spoolfile = dn
end /* Do */
spoolopt = "-r("spoolfile")"
end /* Do */
when parm="OFF" then do
spoolopt = ""
end /* Do */
otherwise
dn = get_dateinm(parm)
if translate(dn)=".C" then return
spoolfile = dn
spoolopt = "-r("spoolfile")"
end /* select */
return
control_echo: procedure expose echoopt
parse upper arg parm
select
when parm="ON" then echoopt = ""
when parm="OFF" then echoopt = "-o"
otherwise
say "Parameter for ECHO must be 'ON' or 'OFF'"
end /* select */
return
help_anzeige: procedure
say
say "DBMPLUS-Commands:"
say
say "Command Parameters Description"
say "---------------------------------------------------------------------"
say "Help Show this help text"
say "EXit Exit DBMPLUS"
say "SPool ON|OFF|<file> (De)activate spooling"
say "ECho ON|OFF (De)activate echoing"
say "Run Run actual SQL command"
say "List List actual SQL command"
say "Edit <none>|<file> Invoke editor for actual SQL command or file"
say "Save <file> Save actual SQL command in a file"
say "LOad <file> Load acctual SQL command from a file"
say "Compile <file> Compile actual SQL command to Rexx procedure"
say "STore <refno> Store actual SQL command by refno"
say "REcall <refno> Recall actual SQL command by refno"
say "Describe <tablename> Show columns of a table"
say "Tables <none>|<creator> Tables for a creator"
say "Indexes <none>|<tablemame> Indexes for all or specific table"
say "Foreign <none>|<tablename> Foreign keys for all or specific table"
say "Undo Recall last SQL command"
say "HOst <none>|<command> Change to DOS or execute DOS command"
say "LOGon <user>[/<password>] Logon to another user"
say "SHow Show settings"
say " <file> may be represented by '*' denoting the previously used file"
say "DBMPLUS commands may be abbreviated as indicated by upper case letters"
say
say "Any other input statements than those listed above are directed to dbm."
say "They may consist of several lines, the last of which must be terminated"
say "by a ';'. To abort a statement, enter '.c'"
say
return
init: procedure expose benutzer editor spoolfile
parse arg argumente
parse var argumente benupassw datenbank
call dbm 'startdbm'
call init_benutzer benupassw
if RESULT=0 then exit 0
call init_datenbank datenbank
call init_inifile
return
init_benutzer: procedure expose benutzer
parse arg benupassw
if benupassw="" then do
benupassw = prompt(" User: ")
if translate(benupassw) = ".C" | benupassw = "" then return 0
end /* Do */
bptpos = pos("/",benupassw)
if bptpos = 0 then do
passw = prompt_noecho("Password: ")
say
if translate(passw) = ".C" | passw = "" then return 0
benutzer = benupassw
end /* Do */
else do
passw = substr(benupassw,bptpos+1)
benutzer = left(benupassw,bptpos-1)
end /* Do */
'@echo off'
'logon' benutzer '/P='passw
'echo on'
return 1
init_datenbank: procedure
parse arg datenbank
if datenbank="" then do
datenbank = prompt("Database: ")
if translate(datenbank) = ".C" | datenbank = "" then return
end /* Do */
call dbm 'connect to' datenbank
return
init_inifile: procedure expose editor spoolfile
call SysFileTree 'c:.\dbmplus.ini', 'dn', 'FO'
if dn.0 = 0 then return
zeile=linein(dn.1,1,0)
do forever
zeile=linein(dn.1)
if zeile="" then leave
interpret zeile
end /* do */
rc = lineout(dn.1)
return
terminate: procedure
call dbm 'connect reset'
return