/** Emits functions for processing the database activity */ static void emitCode( Proc proc, PrintWriter outData, String tableName, String optIndex, String optUseIndex) { if (proc.outputs.size() == 0) { outData.println("Public Sub " + proc.upperFirst() + "(Connect as TConnect" + optIndex + ")"); } else if (proc.isSingle) outData.println( "Public Function " + proc.upperFirst() + "(Connect as TConnect" + optIndex + ") as Boolean"); else { outData.println("Public Sub " + proc.upperFirst() + "(Connect as TConnect)"); if (optUseIndex != "") optUseIndex = "(0)"; } if (proc.comments.size() > 0) { for (int i = 0; i < proc.comments.size(); i++) { String comment = (String) proc.comments.elementAt(i); outData.println("'" + comment); } } if (proc.outputs.size() == 0) { outData.println("' Returns no output."); } else if (proc.isSingle) { outData.println(" Dim RS as RecordSet"); outData.println(" " + proc.upperFirst() + " = False"); } else { outData.println(" Set " + proc.upperFirst() + "Cursor = new TCursor"); } outData.println(" Connect.RoutineName = \"" + proc.upperFirst() + "\""); outData.println(" Dim QD as QueryDef"); for (int index = 0; index < proc.inputs.size(); index++) { Field field = (Field) proc.inputs.elementAt(index); if (proc.isInsert) { if (field.isSequence) outData.println( " Rec" + optUseIndex + "." + field.useName() + " = getSequence(\"" + tableName + "\") ' User supplied Function for Sequences"); } if (field.type == Field.TIMESTAMP) outData.println( " Rec" + optUseIndex + "." + field.useName() + " = getTimeStamp ' User supplied Function for Time Stamp"); if (field.type == Field.USERSTAMP) outData.println( " Rec" + optUseIndex + "." + field.useName() + " = getUserStamp ' User supplied Function for User Stamp"); } outData.print(" Set QD = Connect.DB.CreateQueryDef(\"\", "); String vbline = ""; for (int i = 0; i < proc.lines.size(); i++) { String x = ""; if (i + 1 < proc.lines.size()) x = " & "; Line l = (Line) proc.lines.elementAt(i); if (l.isVar) vbline = vbline + l.line + x; else vbline = vbline + "\"" + l.line + "\"" + x; } int p; while ((p = vbline.indexOf("\" & \"")) > -1) vbline = vbline.substring(0, p) + vbline.substring(p + 5); if (proc.placeHolders.size() > 0) { for (int i = 0; i < proc.placeHolders.size(); i++) { String placeHolder = ":" + (String) proc.placeHolders.elementAt(i); String work = ""; int n = vbline.indexOf(placeHolder); if (n == -1) { outData.println("Error with placeholders " + placeHolder); break; } if (n > 0) work = vbline.substring(0, n); work = work + "?"; n += placeHolder.length(); if (n < vbline.length()) ; work = work + vbline.substring(n); vbline = work; } outData.println(vbline + ")"); for (int i = 0, pos = 0; i < proc.placeHolders.size(); i++) { String placeHolder = (String) proc.placeHolders.elementAt(i); int index = proc.indexOf(placeHolder); pos = emitInputCode(proc, index, pos, outData, optUseIndex); } } else { outData.println(vbline + ")"); for (int index = 0, pos = 0; index < proc.inputs.size(); index++) pos = emitInputCode(proc, index, pos, outData, optUseIndex); } if (proc.outputs.size() == 0) { outData.println(" QD.execute"); outData.println(" QD.Close"); } else if (proc.isSingle) { outData.println(" Set RS = QD.OpenRecordSet(dbOpenSnapShot, dbForwardOnly and dbReadOnly)"); outData.println(" If Not RS.eof Then"); for (int i = 0; i < proc.outputs.size(); i++) { Field field = (Field) proc.outputs.elementAt(i); if (field.isNull && notString(field)) { outData.println( " Rec" + optUseIndex + "." + field.useName() + "IsNull = isNull(RS!" + field.name + ")"); outData.println( " If Not Rec" + optUseIndex + "." + field.useName() + "IsNull Then Rec" + optUseIndex + "." + field.useName() + " = RS!" + field.name); } else outData.println(" Rec" + optUseIndex + "." + field.useName() + " = RS!" + field.name); } outData.println(" " + proc.upperFirst() + " = True"); outData.println(" End If"); outData.println(" RS.Close"); outData.println(" QD.Close"); } else { outData.println(" Set " + proc.upperFirst() + "Cursor.Connect = Connect"); outData.println(" Set " + proc.upperFirst() + "Cursor.QD = QD"); outData.println( " Set " + proc.upperFirst() + "Cursor.RS = " + proc.upperFirst() + "Cursor.QD.openRecordSet(dbOpenSnapShot, dbForwardOnly and dbReadOnly)"); } if (proc.isSingle) outData.println("End Function"); else outData.println("End Sub"); outData.println(); if (proc.outputs.size() > 0 && !proc.isSingle) { outData.println("Public Function next" + proc.upperFirst() + "() as Boolean"); outData.println( " If " + proc.upperFirst() + "Cursor Is Nothing Then Err.Raise 1998, \"" + proc.upperFirst() + "\""); outData.println( " " + proc.upperFirst() + "Cursor.Connect.RoutineName = \"next" + proc.upperFirst() + "\""); outData.println(" next" + proc.upperFirst() + " = False"); outData.println(" If Not " + proc.upperFirst() + "Cursor.RS.eof Then"); for (int i = 0; i < proc.outputs.size(); i++) { Field field = (Field) proc.outputs.elementAt(i); if (field.isNull && notString(field)) { outData.println( " Rec" + optUseIndex + "." + field.useName() + "IsNull = isNull(" + proc.upperFirst() + "Cursor.RS!" + field.name + ")"); outData.println( " If Not Rec" + optUseIndex + "." + field.useName() + "IsNull Then Rec" + optUseIndex + "." + field.useName() + " = " + proc.upperFirst() + "Cursor.RS!" + field.name); } else outData.println( " Rec" + optUseIndex + "." + field.useName() + " = " + proc.upperFirst() + "Cursor.RS!" + field.name); } outData.println(" next" + proc.upperFirst() + " = True"); outData.println(" " + proc.upperFirst() + "Cursor.RS.MoveNext"); outData.println(" Else"); outData.println(" " + proc.upperFirst() + "Cursor.RS.Close"); outData.println(" End If"); outData.println("End Function"); outData.println(); outData.println("Public Sub cancel" + proc.upperFirst() + "()"); outData.println( " if " + proc.upperFirst() + "Cursor.isOpen then " + proc.upperFirst() + "Cursor.Done"); outData.println("End Sub"); outData.println(); outData.println( "Public Sub load" + proc.upperFirst() + "(Connect as TConnect, Optional Max As Long)"); outData.println(" Dim AllocCount As Long"); outData.println(" AllocCount = 64"); outData.println(" ReDim Rec(0 to AllocCount)"); outData.println(" " + proc.upperFirst() + " Connect"); outData.println(" Do While next" + proc.upperFirst() + "()"); outData.println(" RecCount = RecCount + 1"); outData.println(" If RecCount > AllocCount Then"); outData.println(" AllocCount = AllocCount * 2"); outData.println(" ReDim Preserve Rec(0 to AllocCount)"); outData.println(" End If"); outData.println(" Rec(RecCount) = Rec(0)"); outData.println(" If RecCount = Max Then"); outData.println(" cancel" + proc.upperFirst() + ""); outData.println(" Exit Do"); outData.println(" End If"); outData.println(" Loop"); outData.println(" ReDim Preserve Rec(0 to RecCount)"); outData.println("End Sub"); outData.println(); } }