def compile(self, db):
#		// Start an insertion query
        query = 'INSERT INTO %s' % (db.quote_table(self._table))

#		// Add the column names
        query = '%s (%s) ' % (query, ', '.join([db.quote_column(c) for c in self._columns]))

        if isinstance(self._values, (list, tuple)):
#			// Callback for quoting values
#			$quote = array($db, 'quote');
#
            groups = []

            for group in self._values:
                offset = 0
                for value in group:
                    if isinstance(value, str) and not self._parameters.has_key(value):
#						// Quote the value, it is not a parameter
                        group[offset] = db.quote(value)
#
                    offset += 1
                groups.append('(%s)' % (', '.join(group)))

#			// Add the values
            query = '%s VALUES %s' % (query, ', '.join(groups))
        else:
#			// Add the sub-query
            query = '%s %s' % (query, str( self._values))

        self._sql = query

        return database_query_builder_where.compile(self, db)
    def compile(self, db):
#		// Callback to quote columns
#		$quote_column = array($db, 'quote_column');
#
#		// Callback to quote tables
#		$quote_table = array($db, 'quote_table');
#
#		// Start a selection query
        query = 'SELECT '

        if self._distinct:
#			// Select only unique results
            query = '%sDISTINCT ' % query

        if len(self._select) <= 0:
#			// Select all columns
            query = '%s*' % query
        else:
#			// Select all columns
            query = '%s%s' % (query, ', '.join( list( set ( [db.quote_column(x) for x in self._select] ) ) ) )

        if len(self._from) > 0:
            query = '%s FROM %s' % (query, ', '.join( list( set ( [db.quote_table(x) for x in self._from] ) ) ) )

        if len(self._join) > 0:
            query = '%s %s' % (query, self._compile_join(db, self._join))

        if len(self._where) > 0:
            query = '%s WHERE %s' % (query, self._compile_conditions(db, self._where))

        if len(self._group_by) > 0:
            query = '%s %s' % (query, self._compile_group_by(db, self._group_by))

        if len(self._having) > 0:
            query = '%s HAVING %s' % (query, self._compile_conditions(db, self._having))

        if len(self._order_by) > 0:
            query = '%s %s' % (query, self._compile_order_by(db, self._order_by))

        if self._limit is not None:
            query = '%s LIMIT %s' % (query, self._limit)

        if self._offset is not None:
            query = '%s OFFSET %s' % (query, self._offset)

        if len(self._union) > 0:
            for u in self._union:
                union_sql = ' UNION '
                if u['all']:
                    union_sql = '%s ALL ' % (union_sql)
                query = '%s %s %s' % (query, union_sql, u['select'].compile(db))

        self._sql = query

        return database_query_builder_where.compile(self, db)
    def compile(self, db):
#		// Start a deletion query
        query = 'DELETE FROM %s' % (db.quote_table(self._table))

        if len(self._where) > 0:
#			// Add deletion conditions
            query = '%s WHERE %s' % (query, self._compile_conditions(db, self._where)) 

        if len(self._order_by) > 0:
#			// Add sorting
            query = '%s %s' % (query, self._compile_order_by(db, self._order_by))

        if self._limit is not None:
            query = '%s LIMIT %s' % (query, self._limit)

        self._sql = query

        return database_query_builder_where.compile(self, db)
    def compile(self, db):
#		// Start an update query
        query = 'UPDATE %s' % (db.quote_table(self._table))

#		// Add the columns to update
        query = '%s SET %s' % (query, self._compile_set(db, self._set))

        if len(self._where) > 0:
#			// Add selection conditions
            query = '%s WHERE %s' % (query, self._compile_conditions(db, self._where))

        if len(self._order_by) > 0:
            query = '%s %s' % (query, self._compile_order_by(db, self._order_by))

        if self._limit is not None:
            query = '%s LIMIT %s' % (query, self._limit)

        self._sql = query

        return database_query_builder_where.compile(self, db)