Here's the first cut at my solution. The example code is at the
bottom. It takes a table of tuples and uses COPY table FROM stdin in
to add them to a new table and then uses a simple INSERT statement to
append the new rows into the existing author table. The function
parse_connection_args is just the beginning of the pgdb.connect()

-- Chris

----- Example --------------------------------------------------------------

#! /usr/bin/env python

import pg, pgdb

class PreConnectedDB(pg.DB):

    """A way to get a pg.DB object around a connection established from the 
pgdb.connect() method."""

    def __init__(self, cnx):
        self.db = cnx
        self.dbname = self.db.db
        self.__attnames = {}
        self.__pkeys = {}
        ## self.__args = args, kw
        self.debug = None     # For debugging scripts, this can be set
                              # * to a string format specification (e.g. in a 
CGI set to "%s<BR>"),
                              # * to a function which takes a string argument or
                              # * to a file object to write debug statements to.

    def close(self):
        """Don't allow the subconnection to close the connection to the 
database."""

        raise pg.InternalError, "Subconnection is not allowed to close the 
database."
    
class pgdbCnxWithClassicDb(pgdb.pgdbCnx):

    def __init__(self, cnx):
        self.classicDb = cnx
        pgdb.pgdbCnx.__init__(self, cnx)

    def get_classic_db(self):
        print self.__dict__.keys()
        return PreConnectedDB(self.classicDb)

def parse_connection_args(dsn = None,
                          user = None, password = None,
                          host = None, database = None):

    # first get params from DSN
    dbport = -1
    dbhost = ""
    dbbase = ""
    dbuser = ""
    dbpasswd = ""
    dbopt = ""
    dbtty = ""
    try:
        params = string.split(dsn, ":")
        dbhost = params[0]
        dbbase = params[1]
        dbuser = params[2]
        dbpasswd = params[3]
        dbopt = params[4]
        dbtty = params[5]
    except:
        pass
    
    # override if necessary
    if user != None:
        dbuser = user

    if password != None:
        dbpasswd = password

    if database != None:
        dbbase = database

    if host != None:
        try:
            params = string.split(host, ":")
            dbhost = params[0]
            dbport = int(params[1])
        except:
            pass

    # empty host is localhost
    if dbhost == "":
        dbhost = None

    if dbuser == "":
        dbuser = None

    return (dbbase, dbhost, dbport, dbopt, dbtty, dbuser, dbpasswd)

def connect(*args, **kwargs):

    dbbase, dbhost, dbport, dbopt, dbtty, dbuser, dbpasswd = 
parse_connection_args(*args, **kwargs)

    # open the connection
        
    cnx = pg.connect(dbbase, dbhost, dbport, dbopt, dbtty, dbuser, dbpasswd)
    return pgdbCnxWithClassicDb(cnx)

if __name__ == '__main__':
    data = ( ('ernest', '[EMAIL PROTECTED]'),
             ('richard', '[EMAIL PROTECTED]'),
             ('gwright', '[EMAIL PROTECTED]'),
             ('lniven', '[EMAIL PROTECTED]'),
             ('jerry', '[EMAIL PROTECTED]'))
             
    dbiDb = connect(database = 'message_board')

    c = dbiDb.cursor()
    c.execute("CREATE TEMPORARY TABLE new_author AS "
              + "SELECT author_nickname, author_email FROM author LIMIT 0")

    classicDb = dbiDb.get_classic_db()

    classicDb.query('COPY new_author FROM stdin')
    for row in data:
        l = ("\t".join(row)) + "\n"
        classicDb.putline(l)

    classicDb.putline('\\.\n')
    classicDb.endcopy()

    del classicDb

    c.execute("INSERT INTO author (author_nickname, author_email) "
              +"SELECT author_nickname, author_email FROM new_author")

    dbiDb.commit()
    dbiDb.close()

----- End example ----------------------------------------------------------
    

-- 
Chris Hilton                                   chris-at-vindaloo-dot-com
------------------------------------------------------------------------
                "All I was doing was trying to get home from work!"
                                                 -- Rosa Parks
_______________________________________________
PyGreSQL mailing list
[email protected]
http://mailman.vex.net/mailman/listinfo/pygresql

Reply via email to