/usr/share/gnudatalanguage/astrolib/dbbuild.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | 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,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35,v36, $
v37,v38,v39,v40,v41,v42,v43,v44,v45,v46,v47,v48,v49,v50, $
NOINDEX = noindex, STATUS=STATUS, SILENT=SILENT
;+
; NAME:
; DBBUILD
; PURPOSE:
; Build a database by appending new values for every item.
; EXPLANATION:
; The database must be opened for update (with DBOPEN) before calling
; DBBUILD.
;
; CALLING SEQUENCE:
; DBBUILD, [ v1, v2, v3, v4......v50, /NOINDEX, /SILENT, STATUS = ]
;
; INPUTS:
; v1,v2....v50 - 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 INPUT KEYWORDS:
; /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
;
; /SILENT - If the keyword SILENT is set and non-zero, then DBBUILD
; will not print a message when the index files are generated
;
; OPTIONAL OUTPUT KEYWORD:
; 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.
;
; The database is closed after DBBUILD exits.
; PROCEDURE CALLS:
; DBCLOSE, DBINDEX, DBXPUT, DBWRT, IS_IEEE_BIG()
; 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
; Added /SILENT keyword, William Thompson, GSFC, October 1995
; Allow up to 30 items, fix problem if first item was multiple value
; W. Landsman GSFC, July 1996
; Faster build of external databases on big endian machines
; W. Landsman GSFC, November 1997
; Use SIZE(/TNAME) for error mesage display W.Landsman July 2001
; Fix message display error introduced July 2001 W. Landsman Oct. 2001
; Make sure error message appears even if !QUIET is set W.L November 2006
; Major rewrite to use SCOPE_VARFETCH, accept 50 input items
; W. Landsman November 2006
; Fix warning if parameters have different # of elements W.L. May 2010
; Fix warning if scalar parameter supplied W.L. June 2010
; Fix for when first parameter is multi-dimensioned W.L. July 2010
; Check data type of first parameter W.L. Jan 2012
;-
COMPILE_OPT IDL2
On_error,2 ;Return to caller
npar = N_params()
if npar LT 1 then begin
print,'Syntax - DBBUILD, v1, [ v2, v3, v4, v5, ... v50,'
print,' /NOINDEX, /SILENT, STATUS = ]'
return
endif
dtype = ['UNDEFINED','BYTE','INT','LONG','FLOAT','DOUBLE', $
'COMPLEX','STRING','STRUCT','DCOMPLEX','POINTER','OBJREF', $
'UINT', 'ULONG', 'LONG64','ULONG64']
; Initialize STATUS as unsuccessful (0). If the routine is successful, this
; will be updated below.
status = 0
nitem = db_info( 'ITEMS' )
if nitem LE npar then message, 'ERROR - ' + strtrim(npar,2) + $ $
' variables supplied but only ' + strtrim(nitem-1,2) + ' items in database'
items = indgen(nitem)
db_item, items, itnum, ivalnum, idltype, sbyte, numvals, nbyte
nitems = ( npar < nitem)
vv = 'v' + strtrim( indgen(nitems+1), 2)
;Create a pointer array to point at each of the supplied variables
tmp = ptrarr(nitems,/allocate_heap)
for i=0,nitems-1 do *tmp[i] = SCOPE_VARFETCH(vv[i+1], LEVEL=0)
ndata = N_elements(v1)/ numvals[1] ;# of elements in last dimension
for i = 1,npar do begin ;Get the dimensions and type of each input vector
sz = size( *tmp[i-1], /STRUCT)
ndatai = sz.N_elements/numvals[i]
if ndatai NE ndata then message, $
'WARNING - Parameter ' + strtrim(i,2) + ' has dimension ' + $
strjoin(strtrim( sz.dimensions[0:sz.n_dimensions-1 > 0],2),' ') ,/con
if sz.type_name NE dtype[idltype[i]] then begin
message, 'Item ' + strtrim( db_item_info('NAME',i),2) + $
' - parameter '+strtrim(i,2) + ' - has an incorrect data type',/CON
message, 'Required data type is ' + dtype[idltype[i]], /INF
message, 'Supplied data type is ' + sz.type_name, /INF
ptr_free,tmp
return
endif
endfor
external = db_info('external',0)
noconvert = external ? is_ieee_big() : 1b
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, Ndata - 1 do begin
i1 = i*nvalues
i2 = i1 + nvalues -1
dbxput,0l,entry,idltype[0],sbyte[0],nbyte[0]
for j = 1,nitems do $
dbxput, (*tmp[j-1])[ i1[j]:i2[j] ], $
entry,idltype[j], sbyte[j], nbyte[j]
dbwrt,entry,noconvert=noconvert ;Write the entry into the database
endfor
ptr_free,tmp
if ~keyword_set( NOINDEX ) then begin
indexed = db_item_info( 'INDEX' ) ;Need to create an indexed file?
if ~array_equal(indexed,0) then begin
if ~keyword_set(silent) then $
message,'Now creating indexed files',/INF
dbindex,items
endif
endif
dbclose
; Mark successful completion, and return.
status = 1
return
end
|