#define _POSIX_C_SOURCE 199509L
 
+#include <stdio.h>
 #include <string.h>
 #include <ctype.h>
 
 
 #include "param.h"
 
+static void Param_rollback(int *);
+
 static void Param_strerror(const Param *, const char *);
 
 int conParam(Param *my)
 {
        my->strerror = NULL;
+       my->user = "daq@db-hades.gsi.de";
+       my->passwd = "daqall";
        return 0;
 }
 
 
 int Param_getIntArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, unsigned long int *val)
 {
-       int retVal;
+       int retVal = 0;
        int i;
        char *endptr;
 
-       EXEC SQL WHENEVER SQLERROR DO Param_strerror(my, "Some Oracle error occured.\n");
+       EXEC SQL WHENEVER SQLERROR DO Param_strerror(my, sqlca.sqlerrm.sqlerrmc);
+       EXEC SQL WHENEVER SQLERROR DO Param_rollback(&retVal);
+
        EXEC SQL BEGIN DECLARE SECTION;
-       char value[PARAM_MAX_NVALS][PARAM_MAX_VALUE_LEN];
+       const char* un;
+       const char* pw;
        char sqlname[PARAM_MAX_NAME_LEN];
        char sqlidx[PARAM_MAX_NAME_LEN];
+       char value[PARAM_MAX_NVALS][PARAM_MAX_VALUE_LEN];
        EXEC SQL END DECLARE SECTION;
 
-       EXEC SQL SELECT value INTO :value FROM daq.params WHERE name = ':sqlname' AND idx = ':sqlidx' ORDER BY seq_num;
+       for(i = 0 ; i <= strlen(name) ; i++) {
+               sqlname[i] = tolower(name[i]);
+       }
+       for(i = 0 ; i <= strlen(idx) ; i++) {
+               sqlidx[i] = tolower(idx[i]);
+       }
+       un = my->user;
+       pw = my->passwd;
+
+       EXEC SQL CONNECT :un IDENTIFIED BY :pw;
+       EXEC SQL SELECT VALUE INTO :value FROM DAQ.PARAMS WHERE NAME = :sqlname AND IDX = :sqlidx ORDER BY SEQ_NUM;
+       printf("Number of result rows: %d.\n", sqlca.sqlerrd[2]);
        *rows = sqlca.sqlerrd[2];
 
        if (*rows > maxrows) {
-               Param_strerror(my, "Result has to many rows. Returning only 'maxrows' rows.\n");
-               for (i = 0 ; i < maxrows ; i++) {
-                       val[i] = strtoul(value[i], &endptr, NULL);
-                       if(*endptr != '\0') {
-                               Param_strerror(my, "Value seems to be no integer.\n");
-                               retVal = -1;
-                       }
-               }
-               retVal = -1;
-       } else {
-               for (i = 0 ; i < *rows ; i++) {
-                       val[i] = strtoul(value[i], &endptr, NULL);
-                       if(*endptr != '\0') {
-                               Param_strerror(my, "Value seems to be no integer.\n");
-                               retVal = -1;
-                       }
-               }
-               for (i = *rows ; i < maxrows ; i++) {
-                       val[i] = 0;
+               *rows = maxrows;
+       }
+       for (i = 0 ; i < *rows ; i++) {
+               int j = PARAM_MAX_VALUE_LEN - 1;
+               while(value[i][--j] == ' ');
+               value[i][j + 1] = '\0';
+               val[i] = strtoul(value[i], &endptr, NULL);
+               if(*endptr != '\0') {
+                       Param_strerror(my, "Value seems to be no integer.\n");
+                       *rows = 0;
+                       return -1;
                }
        }
-
-       for(i = 0 ; i < PARAM_MAX_NVALS ; i++) {
-               free(value[i]);
+       for (i = *rows ; i < maxrows ; i++) {
+               val[i] = 0;
        }
-       retVal = 0;
+
+       EXEC SQL COMMIT RELEASE;
+       return retVal;
 }
 
 int Param_getStringArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val)
 {
-       int retVal;
+       int retVal = 0;
        int i;
 
-       EXEC SQL WHENEVER SQLERROR DO Param_strerror(my, "Some Oracle error occured.\n");
+       EXEC SQL WHENEVER SQLERROR DO Param_strerror(my, sqlca.sqlerrm.sqlerrmc);
+       EXEC SQL WHENEVER SQLERROR DO Param_rollback(&retVal);
+
        EXEC SQL BEGIN DECLARE SECTION;
-       char value[PARAM_MAX_NVALS][PARAM_MAX_VALUE_LEN];
+       const char* un;
+       const char* pw;
        char sqlname[PARAM_MAX_NAME_LEN];
        char sqlidx[PARAM_MAX_NAME_LEN];
+       char value[PARAM_MAX_NVALS][PARAM_MAX_VALUE_LEN];
        EXEC SQL END DECLARE SECTION;
 
-       EXEC SQL SELECT value INTO :value FROM daq.params WHERE name = ':sqlname' AND idx = ':sqlidx' ORDER BY seq_num;
+       for(i = 0 ; i <= strlen(name) ; i++) {
+               sqlname[i] = tolower(name[i]);
+       }
+       for(i = 0 ; i <= strlen(idx) ; i++) {
+               sqlidx[i] = tolower(idx[i]);
+       }
+       un = my->user;
+       pw = my->passwd;
+
+       EXEC SQL CONNECT :un IDENTIFIED BY :pw;
+
+       EXEC SQL SELECT VALUE INTO :value FROM DAQ.PARAMS WHERE NAME = :sqlname AND IDX = :sqlidx ORDER BY SEQ_NUM;
+       printf("Number of result rows: %d.\n", sqlca.sqlerrd[2]);
        *rows = sqlca.sqlerrd[2];
 
        if (*rows > maxrows) {
-               Param_strerror(my, "Result has to many rows. Returning only 'maxrows' rows.\n");
-               for (i = 0 ; i < maxrows ; i++) {
-                       strcpy(val[i], value[i]);
-               }
-               retVal = -1;
-       } else {
-               for (i = 0 ; i < *rows ; i++) {
-                       strcpy(val[i], value[i]);
-               }
-               for (i = *rows ; i < maxrows ; i++) {
-                       val[i] = NULL;
-               }
-               retVal = 0;
+               *rows = maxrows;
        }
-
-       for(i = 0 ; i < PARAM_MAX_NVALS ; i++) {
-               free(value[i]);
+       for (i = 0 ; i < *rows ; i++) {
+               int j = PARAM_MAX_VALUE_LEN - 1;
+               while(value[i][--j] == ' ');
+               value[i][j + 1] = '\0';
+               strcpy(val[i], value[i]);
+       }
+       for (i = *rows ; i < maxrows ; i++) {
+               val[i] = NULL;
        }
+
+       EXEC SQL COMMIT RELEASE;
        return retVal;
 }
 
        }
 }
 
+static void Param_rollback(int *retVal) {
+       *retVal = -1;
+       EXEC SQL ROLLBACK RELEASE;
+}
+