/*      options(opt, value=nil)      */
static VALUE options(int argc, VALUE* argv, VALUE obj)
{
    VALUE opt, val;
    int n;
    my_bool b;
    char* v;
    MYSQL* m = GetHandler(obj);

    rb_scan_args(argc, argv, "11", &opt, &val);
    switch(NUM2INT(opt)) {
    case MYSQL_OPT_CONNECT_TIMEOUT:
#if MYSQL_VERSION_ID >= 40100
    case MYSQL_OPT_PROTOCOL:
#endif
#if MYSQL_VERSION_ID >= 40101
    case MYSQL_OPT_READ_TIMEOUT:
    case MYSQL_OPT_WRITE_TIMEOUT:
#endif
        if (val == Qnil)
            rb_raise(rb_eArgError, "wrong # of arguments(1 for 2)");
        n = NUM2INT(val);
        v = (char*)&n;
        break;
    case MYSQL_INIT_COMMAND:
    case MYSQL_READ_DEFAULT_FILE:
    case MYSQL_READ_DEFAULT_GROUP:
#if MYSQL_VERSION_ID >= 32349
    case MYSQL_SET_CHARSET_DIR:
    case MYSQL_SET_CHARSET_NAME:
#endif
#if MYSQL_VERSION_ID >= 40100
    case MYSQL_SHARED_MEMORY_BASE_NAME:
#endif
#if MYSQL_VERSION_ID >= 40101
    case MYSQL_SET_CLIENT_IP:
#endif
        if (val == Qnil)
            rb_raise(rb_eArgError, "wrong # of arguments(1 for 2)");
        v = StringValuePtr(val);
        break;
#if MYSQL_VERSION_ID >= 40101
    case MYSQL_SECURE_AUTH:
        if (val == Qnil || val == Qfalse)
            b = 1;
        else
            b = 0;
        v = (char*)&b;
        break;
#endif
#if MYSQL_VERSION_ID >= 32349
    case MYSQL_OPT_LOCAL_INFILE:
        if (val == Qnil || val == Qfalse)
            v = NULL;
        else {
            n = 1;
            v = (char*)&n;
        }
        break;
#endif
    default:
        v = NULL;
    }

    if (mysql_options(m, NUM2INT(opt), v) != 0)
        rb_raise(eMysql, "unknown option: %d", NUM2INT(opt));
    return obj;
}