Hello, I am attempting to index a 4D (4th Dimension) located on a network with dtSearch (www.dtsearch.com). Sample code in VB, Java, C++ is provided with dtSearch and I am attempting to translate the VB code to Python. The Index Form (which indexes the database) includes a button that triggers the following VB method: ====================== Private Sub IndexButton_Click() Dim ij As Object ' Clear flags fStopPressed = False fAbortImmediately = False fIndexing = True ' Collect values from the controls Set ij = TheEngine.NewIndexJob() Dim adoDatabase As SampleAdoDataSource Set adoDatabase = New SampleAdoDataSource adoDatabase.BrowseOpen ("") Set ij.DataSourceToIndex = adoDatabase ij.IndexPath = IndexPath ij.ActionCreate = True ij.ActionAdd = True ij.CreateRelativePaths = True ij.StoredFields = StoredFields Set ij.StatusHandler = Me StopButton.Enabled = True StopImmediatelyButton.Enabled = True CloseButton.Enabled = False ij.Execute StopButton.Enabled = False StopImmediatelyButton.Enabled = False CloseButton.Enabled = True fIndexing = False Set ij.DataSourceToIndex = Nothing Set adoDatabase = Nothing If fCloseRequested Then Unload Me End If End Sub =============== How do you create an OLE IDispatch object, such as SampleAdoDataSource (the VB code to create a SampleAdoDataSource class is listed below), in Python? How should I tranlate the code between the BEGIN and END tags below? Do I need all the attributes below? Many thanks. Philippe de Rochambeau ============== VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "SampleAdoDataSource" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Attribute VB_Description = "dtSearch ADO Reader" Attribute VB_Ext_KEY = "SavedWithClassBuilder" ,"Yes" Attribute VB_Ext_KEY = "Top_Level" ,"Yes" ' Demonstrates the use of the DataSourceToIndex member of an IndexJob ' ' SampleAdoDataSource uses Active Data Objects 1.5 ' to demonstrate indexing of data sources using the dtSearch Engine. ' ' The DataSourceToIndex member of an IndexJob can be any Visual Basic object ' (or other OLE IDispatch object), that implements the following methods and properties: ' ' Methods: ' Rewind Initialize the data source so that the next GetNextDoc call will ' return the first document. ' GetNextDoc Get the next document from the data source. The document ' information is stored in the properties. GetNextDoc returns 0 ' if it succeeds, non-zero if there are no more documents. ' Properties ' DocName Name of the document. Can be any legal Win32 filename. ' DocDisplayName A user-friendly version of the filename. Usually this will be ' blank, but in this example the message subject is used ' since the DocName for a message is an incomprehensible hex string. ' This is what will appear in dtSearch search results lists if the ' document is retrieved in a search. ' DocModifiedDate The date that the document was last modified. ' DocText Text of the document to be indexed. ' DocFields Fields in the document to be indexed Option Explicit Public DocName As String Public DocDisplayName As String Public DocModifiedDate As Variant Public DocCreatedDate As Variant Public DocText As String Public DocFields As String ' By default, all of the fields are indexed using both the DocText ' property and the DocFields property. These flags provide a way to override ' this behavior Public fSkipDocFields As Boolean Public fSkipDocText As Boolean Dim cn As ADODB.Connection Dim Tables() As String Dim tableCount As Long Dim iTable As Long Dim iRow As Long Dim fLogin As Integer Dim rs As ADODB.Recordset Dim iRowIdField As Long Private Sub AddTable(tableName As String) tableCount = tableCount + 1 If tableCount > UBound(Tables, 1) Then ReDim Preserve Tables(tableCount * 2) As String End If Tables(tableCount) = tableName End Sub Private Sub Logoff() If Not fLogin Then Exit Sub End If cn.Close fLogin = False End Sub Public Function BrowseOpen(ByVal NameToOpen As String) As Long If fLogin Then Logoff End If On Error GoTo BadOpen Set cn = Nothing Set cn = New ADODB.Connection cn.Properties("Prompt") = adPromptAlways cn.ConnectionString = NameToOpen cn.Open GetTableNames fLogin = True BrowseOpen = False Exit Function BadOpen: fLogin = False BrowseOpen = False End Function ' Build a list of the tables in the database. This is used ' to iterate over each of the tables in GetNextDoc Private Sub GetTableNames() tableCount = 0 iTable = 0 ReDim Tables(20) As String Dim rsSchema As ADODB.Recordset Set rsSchema = cn.OpenSchema(adSchemaTables) Do Until rsSchema.EOF Dim t As String t = rsSchema!TABLE_TYPE If (StrComp(t, "TABLE", vbTextCompare) = 0) Then AddTable (rsSchema!TABLE_NAME) End If rsSchema.MoveNext Loop rsSchema.Close End Sub Private Sub NextTable() On Error GoTo AdoError If (iTable = tableCount) Then Exit Sub End If iTable = iTable + 1 iRow = 1 Dim cmd As String cmd = "Select * from " & Chr$(34) & Tables(iTable) & Chr$(34) Set rs = cn.Execute(cmd) Dim f As ADODB.Field Dim fields As ADODB.fields Set fields = rs.fields iRowIdField = 1 'Dim i As Integer 'For i = 1 To fields.Count ' Set f = fields.item(i - 1) ' If (f.Properties("IsAutoIncrement") Or (f.Attributes And adFldRowID)) Then ' iRowIdField = i ' End If 'Next i Exit Sub AdoError: End Sub Private Function ValueToString(v As Variant) As String On Error GoTo BadVal If (IsNull(v)) Then ValueToString = "" Else ValueToString = CStr(v) End If Exit Function BadVal: ValueToString = "" End Function Private Sub GetRowInfo() 'On Error Resume Next DocName = Tables(iTable) + "#" Dim fields As ADODB.fields Set fields = rs.fields Dim val As Variant If (iRowIdField = 0) Then DocName = DocName + Str$(iRow) Else val = fields(iRowIdField - 1).Value DocName = DocName + fields(iRowIdField - 1).Name + "=" + ValueToString(val) End If DocModifiedDate = Now DocCreatedDate = Now DocText = "" DocFields = "" Dim f As ADODB.Field Dim i As Integer Dim fieldValue As String For i = 1 To fields.Count Set f = fields(i - 1) fieldValue = "" ' make sure old values are not reused fieldValue = ValueToString(f.Value) ' Note: after being referenced once in ValueToString, f.Value may now be null; ' inspected the value in the VB debugger can also set it to null. DocText = DocText & f.Name & " = " & fieldValue & Chr$(13) & Chr$(10) ' DocFields is a series of {fieldname, fieldValue} pairs delimited with the chr$(9) (tab) ' character. To contruct this, just make sure that the field text does not contain ' any tab characters (here we convert them to spaces) While InStr(fieldValue, Chr$(9)) > 0 Dim iTab iTab = InStr(fieldValue, Chr$(9)) Mid$(fieldValue, iTab, 1) = " " Wend If (Len(fieldValue) = 0) Then fieldValue = " " End If DocFields = DocFields & f.Name & Chr$(9) & fieldValue & Chr$(9) Next i If (fSkipDocText) Then DocText = "" End If If (fSkipDocFields) Then DocFields = "" End If End Sub Public Function GetNextDoc() As Long On Error Resume Next If (iTable = 0) Then NextTable End If While (rs.EOF And (iTable < tableCount)) NextTable Wend If (rs.EOF Or (iTable = 0)) Then GetNextDoc = -1 ' no more documents Else GetRowInfo rs.MoveNext iRow = iRow + 1 GetNextDoc = 0 End If End Function Public Sub Rewind() iTable = 0 Set rs = Nothing End Sub =========================== _______________________________________________ ActivePython mailing list [EMAIL PROTECTED] http://listserv.ActiveState.com/mailman/listinfo/activepython