Viewing contents of file '../idllib/uit/pro/dbbuild.pro'
pro dbbuild,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18, $
v19,v20,v21,v22,v23,v24,v25,NOINDEX = noindex, STATUS=STATUS
;+
; NAME:
; DBBUILD
; PURPOSE:
; Build a database by appending new values for every item. The database
; must be opened for update (with DBOPEN) before calling DBBUILD.
;
; CALLING SEQUENCE:
; dbbuild, [ v1, v2, v3, v4......v25, NOINDEX = ]
;
; INPUTS:
; v1,v2....v25 - vectors containing values for all items in the database.
; V1 contains values for the first item, V2 for the second, etc.
; The number of vectors supplied must equal the number of items
; (excluding entry number) in the database. The number of elements
; in each vector should be the same. A multiple valued item
; should be dimensioned NVALUE by NENTRY, where NVALUE is the number
; of values, and NENTRY is the number of entries.
;
; OPTIONAL KEYWORD:
; NOINDEX - If this keyword is supplied and non-zero then DBBUILD will
; *not* create an indexed file. Useful to save time if
; DBBUILD is to be called several times and the indexed file need
; only be created on the last call
;
; STATUS - Returns a status code denoting whether the operation was
; successful (1) or unsuccessful (0). Useful when DBBUILD is
; called from within other applications.
;
; EXAMPLE:
; Suppose a database named STARS contains the four items NAME,RA,DEC, and
; FLUX. Assume that one already has the four vectors containing the
; values, and that the database definition (.DBD) file already exists.
;
; IDL> !PRIV=2 ;Writing to database requires !PRIV=2
; IDL> dbcreate,'stars',1,1 ;Create database (.DBF) & index (.DBX) file
; IDL> dbopen,'stars',1 ;Open database for update
; IDL> dbbuild,name,ra,dec,flux ;Write 4 vectors into the database
;
; NOTES:
; Do not call DBCREATE before DBBUILD if you want to append entries to
; an existing database
;
; DBBUILD checks that each value vector matches the idl type given in the
; database definition (.DBD) file, and that character strings are the
; proper length.
; REVISION HISTORY:
; Written W. Landsman March, 1989
; Added /NOINDEX keyword W. Landsman November, 1992
; User no longer need supply all items W. Landsman December, 1992
; Added STATUS keyword, William Thompson, GSFC, 1 April 1994
;-
On_error,2 ;Return to caller
npar = N_params()
dtype = ['UNDEFINED','BYTE','INTEGER*2','INTEGER*4','REAL*4','REAL*8', $
'COMPLEX','STRING','STRUCTURE' ]
; Initialize STATUS as unsuccessful (0). If the routine is successful, this
; will be updated below.
status = 0
if npar LT 1 then begin
print,'Syntax - dbbuild, v1, [ v2, v3, v4, v5, v6, v7... v25, NOINDEX = ]'
return
endif
nitem = db_info( 'ITEMS' )
if N_elements( nitem ) EQ 0 then return
items = indgen(nitem)
db_item, items, itnum, ivalnum, idltype, sbyte, numvals, nbyte
for i = 1,npar do begin ;Get the dimensions and type of each input vector
ii = strtrim(i,2)
test = execute('s=size(v' + ii +')' )
if s(s(0) + 1) NE idltype(i) then begin
message, 'Item ' + strtrim( db_item_info('NAME',i),2) + $
' - parameter '+strtrim(i,2) + ' - has an incorrect data type',/INF
message, 'Required data type is ' + dtype(idltype(i)), /INF
message, 'Supplied data type is ' + dtype( s(s(0) + 1) ), /INF
return
endif
endfor
nitems = ( (npar<nitem) GE indgen(26))
entry = make_array( DIMEN = db_info('LENGTH'),/BYTE ) ;Empty entry array
nvalues = long( db_item_info( 'NVALUES' ) ) ;# of values per item
nbyte = nbyte*nvalues ;Number of bytes per item
for i = 0l,N_elements(v1)-1 do begin
i1 = i*nvalues
i2 = i1 + nvalues -1
dbxput,0l,entry,idltype(0),sbyte(0),nbyte(0)
dbxput,v1(i1(1):i2(1)),entry,idltype(1),sbyte(1),nbyte(1)
if nitems(2) then begin
dbxput,v2(i1(2):i2(2)),entry,idltype(2),sbyte(2),nbyte(2)
if nitems(3) then begin
dbxput,v3(i1(3):i2(3)),entry,idltype(3),sbyte(3),nbyte(3)
if nitems(4) then begin
dbxput,v4(i1(4):i2(4)),entry,idltype(4),sbyte(4),nbyte(4)
if nitems(5) then begin
dbxput,v5(i1(5):i2(5)),entry,idltype(5),sbyte(5),nbyte(5)
if nitems(6) then begin
dbxput,v6(i1(6):i2(6)),entry,idltype(6),sbyte(6),nbyte(6)
if nitems(7) then begin
dbxput,v7(i1(7):i2(7)),entry,idltype(7),sbyte(7),nbyte(7)
if nitems(8) then begin
dbxput,v8(i1(8):i2(8)),entry,idltype(8),sbyte(8),nbyte(8)
if nitems(9) then begin
dbxput,v9(i1(9):i2(9)),entry,idltype(9),sbyte(9),nbyte(9)
if nitems(10) then begin
dbxput,v10(i1(10):i2(10)),entry,idltype(10),sbyte(10),nbyte(10)
if nitems(11) then begin
dbxput,v11(i1(11):i2(11)),entry,idltype(11),sbyte(11),nbyte(11)
if nitems(12) then begin
dbxput,v12(i1(12):i2(12)),entry,idltype(12),sbyte(12),nbyte(12)
if nitems(13) then begin
dbxput,v13(i1(13):i2(13)),entry,idltype(13),sbyte(13),nbyte(13)
if nitems(14) then begin
dbxput,v14(i1(14):i2(14)),entry,idltype(14),sbyte(14),nbyte(14)
if nitems(15) then begin
dbxput,v15(i1(15):i2(15)),entry,idltype(15),sbyte(15),nbyte(15)
if nitems(16) then begin
dbxput,v16(i1(16):i2(16)),entry,idltype(16),sbyte(16),nbyte(16)
if nitems(17) then begin
dbxput,v17(i1(17):i2(17)),entry,idltype(17),sbyte(17),nbyte(17)
if nitems(18) then begin
dbxput,v18(i1(18):i2(18)),entry,idltype(18),sbyte(18),nbyte(18)
if nitems(19) then begin
dbxput,v19(i1(19):i2(19)),entry,idltype(19),sbyte(19), nbyte(19)
if nitems(20) then begin
dbxput, v20( i1(20):i2(20) ),entry,idltype(20),sbyte(20),nbyte(20)
if nitems(21) then begin
dbxput,v21(i1(21):i2(21)),entry,idltype(21),sbyte(21),nbyte(21)
if nitems(22) then begin
dbxput,v22(i1(22):i2(22)),entry,idltype(22),sbyte(22),nbyte(22)
if nitems(23) then begin
dbxput,v23(i1(23):i2(23)),entry,idltype(23),sbyte(23),nbyte(23)
if nitems(24) then begin
dbxput,v24(i1(24):i2(24)),entry,idltype(24),sbyte(24),nbyte(24)
if nitems(25) then $
dbxput,v25(i1(25):i2(25)),entry,idltype(25),sbyte(25),nbyte(25)
endif & endif & endif & endif & endif & endif & endif & endif & endif
endif & endif & endif & endif & endif & endif & endif & endif & endif
endif & endif & endif & endif & endif
dbwrt,entry ;Write the entry into the database
endfor
if not keyword_set( NOINDEX ) then begin
indexed = db_item_info( 'INDEX' ) ;Need to create an indexed file?
if total(indexed) GE 1 then begin
message,'Now creating indexed files',/INF
dbindex,items
endif
endif
dbclose
; Mark successful completion, and return.
status = 1
return
end