Beispiel #1
0
def execute_select_plain(etcd_client, tree, db):
    """Execute SELECT that reads rows from table."""

    result_columns = prepare_columns(tree)
    result_set = ResultSet(result_columns)

    table_columns = get_table_columns(etcd_client, db, tree.table)

    last_row = None
    for primary_key in list_table(etcd_client, db, tree.table):

        table_row = get_row_by_primary_key(etcd_client, db, tree.table,
                                           primary_key)

        if tree.where:
            expr = tree.where
            if eval_expr((table_columns, table_row), expr)[1]:
                row = Row(eval_row(table_columns, table_row, tree),
                          etcd_index=table_row.etcd_index,
                          modified_index=table_row.modified_index)
                result_set.add_row(row)
                last_row = table_row
        else:
            row = Row(eval_row(table_columns, table_row, tree),
                      etcd_index=table_row.etcd_index,
                      modified_index=table_row.modified_index)
            result_set.add_row(row)
            last_row = table_row

    g_function, pos = group_function(table_columns, last_row, tree)
    if g_function:
        result_set = group_result_set(g_function, result_set, last_row, tree,
                                      pos)

    return result_set
Beispiel #2
0
def execute_update(etcd_client, tree, db):
    """Execute UPDATE query"""
    affected_rows = 0
    table_columns = get_table_columns(etcd_client, db, tree.table)

    for primary_key in list_table(etcd_client, db, tree.table):

        table_row = get_row_by_primary_key(etcd_client, db, tree.table,
                                           primary_key)
        key = '/{db}/{tbl}/{pk}'.format(db=db, tbl=tree.table, pk=primary_key)

        row = {}
        for column in table_columns:
            index = table_columns.index(column)
            row[str(column)] = table_row[index]

        for update_fields in tree.expressions:
            field_name, field_expression = update_fields

            field_value = eval_expr(table_row, field_expression)
            # print('Update %s with %s' % (field_name, field_value[1]))
            row[field_name] = field_value[1]

        if tree.where:

            if eval_expr((table_columns, table_row), tree.where)[1]:
                _update_key(etcd_client, key, json.dumps(row))
                affected_rows += 1
        else:
            _update_key(etcd_client, key, json.dumps(row))
            affected_rows += 1
    return affected_rows
Beispiel #3
0
def execute_wait(etcd_client, tree, db):
    """Execute WAIT.

    :param etcd_client: Etcd client.
    :type etcd_client: Client
    :param tree: Parsing tree.
    :type tree: SQLTree
    :param db: Current database.
    :type db: str
    """

    result_columns = prepare_columns(tree)
    result_set = ResultSet(result_columns)

    table_columns = get_table_columns(etcd_client, db, tree.table)

    for primary_key in list_table(etcd_client, db, tree.table):

        table_row = get_row_by_primary_key(etcd_client, db, tree.table,
                                           primary_key)
        etcd_index = table_row.etcd_index

        if tree.where:
            expr = tree.where
            try:
                wait_index = tree.options['after']
            except KeyError:
                wait_index = etcd_index + 1

            if eval_expr((table_columns, table_row), expr)[1]:
                start = time.time()
                while True:
                    if time.time() > start + WAIT_WAIT_TIMEOUT:
                        raise InternalError('Wait timeout %d '
                                            'seconds expired' %
                                            WAIT_WAIT_TIMEOUT)
                    try:
                        new_row = get_row_by_primary_key(etcd_client,
                                                         db,
                                                         tree.table,
                                                         primary_key,
                                                         wait=True,
                                                         wait_index=wait_index)
                        break
                    except KeyError:
                        wait_index += 1
                row = Row(eval_row(table_columns, new_row, tree),
                          etcd_index=new_row.etcd_index,
                          modified_index=new_row.modified_index)
                result_set.add_row(row)
        else:
            row = Row(eval_row(table_columns, table_row, tree),
                      etcd_index=etcd_index,
                      modified_index=etcd_index)
            result_set.add_row(row)

    return result_set
Beispiel #4
0
def fix_tree_star(tree, etcd_client, db, tbl):
    """If parsing tree contains [["*", null], null] expression it means
    the query was SELECT * . So, the expressions needs to be replaced
    with actual field names.

    """
    if tree.expressions == [(("*", None), None)]:
        tree.expressions = []
        for field in get_table_columns(etcd_client, db, tbl):
            tree.expressions.append(
                (('bool_primary', ('predicate', ('bit_expr', ('simple_expr',
                                                              ('IDENTIFIER',
                                                               str(field)))))),
                 None))
    return tree
Beispiel #5
0
def execute_delete(etcd_client, tree, db):
    """Execute DELETE query"""
    affected_rows = 0
    table_columns = get_table_columns(etcd_client, db, tree.table)
    for primary_key in list_table(etcd_client, db, tree.table):

        table_row = get_row_by_primary_key(etcd_client, db, tree.table,
                                           primary_key)

        key = "/{db}/{tbl}/{pk}".format(db=db, tbl=tree.table, pk=primary_key)

        if tree.where:
            expr = tree.where
            if eval_expr((table_columns, table_row), expr)[1]:
                _delete_key(etcd_client, key)
            affected_rows += 1
        else:
            _delete_key(etcd_client, key)
            affected_rows += 1

    return affected_rows