home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / dbmplus.zip / DBMPLUS.CMD next >
OS/2 REXX Batch file  |  1996-04-06  |  17KB  |  550 lines

  1. /******************************************************************/
  2. /* DBMPLUS - DBM Command Line Interpreter                         */
  3. /* Version 0.7                                                    */
  4. /* Author  Joachim Hagen                                          */
  5. /******************************************************************/
  6. say
  7. say "--------------------------------------------------"
  8. say "DBMPLUS - DBM Command Line Interpreter Version 0.7"
  9. say "                By Joachim Hagen"
  10. say "          Last modification on 4/6/96"
  11. say
  12. say "Type h for help"
  13. say "--------------------------------------------------"
  14. say
  15. call RxFuncAdd 'SysCurPos','RexxUtil','SysCurPos'
  16. call RxFuncAdd 'SysFileDelete','RexxUtil','SysFileDelete'
  17. call RxFuncAdd 'SysGetKey','RexxUtil','SysGetKey'
  18. call RxFuncAdd 'SysFileTree','RexxUtil','SysFileTree'
  19. i = 0
  20. befehl.0 = 0
  21. last_befehl.0 = 0
  22. erste_zeile = 1
  23. spoolfile = ""
  24. spoolopt = ""
  25. echoopt = ""
  26. editor = "e.exe"
  27. previous_dateiname = ""
  28. parse arg argumente
  29. call init argumente
  30. do forever
  31.    if erste_zeile = 1 then promptst = "DBM> "; else promptst = format(i+1,4)||" "
  32.    kommando = prompt(promptst)
  33.    parse var kommando wort1 rest
  34.    if translate(kommando) = ".C" then do
  35.       erste_zeile = 1
  36.       iterate
  37.    end  /* Do */
  38.    if erste_zeile = 1 then do
  39.       select
  40.          when kommando = "" then iterate
  41.          when abbrev("HELP",translate(kommando),1) then do
  42.             call help_anzeige
  43.             iterate
  44.          end  /* Do */
  45.          when abbrev("EXIT",translate(kommando),2) then leave
  46.          when abbrev("RUN",translate(kommando),1) then do
  47.             call show_befehl
  48.             say
  49.             call dbm echoopt,
  50.                      spoolopt,
  51.                      anweisung
  52.             erste_zeile = 1
  53.             iterate
  54.          end  /* Do */
  55.          when abbrev("List",translate(wort1),1) then do
  56.             if rest = "" then call show_befehl
  57.             else do
  58.                ix = get_zeilennr("List",rest)
  59.                if translate(ix) = ".C" then iterate
  60.                say format(ix,4) befehl.ix
  61.             end  /* Do */
  62.             iterate
  63.          end  /* Do */
  64.          when abbrev("EDIT",translate(wort1),1) then do
  65.             if rest="" then rest = "temp.dbm"
  66.             dn = get_dateinm(rest)
  67.             if dn = "temp.dbm" then call save_befehl dn
  68.             if translate(dn) = ".C" then iterate
  69.             '@'editor dn
  70.             if dn = "temp.dbm" then do
  71.                call load_befehl dn
  72.                call build_anweisung
  73.                call show_befehl
  74.             end  /* Do */
  75.             iterate
  76.          end  /* Do */
  77.          when abbrev("SAVE",translate(wort1),1) then do
  78.             dn = get_dateinm(rest)
  79.             if translate(dn) = ".C" then iterate
  80.             call save_befehl dn
  81.             iterate
  82.          end  /* Do */
  83.          when abbrev("LOAD",translate(wort1),2) then do
  84.             dn = get_dateinm(rest)
  85.             if translate(dn) = ".C" then iterate
  86.             call save_last_befehl
  87.             call load_befehl dn
  88.             call build_anweisung
  89.             call show_befehl
  90.             iterate
  91.          end  /* Do */
  92.          when abbrev("COMPILE",translate(wort1),1) then do
  93.             dn = get_dateinm(rest)
  94.             if translate(dn) = ".C" then iterate
  95.             rc=lineout(dn,,1)
  96.             rc=lineout(dn,"/* Generated by DBMPLUS */");
  97.             do i=1 to befehl.0
  98.                select
  99.                   when i=1 & i<befehl.0 then
  100.                      rc=lineout(dn,"call dbm '" || befehl.i || "',")
  101.                   when i=1 & befehl.0=1 then
  102.                      rc=lineout(dn,"call dbm '" || befehl.i || "'")
  103.                   when i>1 & i<befehl.0 then
  104.                      rc=lineout(dn,"   '" || befehl.i || "',")
  105.                   when i>1 & i=befehl.0 then
  106.                      rc=lineout(dn,"   '" || befehl.i || "'")
  107.                otherwise nop
  108.                end  /* select */
  109.             end /* do */
  110.             rc=lineout(dn)
  111.             iterate
  112.          end  /* Do */
  113.          when abbrev("STORE",translate(wort1),2) then do
  114.             rg = get_register(rest);
  115.             if translate(rg) = ".C" then iterate
  116.             do i = 0 to befehl.0
  117.                register.rg.i = befehl.i
  118.             end /* do */
  119.             iterate
  120.          end  /* Do */
  121.          when abbrev("RECALL",translate(wort1),2) then do
  122.             rg = get_register(rest);
  123.             if translate(rg) = ".C" then iterate
  124.             call save_last_befehl
  125.             do i = 0 to register.rg.0
  126.                befehl.i = register.rg.i
  127.             end /* do */
  128.             call build_anweisung
  129.             call show_befehl
  130.             iterate
  131.          end  /* Do */
  132.          when abbrev("DESCRIBE",translate(wort1),1) then do
  133.             tn = get_tablenm(rest);
  134.             if translate(tn) = ".C" then iterate
  135.             call show_columns tn
  136.             iterate
  137.          end  /* Do */
  138.          when abbrev("TABLES",translate(wort1),1) then do
  139.             cr = get_creator(rest);
  140.             if translate(cr) = ".C" then iterate
  141.             call show_tables cr
  142.             iterate
  143.          end  /* Do */
  144.          when abbrev("INDEXES",translate(wort1),1) then do
  145.             tn = rest
  146.             if tn="" then tn = "%"
  147.             call show_indexes tn
  148.             iterate
  149.          end  /* Do */
  150.          when abbrev("FOREIGN",translate(wort1),1) then do
  151.             tn = rest
  152.             if tn="" then tn = "%"
  153.             call show_foreign_keys tn
  154.             iterate
  155.          end  /* Do */
  156.          when abbrev("UNDO",translate(kommando),1) then do
  157.             do i = 0 to last_befehl.0
  158.                befehl.i = last_befehl.i
  159.             end /* do */
  160.             call build_anweisung
  161.             call show_befehl
  162.             iterate
  163.          end  /* Do */
  164.          when abbrev("HOST",translate(wort1),2) then do
  165.             if rest="" then 'cmd.exe'
  166.             else 'cmd.exe /C' rest
  167.             say
  168.             iterate
  169.          end  /* Do */
  170.          when abbrev("SPOOL",translate(wort1),2) then do
  171.             call control_spool rest
  172.             iterate
  173.          end  /* Do */
  174.          when abbrev("ECHO",translate(wort1),2) then do
  175.             call control_echo rest
  176.             iterate
  177.          end  /* Do */
  178.          when abbrev("LOGON",translate(wort1),3) then do
  179.             call dbm 'connect reset'
  180.             call init_benutzer rest
  181.             call init_datenbank ""
  182.             iterate
  183.          end  /* Do */
  184.          when abbrev("SHOW",translate(kommando),2) then do
  185.             say "User  " translate(benutzer)
  186.             say "Editor" editor
  187.             if spoolopt = "" then say "Spool  OFF ("spoolfile")"
  188.             else say "Spool  ON " spoolfile
  189.             if echoopt = "" then say "Echo   ON"
  190.             else say "Echo   OFF"
  191.             iterate
  192.          end  /* Do */
  193.          otherwise
  194.             if length(wort1) < 3 & wort1 \= "?" then do
  195.                say "     Invalid command"
  196.                iterate
  197.             end  /* Do */
  198.       end  /* select */
  199.    end  /* Do */
  200.    if erste_zeile = 1 then do
  201.       i = 0
  202.       call save_last_befehl
  203.    end  /* Do */
  204.    i = i + 1; befehl.0 = i; befehl.i = kommando
  205.    if right(befehl.i,1) <> ";" then do
  206.       erste_zeile = 0
  207.    end  /* Do */
  208.    else do
  209.       befehl.i = left(befehl.i,length(befehl.i)-1)
  210.       if befehl.i = "" then befehl.0 = i-1
  211.       call build_anweisung
  212.       say
  213.       call dbm echoopt,
  214.                spoolopt,
  215.                anweisung
  216.       erste_zeile = 1
  217.    end  /* Do */
  218. end /* do */
  219. call terminate
  220. exit
  221.  
  222. prompt: procedure
  223.    parse arg promptst
  224.    say promptst
  225.    call move_cursor length(promptst)
  226.    parse pull promptvl
  227.    return promptvl
  228.  
  229. prompt_ok: procedure
  230.    parse arg promptst
  231.    do until promptvl = "Y" | promptvl = "N"
  232.       promptvl = translate(prompt(promptst||"? (y/n): "))
  233.    end /* do */
  234.    if promptvl = "Y" then return 1
  235.    return 0
  236.  
  237. prompt_noecho: procedure
  238.    parse arg promptst
  239.    say promptst
  240.    call move_cursor length(promptst)
  241.    promptvl = ""
  242.    do until c2d(taste) = 13
  243.       taste = SysGetKey('NOECHO')
  244.       if c2d(taste) \= 13 then promptvl = promptvl || taste
  245.    end /* do */
  246.    return promptvl
  247.  
  248. move_cursor: procedure
  249.    parse arg sp
  250.    parse value SysCurPos() with zl sp0
  251.    zl = zl - 1
  252.    cp = SysCurPos(zl,sp)
  253.    return
  254.  
  255. show_befehl: procedure expose befehl.
  256.    do i = 1 to befehl.0
  257.       say format(i,4) befehl.i
  258.    end /* do */
  259.    return
  260.  
  261. save_last_befehl: procedure expose befehl. last_befehl.
  262.    do i = 0 to befehl.0
  263.       last_befehl.i = befehl.i
  264.    end /* do */
  265.    return
  266.  
  267. build_anweisung: procedure expose anweisung befehl.
  268.    anweisung=""
  269.    do i=1 to befehl.0
  270.       anweisung = anweisung befehl.i
  271.    end /* do */
  272.    return
  273.  
  274. check_index: procedure expose befehl.
  275.    parse arg ix
  276.    if translate(ix) = ".C" then return 1
  277.    if datatype(ix,'W') = 0 then return 0
  278.    if ix < 1 | ix > befehl.0 then return 0
  279.    return 1
  280.  
  281. get_zeilennr: procedure expose befehl.
  282.    funktext = arg(1)
  283.    parm = arg(2)
  284.    do forever
  285.       if parm<>"" then do
  286.          ix = parm
  287.          parm = ""
  288.       end  /* Do */
  289.       else do
  290.          ix = prompt(funktext || " line: ")
  291.       end  /* Do */
  292.       ix = strip(ix)
  293.       if check_index(ix) then leave
  294.       else say "      Invalid line specification"
  295.    end /* do */
  296.    return ix
  297.  
  298. get_dateinm: procedure expose previous_dateiname
  299.    dn = arg(1)
  300.    if dn="" then dn = prompt("File: ")
  301.    if dn = "*" then do
  302.       dn = previous_dateiname
  303.       if dn \= "" then do
  304.          if prompt_ok("File "||dn) = 0 then dn = ".C"
  305.       end  /* Do */
  306.    end /* do */
  307.    if dn="" then dn = ".C"
  308.    if translate(dn) = ".C" then return dn
  309.    if dn \= "temp.dbm" then previous_dateiname = dn
  310.    return dn
  311.  
  312. get_register: procedure
  313.    parm = arg(1)
  314.    do forever
  315.       if parm<>"" then do
  316.          rg = parm
  317.          parm = ""
  318.       end  /* Do */
  319.       else do
  320.          rg = prompt("Reg#: ")
  321.       end  /* Do */
  322.       rg = strip(rg)
  323.       if datatype(rg,'W') then leave
  324.       else say "      Invalid register specification"
  325.    end /* do */
  326.    return rg
  327.  
  328. get_tablenm: procedure
  329.    tn = arg(1)
  330.    if tn = "" then tn = prompt("Table: ");
  331.    return tn
  332.  
  333. get_creator: procedure expose benutzer
  334.    cr = arg(1)
  335.    if cr = "" then cr = benutzer
  336.    return cr
  337.  
  338. save_befehl: procedure expose befehl.
  339.    parse arg dn
  340.    rc = SysFileDelete(dn)
  341.    if rc > 2 then do
  342.       say "Zugriff auf die Datei" dn "nicht möglich; RC =" rc
  343.       return
  344.    end  /* Do */
  345.    rc=lineout(dn,,1)
  346.    do i=1 to befehl.0
  347.       rc=lineout(dn,befehl.i)
  348.    end /* do */
  349.    rc = lineout(dn)
  350.    return
  351.  
  352. load_befehl: procedure expose befehl.
  353.    parse arg dn
  354.    zeile=linein(dn,1,0)
  355.    i = 0
  356.    do forever
  357.       zeile=linein(dn)
  358.       if zeile="" then leave
  359.       i = i + 1
  360.       befehl.i = zeile
  361.    end /* do */
  362.    rc = lineout(dn)
  363.    befehl.0 = i
  364.    return
  365.  
  366. show_columns: procedure expose echoopt spoolopt
  367.    parse upper arg tn
  368.    p = pos('.', tn)
  369.    say
  370.    if p=0 then do
  371.       call dbm echoopt,
  372.                spoolopt,
  373.                'select colno, keyseq, name, coltype, length, scale, nulls',
  374.                'from sysibm.syscolumns',
  375.                'where tbname =' "'"tn"'",
  376.                'order by colno'
  377.    end  /* Do */
  378.    else do
  379.       tc = left(tn,p-1)
  380.       tn = substr(tn,p+1)
  381.       call dbm echoopt,
  382.                spoolopt,
  383.                'select colno, name, coltype, length, scale, nulls',
  384.                'from sysibm.syscolumns',
  385.                'where tbcreator =' "'"tc"'",
  386.                'and tbname =' "'"tn"'",
  387.                'order by colno'
  388.    end  /* Do */
  389.    return
  390.  
  391. show_tables: procedure expose echoopt spoolopt
  392.    parse upper arg cr
  393.    say
  394.    call dbm echoopt,
  395.             spoolopt,
  396.             'select name, type, remarks',
  397.             'from sysibm.systables',
  398.             'where creator =' "'"cr"'",
  399.             'order by name'
  400.    return
  401.  
  402. show_indexes: procedure expose echoopt spoolopt benutzer
  403.    parse upper arg tn
  404.    say
  405.    call dbm echoopt,
  406.             spoolopt,
  407.             'select name, tbname, cc, ur, colnames',
  408.             'from usrindexes',
  409.             'where (tbname like' "'"tn"'",
  410.             'and tbcreator =' "'"translate(benutzer)"')",
  411.             'or tbname =' "'"tn"'",
  412.             'order by name'
  413.    return
  414.  
  415. show_foreign_keys: procedure expose echoopt spoolopt benutzer
  416.    parse upper arg tn
  417.    say
  418.    call dbm echoopt,
  419.             spoolopt,
  420.             'select relation, rules, fkcolnames, pkcolnames',
  421.             'from usrrels',
  422.             'where tbname like' "'"tn"'",
  423.             'and creator =' "'"translate(benutzer)"'",
  424.             'order by relation'
  425.    return
  426.  
  427. control_spool: procedure expose spoolfile spoolopt
  428.    parse upper arg parm
  429.    select
  430.       when parm="ON" | parm="" then do
  431.          if spoolfile="" then do
  432.             dn = get_dateinm("")
  433.             if translate(dn)=".C" then return
  434.             spoolfile = dn
  435.          end  /* Do */
  436.          spoolopt = "-r("spoolfile")"
  437.       end  /* Do */
  438.       when parm="OFF" then do
  439.          spoolopt = ""
  440.       end  /* Do */
  441.    otherwise
  442.       dn = get_dateinm(parm)
  443.       if translate(dn)=".C" then return
  444.       spoolfile = dn
  445.       spoolopt = "-r("spoolfile")"
  446.    end  /* select */
  447.    return
  448.  
  449. control_echo: procedure expose echoopt
  450.    parse upper arg parm
  451.    select
  452.       when parm="ON" then echoopt = ""
  453.       when parm="OFF" then echoopt = "-o"
  454.    otherwise
  455.       say "Parameter for ECHO must be 'ON' or 'OFF'"
  456.    end  /* select */
  457.    return
  458.  
  459. help_anzeige: procedure
  460.    say
  461.    say "DBMPLUS-Commands:"
  462.    say
  463.    say "Command  Parameters      Description"
  464.    say "---------------------------------------------------------------------"
  465.    say "Help                         Show this help text"
  466.    say "EXit                         Exit DBMPLUS"
  467.    say "SPool    ON|OFF|<file>       (De)activate spooling"
  468.    say "ECho     ON|OFF              (De)activate echoing"
  469.    say "Run                          Run actual SQL command"
  470.    say "List                         List actual SQL command"
  471.    say "Edit     <none>|<file>       Invoke editor for actual SQL command or file"
  472.    say "Save     <file>              Save actual SQL command in a file"
  473.    say "LOad     <file>              Load acctual SQL command from a file"
  474.    say "Compile  <file>              Compile actual SQL command to Rexx procedure"
  475.    say "STore    <refno>             Store actual SQL command by refno"
  476.    say "REcall   <refno>             Recall actual SQL command by refno"
  477.    say "Describe <tablename>         Show columns of a table"
  478.    say "Tables   <none>|<creator>    Tables for a creator"
  479.    say "Indexes  <none>|<tablemame>  Indexes for all or specific table"
  480.    say "Foreign  <none>|<tablename>  Foreign keys for all or specific table"
  481.    say "Undo                         Recall last SQL command"
  482.    say "HOst     <none>|<command>    Change to DOS or execute DOS command"
  483.    say "LOGon    <user>[/<password>] Logon to another user"
  484.    say "SHow                         Show settings"
  485.    say "         <file> may be represented by '*' denoting the previously used file"
  486.    say "DBMPLUS commands may be abbreviated as indicated by upper case letters"
  487.    say
  488.    say "Any other input statements than those listed above are directed to dbm."
  489.    say "They may consist of several lines, the last of which must be terminated"
  490.    say "by a ';'. To abort a statement, enter '.c'"
  491.    say
  492.    return
  493.  
  494. init: procedure expose benutzer editor spoolfile
  495.    parse arg argumente
  496.    parse var argumente benupassw datenbank
  497.    call dbm 'startdbm'
  498.    call init_benutzer benupassw
  499.    if RESULT=0 then exit 0
  500.    call init_datenbank datenbank
  501.    call init_inifile
  502.    return
  503.  
  504. init_benutzer: procedure expose benutzer
  505.    parse arg benupassw
  506.    if benupassw="" then do
  507.       benupassw = prompt("    User: ")
  508.       if translate(benupassw) = ".C" | benupassw = "" then return 0
  509.    end  /* Do */
  510.    bptpos = pos("/",benupassw)
  511.    if bptpos = 0 then do
  512.       passw = prompt_noecho("Password: ")
  513.       say
  514.       if translate(passw) = ".C" | passw = "" then return 0
  515.       benutzer = benupassw
  516.    end  /* Do */
  517.    else do
  518.       passw = substr(benupassw,bptpos+1)
  519.       benutzer = left(benupassw,bptpos-1)
  520.    end  /* Do */
  521.    '@echo off'
  522.    'logon' benutzer '/P='passw
  523.    'echo on'
  524.    return 1
  525.  
  526. init_datenbank: procedure
  527.    parse arg datenbank
  528.    if datenbank="" then do
  529.       datenbank = prompt("Database: ")
  530.       if translate(datenbank) = ".C" | datenbank = ""  then return
  531.    end  /* Do */
  532.    call dbm 'connect to' datenbank
  533.    return
  534.  
  535. init_inifile: procedure expose editor spoolfile
  536.    call SysFileTree 'c:.\dbmplus.ini', 'dn', 'FO'
  537.    if dn.0 = 0 then return
  538.    zeile=linein(dn.1,1,0)
  539.    do forever
  540.       zeile=linein(dn.1)
  541.       if zeile="" then leave
  542.       interpret zeile
  543.    end /* do */
  544.    rc = lineout(dn.1)
  545.    return
  546.  
  547. terminate: procedure
  548.    call dbm 'connect reset'
  549.    return
  550.