from win32com.client import Dispatch, DispatchWithEvents, constants
import pythoncom
import os
import time

finished = 0 # Flag for the wait loop from (3) to test

class ADOEvents: # event handler class
    def OnWillConnect(self, str, user, pw, opt, sts, cn):
        # Must have this event, as if it is not handled, ADO assumes the
        # operation is cancelled, and raises an error (Operation cancelled
        # by the user)
        pass
    def OnConnectComplete(self, error, status, connection):
        # Assume no errors, until we have the basic stuff
        # working. Now, "connection" should be an open
        # connection to my data source
        # Do the "something" from (2). For now, just
        # print the connection data source
        print "connection is", connection
        print "Connected to", connection.Properties("Data Source")
        # OK, our work is done. Let the main loop know
        global finished
        finished = 1
    def OnCommitTransComplete(self, pError, adStatus, pConnection):
        pass
    def OnInfoMessage(self, pError, adStatus, pConnection):
        pass
    def OnDisconnect(self, adStatus, pConnection):
        pass
    def OnBeginTransComplete(self, TransactionLevel, pError, adStatus, pConnection):
        pass
    def OnRollbackTransComplete(self, pError, adStatus, pConnection):
        pass
    def OnExecuteComplete(self, RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection):
        pass
    def OnWillExecute(self, Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection):
        pass

def TestConnection(dbname):
    # Create the ADO connection object, and link the event
    # handlers into it
    c = DispatchWithEvents("ADODB.Connection", ADOEvents)

    # Initiate the asynchronous open
    dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=%s" % dbname
    user = "system"
    pw = "manager"
    c.Open(dsn, user, pw, constants.adAsyncConnect)

    # Sit in a loop, until our event handler (above) sets the
    # "finished" flag or we time out.
    end_time = time.clock() + 10
    while time.clock() < end_time:
        # Pump messages so that COM gets a look in
        pythoncom.PumpWaitingMessages()
    if not finished:
        print "XXX - Failed to connect!"

def Test():
    import testAccess
    try:
        testAccess.GenerateSupport()
    except pythoncom.com_error:
        print "*** Can not import the MSAccess type libraries - tests skipped"
        return
    dbname = testAccess.CreateTestAccessDatabase()
    try:
        TestConnection(dbname)
    finally:
        os.unlink(dbname)

if __name__=='__main__':
    Test()
