/**
 * call-seq:
 *     busy_handler( db, handler ) -> nil
 *
 * Installs a callback to be invoked whenever a request cannot be honored
 * because a database is busy. The handler should take two parameters: a
 * string naming the resource that was being accessed, and an integer indicating
 * how many times the current request has failed due to the resource being busy.
 *
 * If the handler returns +false+, the operation will be aborted, with a
 * SQLite::BusyException being raised. Otherwise, SQLite will attempt to
 * access the resource again.
 *
 * See #busy_timeout for an easier way to manage the common case.
 */
static VALUE
static_api_busy_handler( VALUE module, VALUE db, VALUE handler )
{
  sqlite *handle;

  GetDB( handle, db );
  if( handler == Qnil )
  {
    sqlite_busy_handler( handle, NULL, NULL );
  }
  else
  {
    if( !rb_obj_is_kind_of( handler, rb_cProc ) )
    {
      rb_raise( rb_eArgError, "handler must be a proc" );
    }

    sqlite_busy_handler( handle, static_busy_handler, (void*)handler );
  }

  return Qnil;
}