Index: third_party/twisted_8_1/twisted/enterprise/sqlreflector.py |
diff --git a/third_party/twisted_8_1/twisted/enterprise/sqlreflector.py b/third_party/twisted_8_1/twisted/enterprise/sqlreflector.py |
deleted file mode 100644 |
index d29d9fbad00ec00b79de9dd1fd4addbba55bd552..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/enterprise/sqlreflector.py |
+++ /dev/null |
@@ -1,327 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_reflector -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-from twisted.enterprise import reflector |
-from twisted.enterprise.util import DBError, getKeyColumn, quote, safe |
-from twisted.enterprise.util import _TableInfo |
-from twisted.enterprise.row import RowObject |
- |
-from twisted.python import reflect |
- |
-class SQLReflector(reflector.Reflector): |
- """ |
- DEPRECATED. |
- |
- I reflect on a database and load RowObjects from it. |
- |
- In order to do this, I interrogate a relational database to |
- extract schema information and interface with RowObject class |
- objects that can interact with specific tables. |
- """ |
- populated = 0 |
- conditionalLabels = { |
- reflector.EQUAL : "=", |
- reflector.LESSTHAN : "<", |
- reflector.GREATERTHAN : ">", |
- reflector.LIKE : "like" |
- } |
- |
- def __init__(self, dbpool, rowClasses): |
- """Initialize me against a database. |
- """ |
- reflector.Reflector.__init__(self, rowClasses) |
- self.dbpool = dbpool |
- |
- def _populate(self): |
- self._transPopulateSchema() |
- |
- def _transPopulateSchema(self): |
- """Used to construct the row classes in a single interaction. |
- """ |
- for rc in self.rowClasses: |
- if not issubclass(rc, RowObject): |
- raise DBError("Stub class (%s) is not derived from RowObject" % reflect.qual(rc.rowClass)) |
- |
- self._populateSchemaFor(rc) |
- self.populated = 1 |
- |
- def _populateSchemaFor(self, rc): |
- """Construct all the SQL templates for database operations on |
- <tableName> and populate the class <rowClass> with that info. |
- """ |
- attributes = ("rowColumns", "rowKeyColumns", "rowTableName" ) |
- for att in attributes: |
- if not hasattr(rc, att): |
- raise DBError("RowClass %s must have class variable: %s" % (rc, att)) |
- |
- tableInfo = _TableInfo(rc) |
- tableInfo.updateSQL = self.buildUpdateSQL(tableInfo) |
- tableInfo.insertSQL = self.buildInsertSQL(tableInfo) |
- tableInfo.deleteSQL = self.buildDeleteSQL(tableInfo) |
- self.populateSchemaFor(tableInfo) |
- |
- def escape_string(self, text): |
- """Escape a string for use in an SQL statement. The default |
- implementation escapes ' with '' and \ with \\. Redefine this |
- function in a subclass if your database server uses different |
- escaping rules. |
- """ |
- return safe(text) |
- |
- def quote_value(self, value, type): |
- """Format a value for use in an SQL statement. |
- |
- @param value: a value to format as data in SQL. |
- @param type: a key in util.dbTypeMap. |
- """ |
- return quote(value, type, string_escaper=self.escape_string) |
- |
- def loadObjectsFrom(self, tableName, parentRow=None, data=None, |
- whereClause=None, forceChildren=0): |
- """Load a set of RowObjects from a database. |
- |
- Create a set of python objects of <rowClass> from the contents |
- of a table populated with appropriate data members. |
- Example:: |
- |
- | class EmployeeRow(row.RowObject): |
- | pass |
- | |
- | def gotEmployees(employees): |
- | for emp in employees: |
- | emp.manager = "fred smith" |
- | manager.updateRow(emp) |
- | |
- | reflector.loadObjectsFrom("employee", |
- | data = userData, |
- | whereClause = [("manager" , EQUAL, "fred smith")] |
- | ).addCallback(gotEmployees) |
- |
- NOTE: the objects and all children should be loaded in a single transaction. |
- NOTE: can specify a parentRow _OR_ a whereClause. |
- |
- """ |
- if parentRow and whereClause: |
- raise DBError("Must specify one of parentRow _OR_ whereClause") |
- if parentRow: |
- info = self.getTableInfo(parentRow) |
- relationship = info.getRelationshipFor(tableName) |
- whereClause = self.buildWhereClause(relationship, parentRow) |
- elif whereClause: |
- pass |
- else: |
- whereClause = [] |
- return self.dbpool.runInteraction(self._rowLoader, tableName, |
- parentRow, data, whereClause, |
- forceChildren) |
- |
- def _rowLoader(self, transaction, tableName, parentRow, data, |
- whereClause, forceChildren): |
- """immediate loading of rowobjects from the table with the whereClause. |
- """ |
- tableInfo = self.schema[tableName] |
- # Build the SQL for the query |
- sql = "SELECT " |
- first = 1 |
- for column, type in tableInfo.rowColumns: |
- if first: |
- first = 0 |
- else: |
- sql = sql + "," |
- sql = sql + " %s" % column |
- sql = sql + " FROM %s " % (tableName) |
- if whereClause: |
- sql += " WHERE " |
- first = 1 |
- for wItem in whereClause: |
- if first: |
- first = 0 |
- else: |
- sql += " AND " |
- (columnName, cond, value) = wItem |
- t = self.findTypeFor(tableName, columnName) |
- quotedValue = self.quote_value(value, t) |
- sql += "%s %s %s" % (columnName, self.conditionalLabels[cond], |
- quotedValue) |
- |
- # execute the query |
- transaction.execute(sql) |
- rows = transaction.fetchall() |
- |
- # construct the row objects |
- results = [] |
- newRows = [] |
- for args in rows: |
- kw = {} |
- for i in range(0,len(args)): |
- ColumnName = tableInfo.rowColumns[i][0].lower() |
- for attr, type in tableInfo.rowClass.rowColumns: |
- if attr.lower() == ColumnName: |
- kw[attr] = args[i] |
- break |
- # find the row in the cache or add it |
- resultObject = self.findInCache(tableInfo.rowClass, kw) |
- if not resultObject: |
- meth = tableInfo.rowFactoryMethod[0] |
- resultObject = meth(tableInfo.rowClass, data, kw) |
- self.addToCache(resultObject) |
- newRows.append(resultObject) |
- results.append(resultObject) |
- |
- # add these rows to the parentRow if required |
- if parentRow: |
- self.addToParent(parentRow, newRows, tableName) |
- |
- # load children or each of these rows if required |
- for relationship in tableInfo.relationships: |
- if not forceChildren and not relationship.autoLoad: |
- continue |
- for row in results: |
- # build where clause |
- childWhereClause = self.buildWhereClause(relationship, row) |
- # load the children immediately, but do nothing with them |
- self._rowLoader(transaction, |
- relationship.childRowClass.rowTableName, |
- row, data, childWhereClause, forceChildren) |
- |
- return results |
- |
- def findTypeFor(self, tableName, columnName): |
- tableInfo = self.schema[tableName] |
- columnName = columnName.lower() |
- for column, type in tableInfo.rowColumns: |
- if column.lower() == columnName: |
- return type |
- |
- def buildUpdateSQL(self, tableInfo): |
- """(Internal) Build SQL template to update a RowObject. |
- |
- Returns: SQL that is used to contruct a rowObject class. |
- """ |
- sql = "UPDATE %s SET" % tableInfo.rowTableName |
- # build update attributes |
- first = 1 |
- for column, type in tableInfo.rowColumns: |
- if getKeyColumn(tableInfo.rowClass, column): |
- continue |
- if not first: |
- sql = sql + ", " |
- sql = sql + " %s = %s" % (column, "%s") |
- first = 0 |
- |
- # build where clause |
- first = 1 |
- sql = sql + " WHERE " |
- for keyColumn, type in tableInfo.rowKeyColumns: |
- if not first: |
- sql = sql + " AND " |
- sql = sql + " %s = %s " % (keyColumn, "%s") |
- first = 0 |
- return sql |
- |
- def buildInsertSQL(self, tableInfo): |
- """(Internal) Build SQL template to insert a new row. |
- |
- Returns: SQL that is used to insert a new row for a rowObject |
- instance not created from the database. |
- """ |
- sql = "INSERT INTO %s (" % tableInfo.rowTableName |
- # build column list |
- first = 1 |
- for column, type in tableInfo.rowColumns: |
- if not first: |
- sql = sql + ", " |
- sql = sql + column |
- first = 0 |
- |
- sql = sql + " ) VALUES (" |
- |
- # build values list |
- first = 1 |
- for column, type in tableInfo.rowColumns: |
- if not first: |
- sql = sql + ", " |
- sql = sql + "%s" |
- first = 0 |
- |
- sql = sql + ")" |
- return sql |
- |
- def buildDeleteSQL(self, tableInfo): |
- """Build the SQL template to delete a row from the table. |
- """ |
- sql = "DELETE FROM %s " % tableInfo.rowTableName |
- # build where clause |
- first = 1 |
- sql = sql + " WHERE " |
- for keyColumn, type in tableInfo.rowKeyColumns: |
- if not first: |
- sql = sql + " AND " |
- sql = sql + " %s = %s " % (keyColumn, "%s") |
- first = 0 |
- return sql |
- |
- def updateRowSQL(self, rowObject): |
- """Build SQL to update the contents of rowObject. |
- """ |
- args = [] |
- tableInfo = self.schema[rowObject.rowTableName] |
- # build update attributes |
- for column, type in tableInfo.rowColumns: |
- if not getKeyColumn(rowObject.__class__, column): |
- args.append(self.quote_value(rowObject.findAttribute(column), |
- type)) |
- # build where clause |
- for keyColumn, type in tableInfo.rowKeyColumns: |
- args.append(self.quote_value(rowObject.findAttribute(keyColumn), |
- type)) |
- |
- return self.getTableInfo(rowObject).updateSQL % tuple(args) |
- |
- def updateRow(self, rowObject): |
- """Update the contents of rowObject to the database. |
- """ |
- sql = self.updateRowSQL(rowObject) |
- rowObject.setDirty(0) |
- return self.dbpool.runOperation(sql) |
- |
- def insertRowSQL(self, rowObject): |
- """Build SQL to insert the contents of rowObject. |
- """ |
- args = [] |
- tableInfo = self.schema[rowObject.rowTableName] |
- # build values |
- for column, type in tableInfo.rowColumns: |
- args.append(self.quote_value(rowObject.findAttribute(column),type)) |
- return self.getTableInfo(rowObject).insertSQL % tuple(args) |
- |
- def insertRow(self, rowObject): |
- """Insert a new row for rowObject. |
- """ |
- rowObject.setDirty(0) |
- sql = self.insertRowSQL(rowObject) |
- return self.dbpool.runOperation(sql) |
- |
- def deleteRowSQL(self, rowObject): |
- """Build SQL to delete rowObject from the database. |
- """ |
- args = [] |
- tableInfo = self.schema[rowObject.rowTableName] |
- # build where clause |
- for keyColumn, type in tableInfo.rowKeyColumns: |
- args.append(self.quote_value(rowObject.findAttribute(keyColumn), |
- type)) |
- |
- return self.getTableInfo(rowObject).deleteSQL % tuple(args) |
- |
- def deleteRow(self, rowObject): |
- """Delete the row for rowObject from the database. |
- """ |
- sql = self.deleteRowSQL(rowObject) |
- self.removeFromCache(rowObject) |
- return self.dbpool.runOperation(sql) |
- |
- |
-__all__ = ['SQLReflector'] |