Exemple #1
0
    def load(self, data):
        unicode_data = decode_string(data, encoding=self.encoding)

        if self.safe:
            return yaml.safe_load(unicode_data)
        else:
            return yaml.load(unicode_data)
Exemple #2
0
def parse_insert(sql, complete=False, decimal=False, encoding=None,
                 single_row=False):

    sql = decode_string(sql, encoding)

    if not sql.startswith('INSERT'):
        raise ValueError('not an INSERT statement')

    identifiers = []
    rows = []
    current_row = []
    for m in INSERT_RE.finditer(sql):
        if m.group('identifier'):
            identifiers.append(m.group('identifier'))
        elif m.group('null'):
            current_row.append(None)
        elif m.group('string') is not None:  # parse empty strings!
            current_row.append(unescape_string(m.group('string')))
        elif m.group('hex'):
            current_row.append(m.group('hex').decode('hex'))
        elif m.group('number'):
            current_row.append(
                parse_number(m.group('number'), decimal=decimal))
        elif m.group('close_paren'):
            # woot, I'm a parser
            if current_row:
                rows.append(current_row)
                current_row = []
        else:
            assert False, 'should not be reached!'

    if current_row:
        raise ValueError('bad INSERT, missing close paren')

    if not rows:
        raise ValueError('bad INSERT, no values')

    row_len = len(rows[0])
    for i, row in enumerate(rows[1:]):
        if len(row) != row_len:
            raise ValueError(
                'bad INSERT, row 0 has %d values, but row %d has %d values' %
                (row_len, i + 1, len(row)))

    if not identifiers:
        raise ValueError('bad INSERT, no identifiers')

    table, cols = identifiers[0], identifiers[1:]

    if cols and len(cols) != row_len:
        raise ValueError(
            'bad INSERT, %d column names but rows have %d values' %
            (len(cols), row_len))

    if complete:
        if cols:
            results = [dict(zip(cols, row)) for row in rows]
        else:
            raise ValueError('incomplete INSERT, no column names')
    else:
        results = rows

    if single_row:
        if len(results) == 1:
            return table, results[0]
        else:
            raise ValueError(
                'bad INSERT, expected 1 row but got %d' % len(results))
    else:
        return table, results