示例#1
0
async def _compile_sys_queries(schema, cluster):
    queries = {}

    cfg_query = config.generate_config_query(schema)

    schema, sql = compiler.compile_bootstrap_script(
        schema,
        schema,
        cfg_query,
        expected_cardinality_one=True,
        single_statement=True)

    queries['config'] = sql

    role_query = '''
        SELECT sys::Role {
            name,
            is_superuser,
            password,
        } FILTER .name = <str>$name;
    '''
    schema, sql = compiler.compile_bootstrap_script(
        schema,
        schema,
        role_query,
        expected_cardinality_one=True,
        single_statement=True)

    queries['role'] = sql

    await _store_static_json_cache(
        cluster,
        'sysqueries',
        json.dumps(queries),
    )
async def _populate_data(std_schema, schema, conn):
    script = '''
        INSERT stdgraphql::Query;
    '''

    schema, sql = compiler.compile_bootstrap_script(std_schema, schema, script)
    await conn.execute(sql)
    return schema
async def _init_defaults(std_schema, schema, conn):
    script = '''
        CREATE MODULE default;
    '''

    schema, sql = compiler.compile_bootstrap_script(std_schema, schema, script)
    await conn.execute(sql)
    return schema
示例#4
0
async def _populate_data(std_schema, schema, conn):
    script = '''
        INSERT stdgraphql::Query;
        INSERT stdgraphql::Mutation;
    '''

    schema, sql = compiler.compile_bootstrap_script(std_schema, schema, script)
    await _execute_ddl(conn, sql)
    return schema
示例#5
0
async def _get_dbs_and_roles(pgconn) -> Tuple[List[str], List[str]]:
    std_schema = await compiler.load_std_schema(pgconn)

    schema, get_databases_sql = compiler.compile_bootstrap_script(
        std_schema,
        std_schema,
        'SELECT sys::Database.name',
        expected_cardinality_one=False,
        single_statement=True,
    )

    databases = list(
        sorted(
            json.loads(await pgconn.fetchval(get_databases_sql)),
            key=lambda dname: dname == edbdef.EDGEDB_TEMPLATE_DB,
        ))

    schema, get_roles_sql = compiler.compile_bootstrap_script(
        std_schema,
        std_schema,
        '''SELECT sys::Role {
            name,
            parents := .member_of.name,
        }''',
        expected_cardinality_one=False,
        single_statement=True,
    )

    roles = json.loads(await pgconn.fetchval(get_roles_sql))
    sorted_roles = list(
        topological.sort({
            r['name']: {
                'item': r['name'],
                'deps': r['parents'],
            }
            for r in roles
        }))

    return databases, sorted_roles
示例#6
0
async def _configure(schema, conn, cluster, *, insecure=False, testmode=False):
    scripts = []

    if not testmode:
        memory_kb = psutil.virtual_memory().total // 1024
        settings = {
            'shared_buffers': f'"{int(memory_kb * 0.2)}kB"',
            'effective_cache_size': f'"{int(memory_kb * 0.5)}kB"',
            'query_work_mem': f'"{6 * (2 ** 10)}kB"',
        }

        for setting, value in settings.items():
            scripts.append(f'''
                CONFIGURE SYSTEM SET {setting} := {value};
            ''')
    else:
        settings = {}

    if insecure:
        scripts.append('''
            CONFIGURE SYSTEM INSERT Auth {
                priority := 0,
                method := (INSERT Trust),
            };
        ''')

    config_spec = config.get_settings()

    for script in scripts:
        _, sql = compiler.compile_bootstrap_script(
            schema, schema, script, single_statement=True)

        if debug.flags.bootstrap:
            debug.header('Bootstrap')
            debug.dump_code(sql, lexer='sql')

        config_op_data = await conn.fetchval(sql)
        if config_op_data is not None and isinstance(config_op_data, str):
            config_op = config.Operation.from_json(config_op_data)
            settings = config_op.apply(config_spec, immutables.Map())

    config_json = config.to_json(config_spec, settings)
    block = dbops.PLTopBlock()
    dbops.UpdateMetadata(
        dbops.Database(name=edbdef.EDGEDB_TEMPLATE_DB),
        {'sysconfig': json.loads(config_json)},
    ).generate(block)

    await _execute_block(conn, block)
async def _compile_sys_queries(schema, cluster):
    queries = {}

    cfg_query = config.generate_config_query(schema)

    schema, sql = compiler.compile_bootstrap_script(
        schema,
        schema,
        cfg_query,
        expected_cardinality_one=True,
        single_statement=True)

    queries['config'] = sql.encode('utf-8')

    role_query = '''
        SELECT sys::Role {
            name,
            allow_login,
            is_superuser,
            password,
        } FILTER .name = <str>$name;
    '''
    schema, sql = compiler.compile_bootstrap_script(
        schema,
        schema,
        role_query,
        expected_cardinality_one=True,
        single_statement=True)

    queries['role'] = sql.encode('utf-8')

    data_dir = cluster.get_data_dir()
    queries_fn = os.path.join(data_dir, 'queries.pickle')

    with open(queries_fn, 'wb') as f:
        pickle.dump(queries, f)
示例#8
0
async def _configure(schema, conn, cluster, *, insecure=False, testmode=False):
    scripts = []

    if not testmode:
        memory_kb = psutil.virtual_memory().total // 1024
        settings = {
            'shared_buffers': f'"{int(memory_kb * 0.2)}kB"',
            'effective_cache_size': f'"{int(memory_kb * 0.5)}kB"',
            'query_work_mem': f'"{6 * (2 ** 10)}kB"',
        }

        for setting, value in settings.items():
            scripts.append(f'''
                CONFIGURE SYSTEM SET {setting} := {value};
            ''')
    else:
        settings = {}

    if insecure:
        scripts.append('''
            CONFIGURE SYSTEM INSERT Auth {
                priority := 0,
                method := (INSERT Trust),
            };
        ''')

    config_spec = config.get_settings()

    for script in scripts:
        _, sql = compiler.compile_bootstrap_script(schema,
                                                   schema,
                                                   script,
                                                   single_statement=True)

        if debug.flags.bootstrap:
            debug.header('Bootstrap')
            debug.dump_code(sql, lexer='sql')

        config_op_data = await conn.fetchval(sql)
        if config_op_data is not None and isinstance(config_op_data, str):
            config_op = config.Operation.from_json(config_op_data)
            settings = config_op.apply(config_spec, immutables.Map())

    data_dir = cluster.get_data_dir()
    overrides_fn = os.path.join(data_dir, 'config_sys.json')

    with open(overrides_fn, 'wt') as f:
        f.write(config.to_json(config_spec, settings))