//  Source File Name: UDFsrv.java  1.4
//  
//   Licensed Materials -- Property of IBM 
//  
//   (c) Copyright International Business Machines Corporation, 1999. 
//       All Rights Reserved. 
//  
//   US Government Users Restricted Rights - 
//   Use, duplication or disclosure restricted by 
//   GSA ADP Schedule Contract with IBM Corp. 

//   Sample Program UDFsrv - Java User-defined Functions 

//   Steps to run the sample: 
//   (1) create and populate the SAMPLE database (db2sampl) 
//   (2) (n)make UDFsrv 
//   (3) (n)make UDFcli 
//   (4) run UDFcli 

//   NOTES: (1) The jdk11_path database manager configuration parameter must 
//              be set 
//          (2) The CLASSPATH and shared library path environment variables 
//              must be set, as for any JDBC application. 
//          (3) Visit http://www.software.ibm.com/data/db2/java 
//              for current DB2 Java information 

//  For more information about this sample, refer to the README file. 

//  For more information on Programming in Java, refer to the  
//  "Programming in Java" section of the Application Development Guide. 

//  For more information on creating and using user-defined functions,  
//  refer to the "Object-Relational Programming" section of the  
//  Application Development Guide. 

//  For more information on building and running Java programs for DB2, 
//  refer to the "Building Java Applets and Applications" section of the  
//  Application Building Guide. 

//  For more information on the SQL language, refer to the SQL Reference. 

//   Class UDFsrv contains two methods: 
//   (1) scalarUDF 
//   (2) tableUDF 

import java.lang.*;              //  for String class 
import COM.ibm.db2.app.*;        //  UDF and associated classes 

//  the class Person is used  by the table UDF 
class  Person
{   String name;
    String job;

    Person(){name = null; job =null;};
    Person(String n , String j){name = n; job =j;};
    public String getName(){ return name;};
    public String getJob(){ return job;};
}

// ///// 
//  Java user-defined functions are in this class 
// ///// 
class UDFsrv extends UDF
{   //  the scalar UDF 
    public void
    scalarUDF(String inputString,
              int outputStrLen) throws Exception
    {   try
        {   set(2, inputString.length());
        } 
        catch (Exception e)
        {   throw e; 
        }
    }

    //  variables for the table UDF 
    String prefix;   //  just to use an input parameter 
    int    row;
    int    maxRows;
    Person[] smallStuff;    
  
    //  the table UDF 
    public void
    tableUDF (String inPrefix,	          
              String outName,
              String outJob) throws Exception
    {   switch (getCallType())
        {   case SQLUDF_TF_FIRST:
               //  do initialization which is independent of input parameters 
               break;
            case SQLUDF_TF_OPEN:
               //  do initialization valid for this return table 
               prefix = inPrefix + "_";

               smallStuff = new Person[4];
               smallStuff[0] = new Person("Sanders"  , "Mgr");
               smallStuff[1] = new Person("Pernal"   , "Sales");
               smallStuff[2] = new Person("Marenghi" , "Mgr");

               row = 1;
               maxRows = 3;
               break;
            case SQLUDF_TF_FETCH:
               if (row > maxRows)
               {   //  Set end-of-file signal and return 
                   setSQLstate ("02000");
               }
               else
               {   //  Set the current output row and increment the row number 
                   if (needToSet (2)) set (2, prefix + smallStuff[row - 1].getName());
                   if (needToSet (3)) set (3, prefix + smallStuff[row - 1].getJob());
                   row++; 
               }
               break;
            case SQLUDF_TF_CLOSE:
               break;
            case SQLUDF_TF_FINAL:
               break;
        }
    }
}