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)
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