Querying the database

Querying the database

Queries are made by giving one or more extremes of space, time, level or time range. See query_stations for a list of all available query parameters.

Querying the station values

Example code to query all the stations in a given area:

ierr = idba_setd(handle, "latmin", 30.D0)
ierr = idba_setd(handle, "latmax", 50.D0)
ierr = idba_setd(handle, "lonmin", 10.D0)
ierr = idba_setd(handle, "lonmax", 20.D0)
ierr = idba_query_stations(handle, count)
do while (count.gt.0)
  ierr = idba_next_station(handle)
  ierr = idba_enqi(handle, "ana_id", id)
  ! Pseudoana values can be read as well:
  ierr = idba_enqc(handle, "name", cname)
  ierr = idba_enqd(handle, "B07001", height)
  ! ...query more data and work with it...
  count = count - 1
enddo

This code introduces two new functions:

After idba_next_station(), the output record will also contain all the pseudoana values available for the station. If rep_cod or rep_memo are specified as query parameters, the pseudoana values of that network will be used. Else, idba_next_station() will use all available pseudoana values, choosing the one in the network with the highest priority in case the same pseudoana value is available on more than one network.

Querying the measured values

Example code to query all the values in a given area and time:

ierr = idba_seti(handle, "latmin", 30)
ierr = idba_seti(handle, "latmax", 50)
ierr = idba_seti(handle, "lonmin", 10)
ierr = idba_seti(handle, "lonmax", 20)
ierr = idba_seti(handle, "yearmin", 2004)
ierr = idba_seti(handle, "yearmax", 2004)
ierr = idba_query_data(handle, count)
do while (count.gt.0)
  ierr = idba_next_data(handle, param)
  ! get the value of this variable
  ierr = idba_enqc(handle, param, cvalue)
  ierr = idba_enqd(handle, "lat", dlat)
  ierr = idba_enqd(handle, "lon", dlon)
  ! query more data and work with it
  count = count - 1
enddo

This code introduces two new functions:

Modifiers for queries

DB-All.e allows to set special query behaviours using the "query" parameter. The available options are:

  • best: When measures from different kinds of reports exist in the same physical space, do not return them all, but only return the one of the record type with the highest priority.

Shortcuts to stations and data

DB-All.e offers two shortcuts to represent pseudoana entries and data in the database: the ana_id and the data_id keys, that are set in the output of every idba_next_data().

ana_id represents a pseudoana entry. Every time one needs to specify a set of latitude, longitude, fixed/mobile, one could use the corresponding ana_id value, if known, and get a faster search.

data_id represents a data entry. Every time one needs to identify some data setting latitude, longitude, level layer, time range and so on, one can just provide the value of data_id, and also get a faster search.

Code examples

Query data, then query station data

ierr = idba_begin(dbhandle, handle, "read", "read", "read")
ierr = idba_begin(dbhandle, handleana, "read", "read", "read")

! Prepare a query
ierr = idba_setd (handle, "latmin", 10)
...
ierr = idba_setd (handle, "lonmax", 60)

! Make the query
ierr = idba_query_data (handle, N)

! Iterate the results
do i=1,N
  ierr = idba_next_data (handle, varname)

  ! Read data about the variable we just had
  ierr = idba_enqlevel (handle, ltype, l1, l2)

  ! Read pseudoana data about the variable we just had
  ! Setup a query for the station with 'query_stations'
  ierr = idba_enqi (handle, "ana_id", anaid)
  ierr = idba_seti (handleana, "ana_id", anaid)

  ! Query.  Nstaz should always be 1 because we query a specific station
  ierr = idba_query_stations (handleana, Nstaz)

  ! Fetch the data
  ierr = idba_next_station (handleana)

  ! Read the data about the station
  ! All the data inserted with set_station_context is available here
  ierr = idba_enqi (handleana, "height", height)
enddo