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