예제 #1
0
 /** 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();
   }
 }