983 lines
28 KiB
Plaintext
983 lines
28 KiB
Plaintext
|
*******************************************************************************
|
||
|
*
|
||
|
* Routines to make/remove release 8.3.3 demo files and tables
|
||
|
*
|
||
|
* Module %M% Version %I% Date %H%
|
||
|
*
|
||
|
* (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved
|
||
|
* This is unpublished proprietary source code of Ardent Software Inc.
|
||
|
* The copyright notice above does not evidence any actual or intended
|
||
|
* publication of such source code.
|
||
|
*
|
||
|
*******************************************************************************
|
||
|
*
|
||
|
* Maintenence log - insert most recent change descriptions at top
|
||
|
*
|
||
|
* Date.... GTAR# WHO Description.........................................
|
||
|
* 10/14/98 23801 SAP Change copyrights.
|
||
|
* 04/28/97 20519 LAG Changed CMDARG to be a fully qualified username
|
||
|
* on Windows NT in routine Setschema.
|
||
|
* 10/15/96 19421 LAG Added quotes around schema and authorization names
|
||
|
* in call to CREATE SCHEMA for Windows NT.
|
||
|
* 03/13/96 17797 AGM Replace 'SH -c' with OS.EXEC
|
||
|
* 01/29/96 17671 LAG Fix problem with readseq and carriage returns
|
||
|
* 01/24/96 17671 LAG Port to Windows NT
|
||
|
* 04/25/95 16054 TFH Handle situation when LONGNAMES is off
|
||
|
* 04/24/95 16054 TFH Prevent "Press any key" situation (set lines = 99)
|
||
|
* 04/24/95 16054 TFH MAKE.DEMO.FILES: Compile all dictionaries at end
|
||
|
* 04/19/95 16054 TFH Change processing of create schema
|
||
|
* 04/18/95 16054 TFH Add 'hush' around open statements to avoid ugly msg
|
||
|
* 04/14/95 16054 TFH Change def'n and location of demo-information files
|
||
|
* 04/11/95 16054 TFH Initial version
|
||
|
*
|
||
|
*******************************************************************************
|
||
|
|
||
|
*
|
||
|
* This program handles the following commands:
|
||
|
*
|
||
|
* SETUP.DEMO.SCHEMA username
|
||
|
* Registers "username" as an SQL user (if not one already) and makes
|
||
|
* the current account into a schema called DEMO_username which is
|
||
|
* owned by username. This command must be run by an SQL user who
|
||
|
* is a DBA.
|
||
|
* MAKE.DEMO.TABLES
|
||
|
* Creates and loads the CIRCUS database tables into the current
|
||
|
* account, making the current user the owner of the tables. The
|
||
|
* account must be an SQL schema and the tables must not already
|
||
|
* exist in this schema. The names of these tables will all have
|
||
|
* a .T suffix.
|
||
|
* REMOVE.DEMO.TABLES
|
||
|
* Drops the CIRCUS database tables from the current schema. The
|
||
|
* user must be a registered SQL user who is the owner of the tables
|
||
|
* or a DBA.
|
||
|
* MAKE.DEMO.FILES
|
||
|
* Creates and loads the CIRCUS database files into the current
|
||
|
* account. The files must not already exist in this account. The
|
||
|
* names of these files will all have a .F suffix. The data contents
|
||
|
* of these files will be the same as the data contents of the
|
||
|
* corresponding .T tables.
|
||
|
* REMOVE.DEMO.FILES
|
||
|
* Deletes the CIRCUS database files from the current account.
|
||
|
*
|
||
|
* This program uses demo-information files, which come as part of uniVerse
|
||
|
* and get loaded into the <uvhome>/sample directory at installation time.
|
||
|
* The demo-information files are:
|
||
|
*
|
||
|
* DEMO.NAMES
|
||
|
* This is a UNIX file containing one line for each file in the CIRCUS
|
||
|
* database. Each line is the name of a CIRCUS file (without the .T or
|
||
|
* .F suffix) in uppercase letters, eg ACTS or ENGAGEMENTS. The names
|
||
|
* must be listed in the correct order for doing the 'loadfile's so that
|
||
|
* referential integrity is not violated during loading of tables.
|
||
|
* DEMO.MKTAB
|
||
|
* This is a UNIX file containing the CREATE TABLE commands (but not the
|
||
|
* ALTER TABLE statements) needed for the MAKE.DEMO.TABLES function.
|
||
|
* This file does not contain any loadfile commands. Table names should
|
||
|
* include the .T suffix, eg CREATE TABLE ACTS.T ...;
|
||
|
* DEMO.ALTAB
|
||
|
* This is a UNIX file containing the ALTER TABLE commands needed for
|
||
|
* the MAKE.DEMO.TABLES function, in the proper order; these ALTER
|
||
|
* TABLEs will be performed after data has been loaded into all of the
|
||
|
* tables. Table names should include the .T suffix.
|
||
|
* DEMO.RMTAB
|
||
|
* This is a UNIX file containing the ALTER TABLE and DROP TABLE
|
||
|
* commands needed for the REMOVE.DEMO.TABLES function. Table names
|
||
|
* should include the .T suffix, eg DROP TABLE ACTS.T;
|
||
|
* demo.fnam.t.u
|
||
|
* There is one demo.fnam.t.u file for each file in the CIRCUS database;
|
||
|
* "fnam" is the first three letters of the CIRCUS filename in lower
|
||
|
* case, eg demo.act.t.u or demo.eng.t.u. Each such file contains the
|
||
|
* data records which will be loaded into the corresponding table when
|
||
|
* MAKE.DEMO.TABLES is run, and (usually) loaded into the corresponding
|
||
|
* file when MAKE.DEMO.FILES is run.
|
||
|
* demo.fnam.f.u
|
||
|
* There may be a few demo.fnam.f.u files. If such a file exists for
|
||
|
* a particular "fnam", then this file is used, instead of
|
||
|
* demo.fnam.t.u, as the source of data records to be loaded into the
|
||
|
* corresponding file when MAKE.DEMO.FILES is run.
|
||
|
* demo.d_fnam.f.u
|
||
|
* There is one demo.d_fnam.f.u file for each file in the CIRCUS
|
||
|
* database. Each such file contains the records which will be loaded
|
||
|
* into the corresponding file's dictionary when MAKE.DEMO.FILES is run.
|
||
|
* These files are not used by MAKE.DEMO.TABLES.
|
||
|
*
|
||
|
*****************************************************************************
|
||
|
*
|
||
|
* For debugging purposes, you can specify an alternate directory for the
|
||
|
* demo-information files (to be used instead of <uvhome>/sample) by typing
|
||
|
* the full path of the alternate directory as an argument after the command.
|
||
|
* [This does not apply to SETUP.DEMO.SCHEMA.]
|
||
|
*
|
||
|
* For example: MAKE.DEMO.TABLES /rd/hatch/SAMPLE
|
||
|
*
|
||
|
*****************************************************************************
|
||
|
|
||
|
$OPTIONS DEFAULT
|
||
|
$INCLUDE UNIVERSE.INCLUDE MACHINE.NAME
|
||
|
$INCLUDE UNIVERSE.INCLUDE FILENAMES.H
|
||
|
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
DEFFUN IS.FULLPATH(FILESPEC) CALLING "*IS.FULLPATH"
|
||
|
DEFFUN IS.EQPATHS(FILESPEC.A, FILESPEC.B) CALLING "*IS.EQPATHS"
|
||
|
**
|
||
|
******************
|
||
|
|
||
|
ERRMSG = " Consult your system administrator."
|
||
|
prompt ""
|
||
|
MAXSLEEP = 5
|
||
|
COMMAND = @SENTENCE
|
||
|
AUTH = @AUTHORIZATION
|
||
|
PATH = @PATH
|
||
|
PATH = trim(PATH)
|
||
|
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
IF OS.TYPE = "UNIX" THEN
|
||
|
if PATH[1] = "/" then PATH = PATH[1,len(PATH)-1]
|
||
|
END ELSE
|
||
|
if PATH[1] = "/" OR PATH[1] = "\" then PATH = PATH[1,len(PATH)-1]
|
||
|
END
|
||
|
**
|
||
|
******************
|
||
|
|
||
|
* Determine what CREATE.FILE syntax to use
|
||
|
FLAVOR = system(1001)
|
||
|
if FLAVOR = 2 or FLAVOR = 8 or FLAVOR = 16 then
|
||
|
CREATE.SYNTAX = "PICK"
|
||
|
end else
|
||
|
CREATE.SYNTAX = ""
|
||
|
end
|
||
|
* Set large value for lines-per-screen, to avoid "Press any key..."
|
||
|
NUMLINES = @CRTHIGH
|
||
|
execute "TERM ,99"
|
||
|
|
||
|
* Find out if this account is a schema; put its name (or empty) in SCH
|
||
|
*
|
||
|
gosub Getschinfo
|
||
|
|
||
|
* Interpret the command line
|
||
|
*
|
||
|
FIRST = 1
|
||
|
Getcmd:
|
||
|
if not(FIRST) then
|
||
|
print "Enter command (or Q to quit): ":
|
||
|
input COMMAND
|
||
|
end
|
||
|
CMDNAME = upcase(field(trim(COMMAND)," ",1))
|
||
|
CMDARG = field(trim(COMMAND)," ",2)
|
||
|
|
||
|
begin case
|
||
|
case CMDNAME[1,1] = "Q"
|
||
|
goto Exit
|
||
|
case CMDNAME = "SETUP.DEMO.SCHEMA"
|
||
|
gosub Verwrite
|
||
|
gosub Setschema
|
||
|
goto Exit
|
||
|
end case
|
||
|
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if IS.FULLPATH(CMDARG) then UV.SAMPLE = CMDARG
|
||
|
|
||
|
IF OS.TYPE = "UNIX" THEN
|
||
|
if CMDARG = "." then UV.SAMPLE = "/rd/hatch/SAMPLE"
|
||
|
END
|
||
|
**
|
||
|
******************
|
||
|
|
||
|
begin case
|
||
|
case CMDNAME = "MAKE.DEMO.TABLES"
|
||
|
TABLE = 1
|
||
|
MAKE = 1
|
||
|
case CMDNAME = "REMOVE.DEMO.TABLES"
|
||
|
TABLE = 1
|
||
|
MAKE = 0
|
||
|
case CMDNAME = "MAKE.DEMO.FILES"
|
||
|
TABLE = 0
|
||
|
MAKE = 1
|
||
|
case CMDNAME = "REMOVE.DEMO.FILES"
|
||
|
TABLE = 0
|
||
|
MAKE = 0
|
||
|
case 1
|
||
|
if FIRST then FIRST = 0 else print "Illegal command"
|
||
|
goto Getcmd
|
||
|
end case
|
||
|
|
||
|
Start:
|
||
|
|
||
|
* Verify that user has write permission on this account and its VOC
|
||
|
*
|
||
|
gosub Verwrite
|
||
|
|
||
|
* If dealing with tables, verify that this account is a schema and
|
||
|
* that the user is an SQL user
|
||
|
*
|
||
|
if TABLE then gosub VerSQL
|
||
|
|
||
|
* Open the DEMO.NAMES file to FVNAMES
|
||
|
*
|
||
|
FPATH = UV.SAMPLE:"/DEMO.NAMES"
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVNAMES else
|
||
|
OPSTAT = status()
|
||
|
hush OLDHUSH
|
||
|
print "Can't open '":FPATH:"'. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
* If making tables, open the DEMO.MKTAB file to FVTCL
|
||
|
* If removing tables, open the DEMO.RMTAB file to FVTCL
|
||
|
*
|
||
|
if TABLE then
|
||
|
if MAKE then
|
||
|
FPATH = UV.SAMPLE:"/DEMO.MKTAB"
|
||
|
end else
|
||
|
FPATH = UV.SAMPLE:"/DEMO.RMTAB"
|
||
|
end
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVTCL else
|
||
|
OPSTAT = status()
|
||
|
hush OLDHUSH
|
||
|
print "Can't open '":FPATH:"'. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
end
|
||
|
|
||
|
* Now loop through DEMO.NAMES
|
||
|
*
|
||
|
NOMORE = 0
|
||
|
PREEXIST = 0
|
||
|
NOTOWNER = 0
|
||
|
FIRST = 1
|
||
|
loop
|
||
|
readseq FILNAM from FVNAMES else NOMORE = 1
|
||
|
until NOMORE do
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if OS.TYPE NE "UNIX" then
|
||
|
if len(FILNAM) and FILNAM[1] = char(13) then
|
||
|
FILNAM = FILNAM[1, len(FILNAM) - 1]
|
||
|
end
|
||
|
end
|
||
|
**
|
||
|
******************
|
||
|
if TABLE then FILNAMX = FILNAM:".T" else FILNAMX = FILNAM:".F"
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
OPEN "", FILNAMX TO FVLOCAL ELSE OPSTAT = status()
|
||
|
hush OLDHUSH
|
||
|
if OPSTAT = 0 then close FVLOCAL
|
||
|
begin case
|
||
|
* If making files/tables, verify they aren't here already.
|
||
|
case (MAKE and OPSTAT <> -1)
|
||
|
if TABLE then print "A table ": else print "A file ":
|
||
|
print "named ":FILNAMX:" already exists."
|
||
|
PREEXIST = 1
|
||
|
* If removing tables, verify user is a DBA or tables' owner
|
||
|
case (not(MAKE) and TABLE and (OPSTAT = 0 or OPSTAT = -12))
|
||
|
if not(ISDBA) then
|
||
|
VALCNT = 0
|
||
|
loop
|
||
|
VALCNT += 1
|
||
|
VALSCH = USERREC<4,VALCNT>
|
||
|
VALTAB = USERREC<5,VALCNT>
|
||
|
until (VALSCH = "" or (VALSCH = SCH and VALTAB = FILNAMX)) do
|
||
|
repeat
|
||
|
if not(VALSCH = SCH and VALTAB = FILNAMX) then
|
||
|
print "You don't own table ":FILNAMX:" and are not a DBA."
|
||
|
NOTOWNER = 1
|
||
|
end
|
||
|
end
|
||
|
* If removing files, delete file now
|
||
|
case (not(MAKE) and not(TABLE) and OPSTAT <> -1)
|
||
|
if FIRST then FIRST = 0 else print ""
|
||
|
execute "DELETE.FILE ":FILNAMX
|
||
|
end case
|
||
|
repeat
|
||
|
close FVNAMES
|
||
|
|
||
|
* If making files/tables and some pre-exist (they have been listed), quit
|
||
|
*
|
||
|
if PREEXIST then
|
||
|
print ""
|
||
|
print "Can't make demo ":
|
||
|
if TABLE then print "tables." else print "files."
|
||
|
print ""
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
* If removing tables and user is not owner or DBA, quit
|
||
|
*
|
||
|
if NOTOWNER then
|
||
|
print ""
|
||
|
print "Can't remove demo tables."
|
||
|
print ""
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
******* I don't know why this code was here, so I'm commenting it out *******
|
||
|
* Update the user's VOC if making new files or tables
|
||
|
*
|
||
|
*if MAKE then EXECUTE "UPDATE.ACCOUNT"
|
||
|
*****************************************************************************
|
||
|
|
||
|
* Now call appropriate subroutines to make/load files, make/load tables,
|
||
|
* or remove tables. (If removing files, this has already been done.)
|
||
|
*
|
||
|
begin case
|
||
|
case (MAKE and TABLE)
|
||
|
SKIPFLAG = 1 ; gosub RunTCL
|
||
|
gosub Loadtables
|
||
|
gosub Runalter
|
||
|
case (MAKE and not(TABLE))
|
||
|
gosub Makefiles
|
||
|
case (not(MAKE) and TABLE)
|
||
|
SKIPFLAG = 0 ; gosub RunTCL
|
||
|
end case
|
||
|
|
||
|
* Print final message
|
||
|
*
|
||
|
print ""
|
||
|
if not(MAKE) then
|
||
|
print "All demo ":
|
||
|
if TABLE then print "tables": else print "files":
|
||
|
print " removed."
|
||
|
print ""
|
||
|
goto Exit
|
||
|
end
|
||
|
print "All demo ":
|
||
|
if TABLE then print "tables": else print "files":
|
||
|
print " initialized."
|
||
|
print ""
|
||
|
goto Exit
|
||
|
|
||
|
* Restore page-length and stop
|
||
|
*
|
||
|
Exit:
|
||
|
execute "TERM ,":NUMLINES
|
||
|
STOP
|
||
|
|
||
|
******************************************************************************
|
||
|
* S U B R O U T I N E S
|
||
|
******************************************************************************
|
||
|
|
||
|
Getschinfo:
|
||
|
* This subroutine determines whether the current account is a schema, and
|
||
|
* if so it returns the schema name. This routine doesn't use @SCHEMA
|
||
|
* because, unfortunately, @SCHEMA doesn't get updated until a user logs
|
||
|
* out of uniVerse and back in again, so @SCHEMA isn't always reliable.
|
||
|
* inputs are PATH is the full pathname of the account
|
||
|
* outputs are SCH = schema name if this is a schema, else empty string
|
||
|
*
|
||
|
* Open UV_SCHEMA
|
||
|
hush on setting OLDHUSH
|
||
|
open "UV_SCHEMA" to FVAR else
|
||
|
hush OLDHUSH
|
||
|
OPSTAT = status()
|
||
|
print "Can't open UV_SCHEMA. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
* Lock UV_SCHEMA
|
||
|
LSLEEP = MAXSLEEP
|
||
|
Getsin1:
|
||
|
if LSLEEP <=0 then
|
||
|
close FVAR
|
||
|
print "Can't lock UV_SCHEMA."
|
||
|
goto Exit
|
||
|
end
|
||
|
filelock FVAR locked
|
||
|
LSLEEP -= 1
|
||
|
sleep 2
|
||
|
goto Getsin1
|
||
|
end
|
||
|
|
||
|
* Search UV_SCHEMA for path of this account
|
||
|
select FVAR
|
||
|
SCH = ""
|
||
|
FOUND = 0
|
||
|
NOMORE = 0
|
||
|
loop
|
||
|
until (FOUND or NOMORE) do
|
||
|
readnext SCH then
|
||
|
read SCHREC from FVAR,SCH then
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if IS.EQPATHS(trim(SCHREC<2>), PATH) then FOUND = 1
|
||
|
**
|
||
|
******************
|
||
|
end else
|
||
|
fileunlock FVAR
|
||
|
close FVAR
|
||
|
print "Can't read UV_SCHEMA."
|
||
|
goto Exit
|
||
|
end
|
||
|
end else NOMORE = 1
|
||
|
repeat
|
||
|
fileunlock FVAR
|
||
|
close FVAR
|
||
|
|
||
|
return ; * return from Getschinfo
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Verwrite:
|
||
|
* This subroutine verifies that user can write into this account
|
||
|
* inputs are PATH is full path of current account's directory
|
||
|
* AUTH is current username
|
||
|
* CMDNAME is the command being executed
|
||
|
* output If user can't write into this account, subroutine STOPs
|
||
|
*
|
||
|
* Verify that user has write permission to this account's directory
|
||
|
*
|
||
|
VERDIR:
|
||
|
TCH = OS.EXEC:' "':TOUCH.CMD:' dUMMy.newSQL"'
|
||
|
RMV = OS.EXEC:' "':RM.CMD:' dUMMy.newSQL"'
|
||
|
TVAR = ""
|
||
|
execute TCH capturing TVAR
|
||
|
if len(TVAR) > 1 then
|
||
|
print "Can't run ":CMDNAME:" because current user (":AUTH:") lacks"
|
||
|
print " OS write permission on this account (":PATH:")"
|
||
|
goto Exit
|
||
|
end
|
||
|
execute RMV capturing TVAR
|
||
|
|
||
|
* Verify that user has write permission to the VOC
|
||
|
VERVOC:
|
||
|
VPATH = PATH:"/VOC"
|
||
|
hush on setting OLDHUSH
|
||
|
openpath VPATH to FVAR else
|
||
|
hush OLDHUSH
|
||
|
print "Can't run ":CMDNAME:": Can't open '":VPATH:"'"
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
LSLEEP = MAXSLEEP
|
||
|
VERVOC1:
|
||
|
if LSLEEP <= 0 then
|
||
|
close FVAR
|
||
|
print "Can't run ":CMDNAME:": '":VPATH:"' is locked"
|
||
|
goto Exit
|
||
|
end
|
||
|
readu TVAR from FVAR,"VOC" locked
|
||
|
LSLEEP -= 1
|
||
|
sleep 2
|
||
|
goto VERVOC1
|
||
|
end else
|
||
|
close FVAR
|
||
|
print "Can't run ":CMDNAME:": Can't read from '":VPATH:"'"
|
||
|
goto Exit
|
||
|
end
|
||
|
write TVAR to FVAR,"VOC" else
|
||
|
close FVAR
|
||
|
print "Can't run ":CMDNAME:": Can't write to '":VPATH:"'"
|
||
|
goto Exit
|
||
|
end
|
||
|
close FVAR
|
||
|
|
||
|
return ; * return from Verwrite
|
||
|
|
||
|
*---------------------------------------------------------------------------
|
||
|
Setschema:
|
||
|
* This subroutine does the SETUP.DEMO.SCHEMA command
|
||
|
* inputs AUTH is current username
|
||
|
* CMDARG is requested username
|
||
|
* CMDNAME is command being executed
|
||
|
*
|
||
|
* First verify that current user is a registered SQL user who is a DBA
|
||
|
*
|
||
|
UNAME = AUTH
|
||
|
gosub Getuserinfo
|
||
|
if not(ISDBA) then
|
||
|
print "You can't run ":CMDNAME:" because you are not an SQL DBA."
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
* Then register requested user as an SQL user (if not already one)
|
||
|
*
|
||
|
if (CMDARG = "" or CMDARG = " ") then
|
||
|
print "You must specify a 'username' argument for ":CMDNAME:"."
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
IF OS.TYPE # "UNIX" THEN
|
||
|
* Prefix the domain name if required.
|
||
|
IF FIELD(CMDARG, "\", 2) = "" THEN
|
||
|
CMDARG = UPCASE(FIELD(AUTH, "\", 1)):"\":CMDARG
|
||
|
END
|
||
|
END
|
||
|
|
||
|
UNAME = CMDARG
|
||
|
gosub Getuserinfo
|
||
|
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
IF OS.TYPE # "UNIX" THEN
|
||
|
* Try an uppercase domain name and lowercase username.
|
||
|
if ISSQLUSER = 0 then
|
||
|
CMDARG = UPCASE(FIELD(CMDARG, "\", 1)):"\":DOWNCASE(FIELD(CMDARG, "\", 2))
|
||
|
end
|
||
|
UNAME = CMDARG
|
||
|
gosub Getuserinfo
|
||
|
END
|
||
|
|
||
|
if ISSQLUSER then
|
||
|
print "Username '":CMDARG:"' is already a registered SQL User."
|
||
|
end else
|
||
|
print "Registering '":CMDARG:"' as an SQL user."
|
||
|
execute "GRANT CONNECT TO ":CMDARG:";" capturing GRANTMSG
|
||
|
* Remove special character at end of message
|
||
|
GRANTMSG = GRANTMSG[1,len(GRANTMSG)-1]
|
||
|
loop
|
||
|
remove line from GRANTMSG setting delim
|
||
|
until delim = 0 and line = ''
|
||
|
print line
|
||
|
repeat
|
||
|
* If username is not in /etc/passwd, quit
|
||
|
findstr " aborted" in GRANTMSG setting FMC then
|
||
|
goto Exit
|
||
|
end
|
||
|
end
|
||
|
|
||
|
* Then make this account into an SQL schema (if it isn't one already)
|
||
|
*
|
||
|
if SCH = "" then
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
IF OS.TYPE = "UNIX" THEN
|
||
|
execute "CREATE SCHEMA DEMO_":CMDARG:" AUTHORIZATION ":CMDARG:";"
|
||
|
END ELSE
|
||
|
CMDARG = FIELD(CMDARG, "\", 2)
|
||
|
execute 'CREATE SCHEMA "DEMO_':CMDARG:'" AUTHORIZATION "':CMDARG:'";'
|
||
|
END
|
||
|
**
|
||
|
******************
|
||
|
end else
|
||
|
print "This account is already an SQL Schema called '":SCH:"'."
|
||
|
end
|
||
|
|
||
|
return ; * return from Setschema
|
||
|
|
||
|
*-----------------------------------------------------------------------------
|
||
|
VerSQL:
|
||
|
* This subroutine is used when making/removing demo tables
|
||
|
* inputs are PATH is full path of current account's directory
|
||
|
* AUTH is current username
|
||
|
* CMDNAME is the command being executed
|
||
|
* SCH current schema name (or empty if not a schema)
|
||
|
* outputs are if user is not an SQL user, subroutine STOPs
|
||
|
* if this is not an SQL schema, subroutine STOPs
|
||
|
* USERREC contains UV_USERS record for current user
|
||
|
* ISDBA = 1 if current user is a DBA, else 0
|
||
|
*
|
||
|
* First verify that user is a registered SQL user (and if so, determine if
|
||
|
* user is a DBA)
|
||
|
*
|
||
|
VERUSER:
|
||
|
UNAME = AUTH
|
||
|
gosub Getuserinfo
|
||
|
if not(ISSQLUSER) then
|
||
|
print "You can't run ":CMDNAME:" because you are not an SQL User."
|
||
|
print "Ask a DBA to run SETUP.DEMO.SCHEMA for you."
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
* Then verify that this account is an SQL schema
|
||
|
*
|
||
|
VERACCT:
|
||
|
if SCH = "" then
|
||
|
print "You can't run ":CMDNAME:" because ":
|
||
|
print "this account is not an SQL Schema."
|
||
|
print "Ask a DBA to run SETUP.DEMO.SCHEMA for you."
|
||
|
goto Exit
|
||
|
end
|
||
|
|
||
|
return ; * return from VerSQL
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Getuserinfo:
|
||
|
* This subroutine determines whether a named user is a registered SQL user.
|
||
|
* If so, it determines if the user is a DBA.
|
||
|
* inputs are UNAME is username to be looked up
|
||
|
* outputs are ISSQLUSER = 1 if user is an SQL user, else 0
|
||
|
* ISDBA = 1 if user is a DBA, else 0
|
||
|
* USERREC contains UV_USERS record for user
|
||
|
*
|
||
|
* Open UV_USERS
|
||
|
hush on setting OLDHUSH
|
||
|
open "UV_USERS" to FVAR else
|
||
|
hush OLDHUSH
|
||
|
OPSTAT = status()
|
||
|
print "Can't open UV_USERS. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
* Read UV_USERS record for this user (if present)
|
||
|
ISSQLUSER = 0
|
||
|
ISDBA = 0
|
||
|
read USERREC from FVAR,UNAME then
|
||
|
ISSQLUSER = 1
|
||
|
if USERREC<1> = "YES" then
|
||
|
ISDBA = 1
|
||
|
end
|
||
|
end
|
||
|
close FVAR
|
||
|
|
||
|
return ; * return from Getuserinfo
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
RunTCL:
|
||
|
* This subroutine executes one set of TCL commands found in a UNIX file
|
||
|
* input FVTCL is the file variable opened to the command file
|
||
|
* SKIPFLAG = 1 means skip a line after each command, else 0
|
||
|
* output FVTCL is closed by this subroutine
|
||
|
*
|
||
|
NOTCL = 0
|
||
|
loop
|
||
|
readseq TCL from FVTCL else NOTCL = 1
|
||
|
until NOTCL do
|
||
|
* Remove trailing spaces or whatever
|
||
|
loop
|
||
|
until TCL[1] = ";" do
|
||
|
TCL = TCL[1,len(TCL)-1]
|
||
|
repeat
|
||
|
execute TCL
|
||
|
if SKIPFLAG then print ""
|
||
|
repeat
|
||
|
close FVTCL
|
||
|
|
||
|
return ; * from RunTCL
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Loadtables:
|
||
|
* This subroutine loads data into all demo tables (xxx.T) after they have
|
||
|
* been created.
|
||
|
* inputs are UV.SAMPLE is the directory containing the DEMO.NAMES
|
||
|
*
|
||
|
* Reopen the DEMO.NAMES file to FVNAMES
|
||
|
*
|
||
|
FPATH = UV.SAMPLE:"/DEMO.NAMES"
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVNAMES else
|
||
|
hush OLDHUSH
|
||
|
OPSTAT = status()
|
||
|
print "Can't open '":FPATH:"'. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
NOMORE = 0
|
||
|
loop
|
||
|
readseq FILNAM from FVNAMES else NOMORE = 1
|
||
|
until NOMORE do
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if OS.TYPE NE "UNIX" then
|
||
|
if len(FILNAM) and FILNAM[1] = char(13) then
|
||
|
FILNAM = FILNAM[1, len(FILNAM) - 1]
|
||
|
end
|
||
|
end
|
||
|
**
|
||
|
******************
|
||
|
FILNAMX = FILNAM:".T"
|
||
|
gosub Loadone
|
||
|
repeat
|
||
|
close FVNAMES
|
||
|
|
||
|
return ; * from Loadtables
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Makefiles:
|
||
|
* This subroutine creates all demo files (xxx.F) and their dictionaries
|
||
|
* It also loads data into all files and their dictionaries and compiles
|
||
|
* the dictionaries.
|
||
|
* inputs are UV.SAMPLE is the directory containing the DEMO.NAMES
|
||
|
*
|
||
|
* Reopen the DEMO.NAMES file to FVNAMES
|
||
|
*
|
||
|
FPATH = UV.SAMPLE:"/DEMO.NAMES"
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVNAMES else
|
||
|
hush OLDHUSH
|
||
|
OPSTAT = status()
|
||
|
print "Can't open '":FPATH:"'. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
* Create files and dictionaries, and load data into them
|
||
|
*
|
||
|
NOMORE = 0
|
||
|
loop
|
||
|
readseq FILNAM from FVNAMES else NOMORE = 1
|
||
|
until NOMORE do
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if OS.TYPE NE "UNIX" then
|
||
|
if len(FILNAM) and FILNAM[1] = char(13) then
|
||
|
FILNAM = FILNAM[1, len(FILNAM) - 1]
|
||
|
end
|
||
|
end
|
||
|
**
|
||
|
******************
|
||
|
FILNAMX = FILNAM:".F"
|
||
|
gosub Makeone
|
||
|
gosub Loadone
|
||
|
print ""
|
||
|
repeat
|
||
|
close FVNAMES
|
||
|
|
||
|
* Compile all dictionaries (this must be done last since there may be
|
||
|
* I-descriptors containing TRANS references to other files)
|
||
|
*
|
||
|
FPATH = UV.SAMPLE:"/DEMO.NAMES"
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVNAMES else
|
||
|
hush OLDHUSH
|
||
|
OPSTAT = status()
|
||
|
print "Can't open '":FPATH:"'. ":
|
||
|
gosub POPERR
|
||
|
print ERRMSG
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
|
||
|
NOMORE = 0
|
||
|
loop
|
||
|
readseq FILNAM from FVNAMES else NOMORE = 1
|
||
|
until NOMORE do
|
||
|
******************
|
||
|
** Windows NT port
|
||
|
**
|
||
|
if OS.TYPE NE "UNIX" then
|
||
|
if len(FILNAM) and FILNAM[1] = char(13) then
|
||
|
FILNAM = FILNAM[1, len(FILNAM) - 1]
|
||
|
end
|
||
|
end
|
||
|
**
|
||
|
******************
|
||
|
execute "CD ":FILNAM:".F"
|
||
|
repeat
|
||
|
close FVNAMES
|
||
|
|
||
|
return ; * from Makefiles
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Makeone:
|
||
|
* This subroutine creates a file and its dictionary, then clears the dict.
|
||
|
* inputs FILNAMX is name of file to create (ends with .F)
|
||
|
*
|
||
|
IF CREATE.SYNTAX = "PICK" THEN
|
||
|
EXECUTE "CREATE.FILE DATA ":FILNAMX:" 2,2,2 Demo File"
|
||
|
EXECUTE "CREATE.FILE DICT ":FILNAMX:" 1,2,3 Demo File" capturing DICTOUT
|
||
|
|
||
|
END ELSE
|
||
|
EXECUTE "CREATE.FILE DATA ":FILNAMX:" 2 2 2 Demo File"
|
||
|
EXECUTE "CREATE.FILE DICT ":FILNAMX:" 3 1 2 Demo File" capturing DICTOUT
|
||
|
END
|
||
|
loop
|
||
|
DICTPR = remove(DICTOUT,MARK)
|
||
|
until MARK = 0 do
|
||
|
findstr " default" in DICTPR setting FMC else print DICTPR
|
||
|
repeat
|
||
|
|
||
|
hush on setting OLDHUSH
|
||
|
EXECUTE "CLEAR.FILE DICT ":FILNAMX
|
||
|
hush OLDHUSH
|
||
|
|
||
|
return ; * from Makeone
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Loadone:
|
||
|
* This subroutine loads data into a table, or into a file and its dictionary.
|
||
|
* inputs are FILNAMX is the table/file name including the .T or .F suffix
|
||
|
* TABLE is 1 if making tables, 0 if making files
|
||
|
* UV.SAMPLE is directory containing necessary .u files
|
||
|
*
|
||
|
ABRV = downcase(FILNAMX[1,3])
|
||
|
TABPATH = UV.SAMPLE:"/demo.":ABRV:".t.u"
|
||
|
|
||
|
TCL.CMD = OS.EXEC:" '":UV.BIN:"/loadfile"
|
||
|
|
||
|
if TABLE then
|
||
|
|
||
|
TCL = TCL.CMD:" ":TABPATH:" ":FILNAMX:"'"
|
||
|
execute TCL
|
||
|
|
||
|
end else
|
||
|
|
||
|
FILPATH = UV.SAMPLE:"/demo.":ABRV:".f.u"
|
||
|
|
||
|
FPATH = FILPATH ; gosub Checkone
|
||
|
if NOT(FEXIST) then
|
||
|
FILEPATH = TABPATH
|
||
|
end
|
||
|
|
||
|
gosub Findnames ; * find UNIX filenames for data and dictionary
|
||
|
|
||
|
TCL = TCL.CMD:" ":FILEPATH:" ":DATANAM:"'"
|
||
|
execute TCL
|
||
|
|
||
|
DICTPATH = UV.SAMPLE:"/demo.d_":ABRV:".f.u"
|
||
|
TCL = TCL.CMD:" ":DICTPATH:" ":DICTNAM:"'"
|
||
|
execute TCL
|
||
|
|
||
|
end
|
||
|
**
|
||
|
******************
|
||
|
|
||
|
return ; * from Loadone
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Runalter:
|
||
|
* This subroutine does any ALTER TABLE commands that may be necessary for the
|
||
|
* MAKE.DEMO.TABLES function (these commands are in the DEMO.ALTAB file).
|
||
|
* The ALTER TABLEs are done after data has been loaded into the tables.
|
||
|
*
|
||
|
* Open the DEMO.ALTAB file to FVTCL
|
||
|
*
|
||
|
FPATH = UV.SAMPLE:"/DEMO.ALTAB"
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVTCL then
|
||
|
hush OLDHUSH
|
||
|
SKIPFLAG = 0 ; gosub RunTCL
|
||
|
end else
|
||
|
hush OLDHUSH
|
||
|
end
|
||
|
|
||
|
return ; * from Runalter
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Checkone:
|
||
|
* This subroutine checks if a UNIX file exists
|
||
|
* input FPATH is full pathname of file to be checked
|
||
|
* outputs FEXIST = 1 if the file exists (can be opened), else 0
|
||
|
* OPSTAT contains error status if file can't be opened, else 0
|
||
|
*
|
||
|
FEXIST = 0
|
||
|
OPSTAT = 0
|
||
|
hush on setting OLDHUSH
|
||
|
openseq FPATH to FVEX then
|
||
|
hush OLDHUSH
|
||
|
FEXIST = 1
|
||
|
close FVEX
|
||
|
end else
|
||
|
OPSTAT = status()
|
||
|
hush OLDHUSH
|
||
|
end
|
||
|
|
||
|
return ; * from Checkone
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
Findnames:
|
||
|
* This subroutine finds the UNIX filenames for the data and dictionary parts
|
||
|
* of a uniVerse file, by reading its VOC entry. It is needed in case the
|
||
|
* account has LONGNAMES turned off.
|
||
|
* inputs FILNAMX is the uniVerse filename
|
||
|
* CMDNAME is command being executed
|
||
|
* outputs DATANAM is the UNIX filename of the file's data
|
||
|
* DICTNAM is the UNIX filename of the file's dictionary
|
||
|
*
|
||
|
VPATH = PATH:"/VOC"
|
||
|
hush on setting OLDHUSH
|
||
|
openpath VPATH to FVAR else
|
||
|
hush OLDHUSH
|
||
|
print "Aborting ":CMDNAME:": Can't open '":VPATH:"'"
|
||
|
goto Exit
|
||
|
end
|
||
|
hush OLDHUSH
|
||
|
LSLEEP = MAXSLEEP
|
||
|
Fnam1:
|
||
|
if LSLEEP <= 0 then
|
||
|
close FVAR
|
||
|
print "Aborting ":CMDNAME:": '":VPATH:"' is locked"
|
||
|
goto Exit
|
||
|
end
|
||
|
readu TVAR from FVAR,FILNAMX locked
|
||
|
LSLEEP -= 1
|
||
|
sleep 2
|
||
|
goto Fnam1
|
||
|
end else
|
||
|
close FVAR
|
||
|
print "Aborting ":CMDNAME:": Can't read from '":VPATH:"'"
|
||
|
goto Exit
|
||
|
end
|
||
|
DATANAM = TVAR<2>
|
||
|
DICTNAM = TVAR<3>
|
||
|
close FVAR
|
||
|
|
||
|
return ; * from Findnames
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
POPERR:
|
||
|
* Print error message when unable to open file (partial msg is already printed)
|
||
|
* input = OPSTAT, which contains status()
|
||
|
*
|
||
|
begin case
|
||
|
case OPSTAT = -1
|
||
|
print "Filename not in VOC"
|
||
|
case OPSTAT = -2
|
||
|
print "Non-existent or inaccessible file"
|
||
|
case OPSTAT = -3
|
||
|
print "No OS permission"
|
||
|
case OPSTAT = -4
|
||
|
print "No OS permission or invalid file"
|
||
|
case OPSTAT = -5
|
||
|
print "OS read error"
|
||
|
case OPSTAT = -6
|
||
|
print "Can't lock file header"
|
||
|
case OPSTAT = -7
|
||
|
print "Bad file rev or byte-swap"
|
||
|
case OPSTAT = -8
|
||
|
print "Invalid part-file info"
|
||
|
case OPSTAT = -9
|
||
|
print "Invalid type 30 info"
|
||
|
case OPSTAT = -10
|
||
|
print "File marked inconsistent"
|
||
|
case OPSTAT = -11
|
||
|
print "SQL view"
|
||
|
case OPSTAT = -12
|
||
|
print "No SQL permission"
|
||
|
case OPSTAT = -13
|
||
|
print "Problem with index"
|
||
|
case 1
|
||
|
print "Status = ":OPSTAT
|
||
|
end case
|
||
|
return ; *from POPERR
|
||
|
|
||
|
*----------------------------------------------------------------------------
|
||
|
END
|