function db_info,request,dbname ;+ ; NAME: ; DB_INFO ; PURPOSE: ; Function to obtain information on opened data base file(s) ; ; CALLING SEQUENCES: ; 1) result = db_info(request) ; 2) result = db_info(request,dbname) ; INPUTS (calling sequence 1): ; ; request - string specifying requested value(s) ; value of request value returned in result ; 'open' Flag set to 1 if data base(s) are opened ; 'number' Number of data base files opened ; 'items' Total number of items (all db's opened) ; 'update' update flag (1 if opened for update) ; 'unit_dbf' Unit number of the .dbf files ; 'unit_dbx' Unit number of the .dbx files ; 'entries' Number of entries in the db's ; 'length' Record lengths for the db's ; 'external' True if the db's are in external format ; ; INPUTS (calling sequence 2): ; ; request - string specifying requested value(s) ; value of request value returned in result ; 'name' Name of the data base ; 'number' Sequential number of the db ; 'items' Number of items for this db ; 'item1' Position of item1 for this db ; in item list for all db's ; 'item2' Position of last item for this db. ; 'pointer' Number of the item which points ; to this db. 0 for first or primary ; db. -1 if link file pointers. ; 'length' Record length for this db. ; 'title' Title of the data base ; 'unit_dbf' Unit number of the .dbf file ; 'unit_dbx' Unit number of the .dbx file ; 'entries' Number of entries in the db ; 'seqnum' Last sequence number used ; 'alloc' Allocated space (# entries) ; 'update' 1 if data base opened for update ; 'external' True if data base in external format ; ; dbname - data base name or number ; OUTPUTS: ; Requested value(s) are returned as the function value. ; ; HISTORY: ; version 1 D. Lindler Oct. 1987 ; changed type from 1 to 7 for IDLV2, J. Isensee, Nov., 1990 ; William Thompson, GSFC/CDS (ARC), 30 May 1994 ; Added EXTERNAL request type. ; Converted to IDL V5.0 W. Landsman September 1997 ;- ;------------------------------------------------------------------------ on_error,2 ;Return to caller ; ; data base common block ; common db_com,QDB,QITEMS,QLINK ; ; QDB(*,i) contains the following for each data base opened ; ; bytes ; 0-18 data base name character*19 ; 19-79 data base title character*61 ; 80-81 number of items (integer*2) ; 82-83 record length of DBF file (integer*2) ; 84-87 number of entries in file (integer*4) ; 88-89 position of first item for this file in QITEMS (I*2) ; 90-91 position of last item for this file (I*2) ; 92-95 Last Sequence number used (item=SEQNUM) (I*4) ; 96 Unit number of .DBF file ; 97 Unit number of .dbx file (0 if none exists) ; 98-99 Index number of item pointing to this file (0 for first db) ; 100-103 Number of entries with space allocated ; 104 Update flag (0 open for read only, 1 open for update) ; 119 True if database is in external (IEEE) format ; ; QITEMS(*,i) contains decription of item number i with following ; byte assignments: ; ; 0-19 item name (character*20) ; 20-21 IDL data type (integet*2) ; 22-23 Number of values for item (1 for scalar) (integer*2) ; 24-25 Starting byte position in original DBF record (integer*2) ; 26-27 Number of bytes per data value (integer*2) ; 28 Index type ; 29-97 Item description ; 98-99 Print field length ; 100 Flag set to one if pointer item ; 101-119 Data base this item points to ; 120-125 Print format ; 126-170 Print headers ; 171-172 Starting byte in record returned by DBRD ; 173-174 Data base number in QDB ; 175-176 Data base number this item points to ; ; ; QLINK(i) contains the entry number in the second data base ; corresponding to entry i in the first data base. ;------------------------------------------------------------------------- ; req=strtrim(strupcase(request)) ;requested value s=size(qdb) if req eq 'OPEN' then begin if s[0] eq 0 then return,0 else return,1 end if s[0] eq 0 then message,'No data base file(s) opened' n=s[2] ;number of data bases ; ; calling sequence 1 result=db_info(request) ; if N_params(0) lt 2 then begin case req of 'NUMBER' : return,n ;number of files opened 'ITEMS' : begin ;total number of items s=size(qitems) return,s[2] end 'LENGTH' : return,long(fix(qdb[82:83,*],0,n)) ;total record length 'UPDATE' : return,qdb[104,0] ;update flag 'UNIT_DBF' : return,qdb[96,*] ;.dbf unit number 'UNIT_DBX' : return,qdb[97,*] ;.dbx unit number 'ENTRIES' : return,long(qdb[84:87,*],0,n) ;number of entries 'EXTERNAL' : return,qdb[119,*] eq 1 ;external format? else : message,'Invalid request for information' endcase endif ; ; second calling sequence: result=db_info(request,dbname) ---------- ; s=size(dbname) ndim=s[0] type=s[ndim+1] if (ndim gt 0) or (type eq 0) then goto,abort ; ; convert name to number ; if type eq 7 then begin db_name=strtrim(strupcase(dbname)) for i=0,n-1 do $ if db_name eq strtrim(string(qdb[0:18,i])) then goto,found goto,abort ;not found found: dbnum=i end else begin ;number supplied dbnum=fix(dbname) if (dbnum lt 0) or (dbnum ge n) then goto,abort end case req of 'NAME' : return,strtrim(string(qdb[0:18,dbnum])) ;db name 'NUMBER' : return,dbnum ;data base number 'ITEMS' : begin ;number of items x=fix(qdb[80:81,dbnum],0,1) return,x[0] end 'ITEM1' : begin ;starting item number x=fix(qdb[88:89,dbnum],0,1) return,x[0] end 'ITEM2' : begin ;last item number x=fix(qdb[90:91,dbnum],0,1) return,x[0] end 'POINTER' : begin ;item number pointer x=fix(qdb[98:99,dbnum],0,1) return,x[0] end 'LENGTH' : begin ;record length x=fix(qdb[82:83,dbnum],0,1) return,long(x[0]) end 'TITLE' : return,strtrim(string(qdb[19:79,dbnum])) ;data base title 'UNIT_DBF' : return,qdb[96,dbnum] ;.dbf unit number 'UNIT_DBX' : return,qdb[97,dbnum] ;.dbx unit number 'ENTRIES' : begin ;number of entries x=long(qdb[84:87,dbnum],0,1) return,x[0] end 'SEQNUM' : begin ;last sequence number x=long(qdb[92:95,dbnum],0,1) return,x[0] end 'ALLOC' : begin ;allocated size x=long(qdb[100:103,dbnum],0,1) return,x[0] end 'UPDATE' : return,qdb[104,dbnum] ;update flag 'EXTERNAL' : begin ;External format? x=qdb[119,*] eq 1 return,x[0] end else: message,'Invalid information request' endcase abort: message,'Invalid data base name or number supplied' end