Fortran example
! (C) Copyright 1996-2012 ECMWF. ! ! This software is licensed under the terms of the Apache Licence Version 2.0 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ! In applying this licence, ECMWF does not waive the privileges and immunities ! granted to it by virtue of its status as an intergovernmental organisation nor ! does it submit to any jurisdiction. ! ! Piotr Kuchta, ECMWF, July 2016 program example_fortran_api use odbql_wrappers implicit none character(len=10) :: version call odbql_libversion(version) write(0,*) "This program is linked to ODB API version: ", version call odbql_fortran_example() write(0,*) "That's all, folks!" contains subroutine odbql_fortran_example implicit none type(odbql) :: db type(odbql_stmt) :: stmt type(odbql_value) :: val integer(kind=C_INT) :: status, number_of_columns, column_no, row_no, int_val character(len=30) :: string_val, column_name character(len=1000) :: unparsed_sql real(kind=C_DOUBLE) :: v, real_val !!!! Write to a file with SQL INSERT call odbql_open("", db) call odbql_prepare_v2(db, "CREATE TYPE BF_T AS (f1 bit1, f2 bit2);& & CREATE TABLE foo AS (x INTEGER,y REAL,v STRING,status BF_T) ON 'fort.odb';",-1, stmt, unparsed_sql) call odbql_prepare_v2(db, "INSERT INTO foo (x,y,v,status) VALUES (?,?,?,?);", -1, stmt, unparsed_sql) ! Populate first row with NULLs do column_no = 1,4 call odbql_bind_null(stmt, column_no) end do call odbql_step(stmt) ! Write 3 rows with some values other than NULL do row_no = 1,3 call odbql_bind_int(stmt, 1, 1 * row_no) v = 0.1 * row_no call odbql_bind_double(stmt, 2, v) call odbql_bind_text(stmt, 3, "hello", 5) call odbql_bind_int(stmt, 4, 1 * row_no) call odbql_step(stmt) end do ! Write internal buffers to disk and close the file call odbql_finalize(stmt) call odbql_close(db) !!!! Read from a file with SQL SELECT ! Associate table with a file name call odbql_open("fort.odb", db) call odbql_prepare_v2(db, "SELECT * FROM 'fort.odb';", -1, stmt, unparsed_sql) number_of_columns = odbql_column_count(stmt) write(0,*) "Number of columns: ", number_of_columns row_no = 1 do call odbql_step(stmt, status) if (status == ODBQL_DONE) exit if (status /= ODBQL_ROW) stop write(6,*) 'Row ', row_no do column_no = 1,number_of_columns call odbql_column_name(stmt, column_no, column_name) val = odbql_column_value(stmt, column_no) if (.not. c_associated(val%this)) then write(6,*) column_no, ' ', column_name, ': MISSING' else select case (odbql_column_type(stmt, column_no)) case (ODBQL_TEXT) call odbql_column_text(stmt, column_no, string_val) case (ODBQL_INTEGER) int_val = odbql_value_int(val) write(6,*) column_no, ' ', column_name, ':integer = ', int_val case (ODBQL_FLOAT) real_val = odbql_value_double(val) write(6,*) column_no, ' ', column_name, ':float = ', real_val end select ! Note, odbql_column_text can be called for columns of any type call odbql_column_text(stmt, column_no, string_val) write(6,*) column_no, ' ', column_name, ': ', string_val end if end do row_no = row_no + 1 end do call odbql_finalize(stmt) call odbql_close(db) end subroutine odbql_fortran_example end program example_fortran_api