Beispiel #1
0
/*
 * Class:     amzi_ls_ARulesLogicServer
 * Method:    UnifyParm
 * Signature: (IJ)Z
 */
JNIEXPORT jboolean JNICALL Java_amzi_ls_ARulesLogicServer_UnifyParm
  (JNIEnv * jenv, jobject jobj, jint iarg, jlong term)
{
   TF tf;

   GET_EID(e);
   tf = lsUnifyParm(e, (int)iarg, cTERM, &term);
   switch(tf)
   {
   case TRUE:
   case FALSE:
      return (jboolean)tf;
   default: amzi_error(jenv, e, "UnifyParm"); return 0;
   }
}
Beispiel #2
0
TF EXPFUNC p_db_connect(ENGid eid)
{
   HDBC hdbc;
   char szDataSource[80];
   char szUserID[40];
   char szPassword[40];

   if (pVAR != lsGetParmType(eid, 1))
   {
      lsErrRaise(eid, "db_connect instantiation error: arg 1 must be var");
      return FALSE;
   }
   g_lsRC = lsGetParm(eid, 2, cSTR, szDataSource);
   if (g_lsRC != OK) goto LS_ERROR;
   g_lsRC = lsGetParm(eid, 3, cSTR, szUserID);
   if (g_lsRC != OK) goto LS_ERROR;
   g_lsRC = lsGetParm(eid, 4, cSTR, szPassword);
   if (g_lsRC != OK) goto LS_ERROR;

   g_RC = SQLAllocConnect(g_hEnv, &hdbc);
   /* set up error handler */
   g_hDBC = hdbc;
   g_hSTMT = SQL_NULL_HSTMT;
   g_eid = eid;
   ERROR_CHK("SQLAllocConnect");

   // Added this line to get around erroneous messages:
   // S1010:[Microsoft][ODBC SQL Server Driver]Function sequence error 
   // Fix from MS Knowledge Article 179226
   // SQL_PRESERVE_CURSORS - note new name in actual call
   // This only applies to SQL Server, so hopefully, nothing bad will
   // happen if it fails.

   g_RC = SQLSetConnectOption(hdbc, SQL_COPT_SS_PRESERVE_CURSORS, NULL);

   g_RC = SQLConnect(hdbc,
         (UCHAR*)szDataSource, SQL_NTS,
         (UCHAR*)szUserID, SQL_NTS,
         (UCHAR*)szPassword, SQL_NTS);
   ERROR_CHK("SQLConnect");

   lsUnifyParm(eid, 1, cADDR, &hdbc);
   return TRUE;
LS_ERROR:
   return(lserror());
ODBC_ERROR:
   return FALSE;
}
Beispiel #3
0
/*
 * Class:     amzi_ls_ARulesLogicServer
 * Method:    UnifyAtomParm
 * Signature: (ILjava/lang/String;)Z
 */
JNIEXPORT jboolean JNICALL Java_amzi_ls_ARulesLogicServer_UnifyAtomParm
  (JNIEnv * jenv, jobject jobj, jint iarg, jstring jstr)
{
   TF tf;
   aCHAR* str;

   GET_EID(e);
   str = JtoC(jenv, jstr);
   tf = lsUnifyParm(e, (int)iarg, cWATOM, str);
   delete[] str;

   switch(tf)
   {
   case TRUE:
   case FALSE:
      return (jboolean)tf;
   default: amzi_error(jenv, e, "UnifyAtomParm"); return 0;
   }
}
AMZIFUNC cv_string_file ( ENGid	Engine )
   {
	char *			String ;
	characters		FileName [ 1024 ] ;
	int			Length ;
	register FILE *		fp ;
	


	// Retrieve the filename
	lsGetParm ( Engine, 2, cSTR, FileName ) ;

	// Open the file (in binary mode, otherwise file length will be greater
	// than bytes read, since CRLF are converted)
	if ( ( fp = fopen( FileName, "rb" ) )  ==  NULL )
		return( FALSE ) ;

	Length = FileLength( fp ) ;
	String = ( char * ) malloc( Length + 1 ) ;

	// Check if we are running out of memory
	if ( String  ==  NULL )
	   {
		fclose ( fp ) ;
		return ( FALSE ) ;
	     }

	// Read the file then unify the result
	fread( String, 1, Length, fp ) ;
	fclose( fp ) ;

	String [ Length ] = '\0' ;

	lsUnifyParm ( Engine, 1, cSTR, String ) ;
	free( String ) ;

	return( TRUE ) ;
     }
Beispiel #5
0
TF EXPFUNC p_db_fetch(ENGid eid)
{
   QUERY* pq;
   HSTMT  hstmt;
   TERM   tcols;
   TERM   t;
   COL*   pCol;

#ifdef _DEBUG
TERM xt1, xt2;
char xbuf1[512], xbuf2[512];
#endif

   if (pVAR != lsGetParmType(eid, 2))
   {
      lsErrRaise(eid, "db_fetch instantiation error: arg 2 must be var");
      return FALSE;
   }

   g_lsRC = lsGetParm(eid, 1, cADDR, &pq);
   if (g_lsRC != OK) goto LS_ERROR;
   hstmt = pq->hstmt;
   
   /* set up error handler */
   g_hSTMT = hstmt;
   g_eid = eid;


   if ( SQL_NO_DATA_FOUND == (g_RC = SQLFetch(hstmt)) )
   {
      DUMPLOG("no data found");
      query_del(pq);
      return FALSE;
   }
   ERROR_CHK("SQLFetch");
   DUMPLOG("found data");

   g_lsRC = lsMakeList(eid, &tcols);
   if (g_lsRC != OK) goto LS_ERROR;

   for (pCol = pq->clist; pCol != NULL; pCol = pCol->next)
   {
      switch(pCol->pdtype)
      {
      case pdATOM:
         g_lsRC = lsMakeAtom(eid, &t, pCol->s);
         if (g_lsRC != OK) goto LS_ERROR;
         break;
      case pdSTR:
         g_lsRC = lsMakeStr(eid, &t, pCol->s);
         if (g_lsRC != OK) goto LS_ERROR;
         break;
      case pdINT:
         g_lsRC = lsMakeInt(eid, &t, pCol->i);
         if (g_lsRC != OK) goto LS_ERROR;
         break;
      case pdFLOAT:
         g_lsRC = lsMakeFloat(eid, &t, pCol->f);
         if (g_lsRC != OK) goto LS_ERROR;
         break;
      case pdDOUBLE:
         g_lsRC = lsMakeFloat(eid, &t, pCol->g);
         if (g_lsRC != OK) goto LS_ERROR;
         break;
      case pdDATE:
         g_lsRC = lsMakeFA(eid, &t, "date", 3);
         if (g_lsRC != OK) goto LS_ERROR;
         lsUnifyArg(eid, &t, 1, cSHORT, &(pCol->d->year));
         lsUnifyArg(eid, &t, 2, cSHORT, &(pCol->d->month));
         lsUnifyArg(eid, &t, 3, cSHORT, &(pCol->d->day));
         break;
      case pdTIME:
         g_lsRC = lsMakeFA(eid, &t, "time", 3);
         if (g_lsRC != OK) goto LS_ERROR;
         lsUnifyArg(eid, &t, 1, cSHORT, &(pCol->t->hour));
         lsUnifyArg(eid, &t, 2, cSHORT, &(pCol->t->minute));
         lsUnifyArg(eid, &t, 3, cSHORT, &(pCol->t->second));
         break;
      default:
         messout("Unsupported Prolog type for ODBC fetch");
      }
      g_lsRC = lsPushList(eid, &tcols, t);
      if (g_lsRC != OK) return(lserror());
   }

/* #ifdef _DEBUG
lsGetParm(eid, 2, cTERM, &xt1);
lsTermToStrQ(eid, xt1, xbuf1, 500);
lsTermToStrQ(eid, xt2, xbuf2, 500);
#endif */

   lsUnifyParm(eid, 2, cTERM, &tcols);

   return TRUE;
LS_ERROR:
   return(lserror());
ODBC_ERROR:
   return FALSE;
}
Beispiel #6
0
TF EXPFUNC p_db_query(ENGid eid)
/* db_query/5
   ex.
   db_query(HConnect, PQuery,
      $select mother, father from person where name = ?$,
      ['Someones Name'],
      [string, string]). */
{
   HSTMT   hstmt;
   HDBC    hdbc;
   char*   sQ = NULL;
   int     iParm = 1;
   int     iCol = 1;
   TERM    tParms, tCols;
   char*   sBuf = NULL;
   char    sType[80];
   TERM    t;
   pTYPE   ptyp;
   QUERY*  pq;
   char*   s;
   long    len;
   long*   pl;
   float*  pf;
   double* pd;
   long    i;
   //float   f;
   double  g;
   DATE_STRUCT* pdate;
   TIME_STRUCT* ptime;
   char   sMsg[512];
#ifdef _DEBUG
char xbuf1[512], xbuf2[512];
#endif

   if (pVAR != lsGetParmType(eid, 2))
   {
      lsErrRaise(eid, "db_query instantiation error: arg 2 must be var");
      return FALSE;
   }

   /* create stmt structure */

   pq = query_new();

   /* add stmt handle to structure */

   g_lsRC = lsGetParm(eid, 1, cADDR, &hdbc);
   if (g_lsRC != OK) goto LS_ERROR;

/* #ifdef _DEBUG
xtest(hdbc);
#endif */

   g_RC = SQLAllocStmt(hdbc, &hstmt);
   /* set up error handler */
   g_hDBC = hdbc;
   g_hSTMT = hstmt;
   g_eid = eid;
   ERROR_CHK("SQLAllocStmt");

   pq->hstmt = hstmt;

   /* get query string from Prolog */

   sQ = (char*)malloc(lsStrParmLen(eid, 3)+1);
   g_lsRC = lsGetParm(eid, 3, cSTR, sQ);
   if (g_lsRC != OK) goto LS_ERROR;

   /* prepare SQL query */

   //g_RC = SQLPrepare(hstmt, (UCHAR*)sQ, SQL_NTS);
   //errchk("lsODBC");

   /* get parameter list from Prolog */

   g_lsRC = lsGetParm(eid, 4, cTERM, &tParms);
   if (g_lsRC != OK) goto LS_ERROR;

#ifdef _DEBUG
lsTermToStrQ(eid, tParms, xbuf1, 500);
#endif

   /* walk input list */

   while (OK == lsPopList(eid, &tParms, cTERM, &t))
   {
      /* bind parameter for each */
      ptyp = lsGetTermType(eid, t);
      switch(ptyp)
      {
      case pATOM:
      case pSTR:
         sBuf = (char*)malloc(lsStrTermLen(eid, t) + 1);
         g_lsRC = lsGetTerm(eid, t, cSTR, sBuf);
         if (g_lsRC != OK) goto LS_ERROR;
         len = strlen(sBuf) + 1;
         s = query_addstrparm(pq, sBuf);
         g_ParmSize = SQL_NTS;
         g_RC = SQLBindParameter(hstmt, (UWORD)iParm, SQL_PARAM_INPUT, SQL_C_CHAR,
               SQL_CHAR, (UDWORD)len, 0, s, (SDWORD)len, &g_ParmSize);
         ERROR_CHK("SQLBindParameter");
         break;
      case pINT:
         g_lsRC = lsGetTerm(eid, t, cLONG, &i);
         if (g_lsRC != OK) goto LS_ERROR;
         pl = query_addintparm(pq, i);
         g_ParmSize = 0;
         g_RC = SQLBindParameter(hstmt, (UWORD)iParm, SQL_PARAM_INPUT, SQL_C_SLONG,
               SQL_INTEGER, 4, 0, pl, 4, &g_ParmSize);
         ERROR_CHK("SQLBindParameter");
         break;
      case pFLOAT:
         g_lsRC = lsGetTerm(eid, t, cDOUBLE, &g);
         if (g_lsRC != OK) goto LS_ERROR;
         pd = query_adddoubleparm(pq, g);
         g_ParmSize = 0;
         g_RC = SQLBindParameter(hstmt, (UWORD)iParm, SQL_PARAM_INPUT, SQL_C_DOUBLE,
               SQL_DOUBLE, 8, 0, pd, 8, &g_ParmSize);
         ERROR_CHK("SQLBindParameter");
         break;
      default:
         messout("Unsupported Prolog type for ODBC input");
      }
      iParm++;
   }

   /* get column list from Prolog */

   g_lsRC = lsGetParm(eid, 5, cTERM, &tCols);
   if (g_lsRC != OK) goto LS_ERROR;
#ifdef _DEBUG
lsTermToStrQ(eid, tCols, xbuf2, 500);
#endif
   /* walk output list */

   while (OK == lsPopList(eid, &tCols, cSTR, sType))
   {
      /* bind col for each */
      switch(sType[0])
      {
      case 'a':
         len = 1 + atol(&sType[1]);
         s = query_addstrcol(pq, pdATOM, len);
         g_ColSize = SQL_NO_TOTAL;
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_CHAR, s,
               len, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;        
      case 's':
         len = 1 + atol(&sType[1]);
         s = query_addstrcol(pq, pdSTR, len);
         g_ColSize = SQL_NO_TOTAL;
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_CHAR, s,
               len, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;        
      case 'i':
         pl = query_addintcol(pq);
         g_ColSize = 0;
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_SLONG, pl,
               4, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;
      case 'f':
         pf = query_addfloatcol(pq);
         g_ColSize = 0;
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_FLOAT, pf,
               4, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;
      case 'g':
         pd = query_adddoublecol(pq);
         g_ColSize = 0;
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_DOUBLE, pd,
               8, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;
      case 'd':
         pdate = query_adddatecol(pq);
         g_ColSize  = 0;  // ignored for date
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_DATE, pdate,
               6, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;
      case 't':
         ptime = query_addtimecol(pq);
         g_RC = SQLBindCol(hstmt, (UWORD)iCol, SQL_C_TIME, ptime,
               6, &g_ColSize);
         ERROR_CHK("SQLBindCol");
         break;
      default:
         sprintf(sMsg,
            "Unsupported Prolog type '%c' for ODBC output", sType[0]);
         messout(sMsg);
      }
      iCol++;
   }

   /* execute query and return pointer to query */

   //g_RC = SQLExecute(hstmt);
   //errchk("lsODBC");

   g_RC = SQLExecDirect(hstmt, (UCHAR*)sQ, SQL_NTS);
   ERROR_CHK("SQLExecDirect");

   lsUnifyParm(eid, 2, cADDR, &pq);
   if (sQ != NULL) free(sQ);
   if (sBuf != NULL) free(sBuf);
   return TRUE;
LS_ERROR:
   if (sQ != NULL) free(sQ);
   if (sBuf != NULL) free(sBuf);
   return(lserror());
ODBC_ERROR:
   if (sQ != NULL) free(sQ);
   if (sBuf != NULL) free(sBuf);
   return FALSE;
}