11 use,
intrinsic :: iso_c_binding
15 integer,
parameter :: max_varlen = 128
16 integer(kind=4),
parameter :: ncolumns = 6
23 character(8),
dimension(ncolumns),
parameter :: column_names = (/
'ifoo ',
'nbar ',
'status ',
'wigos ', &
26 integer(c_int),
dimension(ncolumns),
parameter:: column_offsets = (/1, 2, 3, 4, 7, 8/)
27 integer(c_int),
dimension(ncolumns),
parameter:: column_sizes = (/1, 1, 1, 3, 1, 1/)
28 integer,
parameter :: row_size_doubles = 8
31 function strlen(s)
result(l) bind(c, name='strlen')
32 use,
intrinsic :: iso_c_binding
33 character(c_char) :: s
38 write(0,*)
"Calling odb_start..."
51 type(c_ptr) :: odb_handle, odb_it
52 integer(kind=C_INT) :: cerr
53 character(kind=C_CHAR, len=max_varlen) :: config = c_null_char
54 character(kind=C_CHAR, len=max_varlen) :: outputfile=
"example_fortran_api_append.odb"//achar(0)
56 integer(kind=C_INT) :: itype, c_ncolumns
57 real(kind=c_double),
dimension(:),
allocatable:: one_row
58 integer(kind=c_int) :: offsets(ncolumns)
59 integer(kind=c_int) :: row_length_doubles
60 character(len=100) :: expver=
"fihn"//achar(0)
61 character(len=100) :: wigos=
"this-is-a-long-string"//achar(0)
63 write(0,*)
'example_fortran_api_append'
72 "active:passive:blacklisted:"//achar(0), &
89 if (row_length_doubles /= 9) stop 1
90 if (any(offsets /= (/1, 2, 3, 4, 8, 9/))) stop 1
92 allocate(one_row(row_length_doubles))
94 one_row(offsets(1)) = i
95 one_row(offsets(2)) = i
96 one_row(offsets(3)) = 5
97 one_row(offsets(4):offsets(4)+3) = transfer(wigos, one_row(offsets(4):offsets(4)+3))
98 one_row(offsets(5)) = transfer(expver, one_row(5))
99 one_row(offsets(6)) = 5
101 if (cerr /= 0) stop 1
113 "active:passive:blacklisted:"//achar(0), &
127 if (cerr /= 0) stop 1
130 if (row_length_doubles /= 9) stop 1
131 if (any(offsets /= (/1, 2, 3, 4, 8, 9/))) stop 1
133 allocate(one_row(row_length_doubles))
135 one_row(offsets(1)) = i
136 one_row(offsets(2)) = i
137 one_row(offsets(3)) = 5
138 one_row(offsets(4):offsets(4)+3) = transfer(wigos, one_row(offsets(4):offsets(4)+3))
139 one_row(offsets(5)) = transfer(expver, one_row(5))
140 one_row(offsets(6)) = 5
142 if (cerr /= 0) stop 1
148 if (cerr /= 0) stop 1
154 type(c_ptr) :: odb_handle, odb_it
155 integer(kind=C_INT) :: cerr
156 character(kind=C_CHAR, len=max_varlen) :: config = c_null_char
157 character(kind=C_CHAR, len=max_varlen) :: outputfile=
"test.odb"//achar(0)
159 integer(kind=C_INT) :: itype, c_ncolumns
160 real(kind=c_double),
dimension(:),
allocatable:: one_row
161 integer(kind=c_int) :: offsets(ncolumns)
162 integer(kind=c_int) :: row_length_doubles
163 character(len=100) :: expver=
"fihn"//achar(0)
164 character(len=100) :: wigos=
"this-is-a-long-string"//achar(0)
166 write(0,*)
'example_fortran_api_setup'
167 c_ncolumns = ncolumns
175 "active:passive:blacklisted:"//achar(0), &
189 if (cerr /= 0) stop 1
192 if (row_length_doubles /= 9) stop 1
193 if (any(offsets /= (/1, 2, 3, 4, 8, 9/))) stop 1
195 allocate(one_row(row_length_doubles))
197 one_row(offsets(1)) = i
198 one_row(offsets(2)) = i
199 one_row(offsets(3)) = 5
200 one_row(offsets(4):offsets(4)+3) = transfer(wigos, one_row(offsets(4):offsets(4)+3))
201 one_row(offsets(5)) = transfer(expver, one_row(5))
202 one_row(offsets(6)) = 5
204 if (cerr /= 0) stop 1
210 if (cerr /= 0) stop 1
219 type(c_ptr) :: odb_handle, odb_it
220 integer(kind=C_INT) :: cerr
221 character(kind=C_CHAR, len=max_varlen) :: config = c_null_char
222 character(kind=C_CHAR, len=max_varlen) :: inputfile =
"test.odb"//achar(0)
223 type(c_ptr) :: ptr_colname
224 type(c_ptr) :: ptr_bitfield_names
225 type(c_ptr) :: ptr_bitfield_sizes
226 character(kind=C_CHAR,len=1),
dimension(:),
pointer :: f_ptr_colname
227 character(kind=C_CHAR,len=1),
dimension(:),
pointer :: f_ptr_bitfield_names
228 character(kind=C_CHAR,len=1),
dimension(:),
pointer :: f_ptr_bitfield_sizes
229 character(len=max_varlen) :: colname
230 character(len=max_varlen) :: bitfield_names
231 character(len=max_varlen) :: bitfield_sizes
233 integer(kind=C_INT) :: itype, newdataset, c_ncolumns=2, size_name
234 integer(kind=C_INT) :: bitfield_names_size, bitfield_sizes_size
235 real(kind=c_double),
dimension(:),
allocatable:: one_row
236 real(kind=c_double) :: val
237 integer(c_int) :: isize, ioffset
238 character(len=24) :: tmp_str1
239 character(len=8) :: tmp_str2
242 write(0,*)
'example_fortran_api1'
245 if (cerr /= 0) stop 1
251 if (c_ncolumns /= ncolumns) stop 3
256 if (cerr /= 0) stop 4
257 if (isize /= row_size_doubles) stop 5
267 if (cerr /= 0) stop 6
271 call c_f_pointer(cptr=ptr_colname, fptr=f_ptr_colname, shape=(/size_name/));
273 colname(i:i) = f_ptr_colname(i)
275 write(0,
'(a,i1,3a,i1,a,i1,a)')
'column name ', col,
' : ', colname(1:size_name), &
276 ' [', ioffset,
', ', isize,
']'
280 if (colname(1:size_name) /= trim(column_names(col))) stop 7
281 if (itype /= column_types(col)) stop 9
282 if (ioffset /= column_offsets(col)) stop 11
283 if (isize /= column_sizes(col)) stop 12
291 if (cerr /=0) stop 13
292 write(0,*)
'odb_read_get_missing_value: missing value of column 0 => ', val
293 if (val /= 1.0) stop 14
297 cerr =
odb_read_get_bitfield(odb_it, 2, ptr_bitfield_names, ptr_bitfield_sizes, bitfield_names_size, bitfield_sizes_size)
298 write(0,*)
'odb_read_get_bitfield column 2 => ', cerr
299 if (cerr /=0) stop 15
300 write(0,*)
'column 2 bitfield_names_size: ', bitfield_names_size
301 call c_f_pointer(cptr=ptr_bitfield_names, fptr=f_ptr_bitfield_names, shape=(/bitfield_names_size/));
302 do i=1, bitfield_names_size
303 bitfield_names(i:i) = f_ptr_bitfield_names(i)
305 write(0,*)
'column 2 bitfield_names: ', bitfield_names(1:bitfield_names_size)
306 if (bitfield_names(1:bitfield_names_size) /=
'active:passive:blacklisted:') stop 16
308 write(0,*)
'column 2 bitfield_sizes_size: ', bitfield_sizes_size
309 call c_f_pointer(cptr=ptr_bitfield_sizes, fptr=f_ptr_bitfield_sizes, shape=(/bitfield_sizes_size/));
310 do i=1, bitfield_sizes_size
311 bitfield_sizes(i:i) = f_ptr_bitfield_sizes(i)
313 write(0,*)
'column 2 bitfield_sizes: ', bitfield_sizes(1:bitfield_sizes_size)
314 if (bitfield_sizes(1:bitfield_sizes_size) /=
'1:1:4:') stop 17
318 allocate(one_row(row_size_doubles))
326 tmp_str1(1:24) = transfer(one_row(column_offsets(4):column_offsets(5)-1), tmp_str1(1:24))
327 tmp_str2(1:8) = transfer(one_row(column_offsets(5)), tmp_str2(1:8))
329 write(0,*) i,
":", one_row(column_offsets(1)), &
330 one_row(column_offsets(2)), &
331 one_row(column_offsets(3)), &
332 tmp_str1(1:24),
" ", &
334 one_row(column_offsets(6))
336 if (one_row(column_offsets(1)) /= i) stop 18
337 if (one_row(column_offsets(2)) /= i) stop 19
338 if (one_row(column_offsets(3)) /= 5) stop 20
339 if (trim(tmp_str1(1:strlen(tmp_str1))) /=
'this-is-a-long-string') stop 21
340 if (trim(tmp_str2(1:strlen(tmp_str2))) /=
'fihn') stop 22
341 if (one_row(column_offsets(6)) /= 5) stop 23
359 type(c_ptr) :: odb_handle, odb_it
360 integer(kind=C_INT) :: cerr
361 character(kind=C_CHAR, len=64) :: config = c_null_char
362 type(c_ptr) :: ptr_colname
363 type(c_ptr) :: ptr_bitfield_names
364 type(c_ptr) :: ptr_bitfield_sizes
365 character(kind=C_CHAR),
dimension(:),
pointer :: f_ptr_colname
366 character(kind=C_CHAR,len=1),
dimension(:),
pointer :: f_ptr_bitfield_names
367 character(kind=C_CHAR,len=1),
dimension(:),
pointer :: f_ptr_bitfield_sizes
368 character(len=max_varlen) :: colname
369 character(len=max_varlen) :: bitfield_names
370 character(len=max_varlen) :: bitfield_sizes
372 character(kind=C_CHAR, len=128) :: sql=
'select * from "test.odb"'//achar(0)
373 integer(kind=C_INT) :: itype, newdataset, c_ncolumns=3, size_name
374 integer(kind=C_INT) :: bitfield_names_size, bitfield_sizes_size, ioffset, isize
375 real(kind=c_double),
dimension(:),
allocatable:: one_row
376 character(len=64) :: tmp_str1, tmp_str2
379 write(0,*)
'example_fortran_api2'
383 if (cerr /= 0) stop 25
388 if (cerr /=0) stop 26
389 if (c_ncolumns /= ncolumns) stop 27
394 if (cerr /= 0) stop 28
395 if (isize /= row_size_doubles) stop 29
405 if (cerr /= 0) stop 30
409 call c_f_pointer(cptr=ptr_colname, fptr=f_ptr_colname, shape=(/size_name/));
411 colname(i:i) = f_ptr_colname(i)
413 write(0,
'(a,i1,3a,i1,a,i1,a)')
'column name ', col,
' : ', colname(1:size_name), &
414 ' [', ioffset,
', ', isize,
']'
418 write(9,*) itype, column_types(col)
419 if (colname(1:size_name) /= trim(column_names(col))) stop 31
420 if (itype /= column_types(col)) stop 32
421 if (ioffset /= column_offsets(col)) stop 33
422 if (isize /= column_sizes(col)) stop 34
428 cerr =
odb_select_get_bitfield(odb_it, 2, ptr_bitfield_names, ptr_bitfield_sizes, bitfield_names_size, bitfield_sizes_size)
429 write(0,*)
'odb_select_get_bitfield column 2 => ', cerr
430 if (cerr /=0) stop 35
431 write(0,*)
'column 2 bitfield_names_size: ', bitfield_names_size
432 call c_f_pointer(cptr=ptr_bitfield_names, fptr=f_ptr_bitfield_names, shape=(/bitfield_names_size/));
433 do i=1, bitfield_names_size
434 bitfield_names(i:i) = f_ptr_bitfield_names(i)
436 write(0,*)
'column 2 bitfield_names: ', bitfield_names(1:bitfield_names_size)
437 if (bitfield_names(1:bitfield_names_size) /=
'active:passive:blacklisted:') stop 36
439 write(0,*)
'column 2 bitfield_sizes_size: ', bitfield_sizes_size
440 call c_f_pointer(cptr=ptr_bitfield_sizes, fptr=f_ptr_bitfield_sizes, shape=(/bitfield_sizes_size/));
441 do i=1, bitfield_sizes_size
442 bitfield_sizes(i:i) = f_ptr_bitfield_sizes(i)
444 write(0,*)
'column 2 bitfield_sizes: ', bitfield_sizes(1:bitfield_sizes_size)
445 if (bitfield_sizes(1:bitfield_sizes_size) /=
'1:1:4:') stop 37
449 allocate(one_row(row_size_doubles))
457 tmp_str1(1:24) = transfer(one_row(column_offsets(4):column_offsets(5)-1), tmp_str1(1:24))
458 tmp_str2(1:8) = transfer(one_row(column_offsets(5)), tmp_str2(1:8))
460 write(0,*) i,
":", one_row(column_offsets(1)), &
461 one_row(column_offsets(2)), &
462 one_row(column_offsets(3)), &
463 tmp_str1(1:24),
" ", &
465 one_row(column_offsets(6))
467 if (one_row(column_offsets(1)) /= i) stop 39
468 if (one_row(column_offsets(2)) /= i) stop 40
469 if (one_row(column_offsets(3)) /= 5) stop 41
470 if (trim(tmp_str1(1:strlen(tmp_str1))) /=
'this-is-a-long-string') stop 42
471 if (trim(tmp_str2(1:strlen(tmp_str2))) /=
'fihn') stop 43
472 if (one_row(column_offsets(6)) /= 5) stop 44
Create new read iterator.
Initialize ODB API. This function must be called before any other function from the ODB API.
program example_fortran_api
subroutine example_fortran_api_setup
subroutine example_fortran_api1
subroutine example_fortran_api_append
subroutine example_fortran_api2
Provides Fortran bindings for ODB API.
integer, parameter odb_integer
integer, parameter odb_bitfield
integer, parameter odb_double
integer(kind=c_int) function odb_read_get_column_offset(odb_iterator, n, offset)
integer(kind=c_int) function odb_write_get_column_offset(odb_iterator, n, offset)
integer, parameter odb_real
integer, parameter odb_string
integer(kind=c_int) function odb_select_get_column_offset(odb_iterator, n, offset)