18.5.7. VSEI Definition
typedef caddr_t (*bif_t) (caddr_t *qst, caddr_t *error_return, state_slot_t ** arguments);
void bif_define (char *name, bif_t bif);
void bif_define_typed (char * name, bif_t bif, bif_type_t *bt);
These functions associate a function pointer to a VSE name. The typed variant allows associating a value type used when inferring SQL meta-data if the result is returned to a client. The type can be one of the following externs:
- extern
bif_type_tbt_varchar; - extern
bif_type_tbt_any; - extern
bif_type_tbt_integer; - extern
bif_type_tbt_double; - extern
bif_type_tbt_float; - extern
bif_type_tbt_numeric; - extern
bif_type_tbt_convert; - extern
bif_type_tbt_timestamp; - extern
bif_type_tbt_time; - extern
bif_type_tbt_date; - extern
bif_type_tbt_datetime; - extern
bif_type_tbt_bin;
If a VSE accesses indexes either by its own internal code or by
executing Virtuoso/PL statements, there becomes a potential for
deadlocks. To prevent deadlocks, the Virtuoso/PL compiler must be
informed of potential index usage inside the VSE. Special deadlock-safe
code can be created for its needs. The
bif_set_uses_index() function should be used after
bif_define() or
bif_define_typed() in such cases.
The potential for deadlocking is always present if the VSE executes Virtuoso/PL code or uses XPath/XSLT functions. Other functions of Virtuoso's C interface are deadlock-safe since they perform no database access.