def rewrite(self, sql): try: # silently fail index creation; indexes are passe if sql.startswith("CREATE INDEX"): return None self.parser = SqlParser() analysis = self.parser.parse(sql) if isinstance(analysis, InsertRow): return self.rewrite_INSERT(analysis) if isinstance(analysis, UpdateAnalysis): return self.rewrite_UPDATE(analysis) if isinstance(analysis, DeleteAnalysis): return self.rewrite_DELETE(analysis) if isinstance(analysis, SelectAnalysis): return self.rewrite_SELECT(analysis) if isinstance(analysis, TableSchema): return self.rewrite_CREATE_TABLE(analysis) except ParseException, err: raise SqlSyntaxError(err.message, line=err.line)
class rewriter: """Rewrites SQL queries as SPARQL queries, using the dbns base uri for anything not explicitly aliased >>> sql = rewriter("urn:ponga:example/") >>> print sql.pk_uri("Story", 1) urn:ponga:example/story/1/ """ def __init__(self, dbns_uri, schema={}): self.base_uri = dbns_uri self.schema = schema def table_uri(self, table_name): """ Convert a table name to a URI that represents that table. Tables that are not otherwise aliased become: BASE_URI/table >>> sql = rewriter("urn:ponga:example/") >>> print sql.table_uri("Story") urn:ponga:example/story """ return self.base_uri + table_name.lower() def column_uri(self, table_name, column_name): """ Convert a table and column name to a URI that represents that column. Columns that are not otherwise aliased become: BASE_URI/table.column >>> sql = rewriter("urn:ponga:example/") >>> print sql.column_uri("Story", "title") urn:ponga:example/story.title """ return self.table_uri(table_name) + "." + column_name.lower() def pk_uri(self, table_name, pk_id): """ Given a table and simple PK, work out the URI BASE_URI/table/id/ """ return "%s/%s/" % (self.table_uri(table_name), pk_id) def rewrite(self, sql): try: # silently fail index creation; indexes are passe if sql.startswith("CREATE INDEX"): return None self.parser = SqlParser() analysis = self.parser.parse(sql) if isinstance(analysis, InsertRow): return self.rewrite_INSERT(analysis) if isinstance(analysis, UpdateAnalysis): return self.rewrite_UPDATE(analysis) if isinstance(analysis, DeleteAnalysis): return self.rewrite_DELETE(analysis) if isinstance(analysis, SelectAnalysis): return self.rewrite_SELECT(analysis) if isinstance(analysis, TableSchema): return self.rewrite_CREATE_TABLE(analysis) except ParseException, err: raise SqlSyntaxError(err.message, line=err.line) except Exception: print "-" * 20 print sql print "-" * 20 raise