예제 #1
0
/**
 * get the info about a backend
 *
 * proxy.backend[0].
 *   connected_clients => clients using this backend
 *   address           => ip:port or unix-path of to the backend
 *   state             => int(BACKEND_STATE_UP|BACKEND_STATE_DOWN)
 *   type              => int(BACKEND_TYPE_RW|BACKEND_TYPE_RO)
 *
 * @return nil or requested information
 * @see backend_state_t backend_type_t
 */
static int proxy_backend_get(lua_State *L) {
	network_backend_t *backend = *(network_backend_t **)luaL_checkself(L);
	gsize keysize = 0;
	const char *key = luaL_checklstring(L, 2, &keysize);

	if (strleq(key, keysize, C("connected_clients"))) {
		lua_pushinteger(L, backend->connected_clients);
	} else if (strleq(key, keysize, C("dst"))) {
		network_address_lua_push(L, backend->addr);
	} else if (strleq(key, keysize, C("state"))) {
		lua_pushinteger(L, backend->state);
	} else if (strleq(key, keysize, C("type"))) {
		lua_pushinteger(L, backend->type);
	} else if (strleq(key, keysize, C("uuid"))) {
		if (backend->uuid->len) {
			lua_pushlstring(L, S(backend->uuid));
		} else {
			lua_pushnil(L);
		}
	} else if (strleq(key, keysize, C("weight"))) {
		lua_pushinteger(L, backend->weight);
	} else {
		lua_pushnil(L);
	}

	return 1;
}
예제 #2
0
static int proxy_socket_get(lua_State *L) {
    network_socket *sock = *(network_socket **)luaL_checkself(L);
    gsize keysize = 0;
    const char *key = luaL_checklstring(L, 2, &keysize);

    /**
     * we to split it in .client and .server here
     */

    if (strleq(key, keysize, C("default_db"))) {
        lua_pushlstring(L, sock->conn_attr.default_db->str, sock->conn_attr.default_db->len);
        return 1;
    }else if (strleq(key, keysize, C("charset_client"))) {
        lua_pushlstring(L, sock->conn_attr.charset_client->str, sock->conn_attr.charset_client->len);
        return 1;
    }else if (strleq(key, keysize, C("charset_connection"))) {
        lua_pushlstring(L, sock->conn_attr.charset_connection->str, sock->conn_attr.charset_connection->len);
        return 1;
    }else if (strleq(key, keysize, C("charset_results"))) {
        lua_pushlstring(L, sock->conn_attr.charset_results->str, sock->conn_attr.charset_results->len);
        return 1;
    }else if (strleq(key, keysize, C("address"))) {
        return luaL_error(L, ".address is deprecated. Use .src.name or .dst.name instead");
    } else if (strleq(key, keysize, C("src"))) {
        return network_address_lua_push(L, sock->src);
    } else if (strleq(key, keysize, C("dst"))) {
        return network_address_lua_push(L, sock->dst);
    }
      
    if (sock->response) {
        if (strleq(key, keysize, C("username"))) {
            lua_pushlstring(L, S(sock->response->username));
            return 1;
        } else if (strleq(key, keysize, C("scrambled_password"))) {
            lua_pushlstring(L, S(sock->response->response));
            return 1;
        }
    }

    if (sock->challenge) { /* only the server-side has mysqld_version set */
        if (strleq(key, keysize, C("mysqld_version"))) {
            lua_pushinteger(L, sock->challenge->server_version);
            return 1;
        } else if (strleq(key, keysize, C("thread_id"))) {
            lua_pushinteger(L, sock->challenge->thread_id);
            return 1;
        } else if (strleq(key, keysize, C("scramble_buffer"))) {
            lua_pushlstring(L, S(sock->challenge->challenge));
            return 1;
        }
    }
    g_critical("%s: sock->challenge: %p, sock->response: %p (looking for %s)", 
            G_STRLOC,
            (void *)sock->challenge,
            (void *)sock->response,
            key
            );

    lua_pushnil(L);

    return 1;
}