]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/myingres.sc
Lets generate ingres code by calling esqlcc and not esqlc as we want c++ code.
[bacula/bacula] / bacula / src / cats / myingres.sc
index 2a61fe20c0eb7a5a851f6279789d0d7011323a52..9f7f380ec0588016e5ac109e6b6c68a18cbcef3c 100644 (file)
@@ -33,23 +33,24 @@ short INGgetCols(const char *stmt)
    sqlda->sqln = number;
    
    stmtd = (char*)malloc(strlen(stmt)+1);
-   strncpy(stmtd,stmt,strlen(stmt)+1);
+   bstrncpy(stmtd,stmt,strlen(stmt)+1);
      
    EXEC SQL PREPARE s1 from :stmtd;
-   if (INGcheck() < 0 ) {
+   if (INGcheck() < 0) {
       free(stmtd);
       free(sqlda);
       return -1;
    }
    EXEC SQL DESCRIBE s1 into :sqlda;
-   if (INGcheck() < 0 ) {
+   if (INGcheck() < 0) {
       free(stmtd);
       free(sqlda);
       return -1;
    }
      
    number = sqlda->sqld;
-   free(stmtd); free(sqlda);
+   free(stmtd);
+   free(sqlda);
    return number;
 }
 
@@ -68,7 +69,7 @@ IISQLDA *INGgetDescriptor(short numCols, const char *stmt)
    sqlda->sqln = numCols;
    
    stmtd = (char *)malloc(strlen(stmt)+1);
-   strncpy(stmtd,stmt,strlen(stmt)+1);
+   bstrncpy(stmtd,stmt,strlen(stmt)+1);
   
    EXEC SQL PREPARE s2 INTO :sqlda FROM :stmtd;
   
@@ -103,8 +104,12 @@ void INGfreeDescriptor(IISQLDA *sqlda)
    int i;
 
    for (i = 0; i < sqlda->sqld; ++i) {
-      free(sqlda->sqlvar[i].sqldata);
-      free(sqlda->sqlvar[i].sqlind);
+      if (sqlda->sqlvar[i].sqldata) {
+         free(sqlda->sqlvar[i].sqldata);
+      }
+      if (sqlda->sqlvar[i].sqlind) {
+         free(sqlda->sqlvar[i].sqlind);
+      }
    }
    free(sqlda);
    sqlda = NULL;
@@ -146,7 +151,7 @@ INGresult *INGgetINGresult(IISQLDA *sqlda)
    result->first_row = NULL;
    result->status = ING_EMPTY_RESULT;
    result->act_row = NULL;
-   strcpy(result->numrowstring,"");
+   memset(result->numrowstring, 0, sizeof(result->numrowstring));
    
    if (result->num_fields) {
       result->fields = (INGRES_FIELD *)malloc(sizeof(INGRES_FIELD) * result->num_fields);
@@ -154,7 +159,7 @@ INGresult *INGgetINGresult(IISQLDA *sqlda)
 
       for (i = 0; i < result->num_fields; ++i) {
          memset(result->fields[i].name, 0, 34);
-         strncpy(result->fields[i].name, sqlda->sqlvar[i].sqlname.sqlnamec, sqlda->sqlvar[i].sqlname.sqlnamel);
+         bstrncpy(result->fields[i].name, sqlda->sqlvar[i].sqlname.sqlnamec, sqlda->sqlvar[i].sqlname.sqlnamel);
          result->fields[i].max_length = INGgetTypeSize(&sqlda->sqlvar[i]);
          result->fields[i].type = abs(sqlda->sqlvar[i].sqltype);
          result->fields[i].flags = (abs(sqlda->sqlvar[i].sqltype)<0) ? 1 : 0;
@@ -172,7 +177,7 @@ void INGfreeINGresult(INGresult *ing_res)
    /*
     * Free all rows and fields, then res, not descriptor!
     */
-   if (ing_res != NULL ) {
+   if (ing_res != NULL) {
       /*
        * Use of rows is a nasty workaround til I find the reason,
        * why aggregates like max() don't work
@@ -232,13 +237,13 @@ ING_ROW *INGgetRowSpace(INGresult *ing_res)
          memset(vars[i].sqldata, 0, 20);
          switch (sqlda->sqlvar[i].sqllen) {
          case 2:
-            snprintf(vars[i].sqldata, 20, "%d",*(short*)sqlda->sqlvar[i].sqldata);
+            bsnprintf(vars[i].sqldata, 20, "%d",*(short*)sqlda->sqlvar[i].sqldata);
             break;
          case 4:
-            snprintf(vars[i].sqldata, 20, "%d",*(int*)sqlda->sqlvar[i].sqldata);
+            bsnprintf(vars[i].sqldata, 20, "%ld",*(int*)sqlda->sqlvar[i].sqldata);
             break;
          case 8:
-            snprintf(vars[i].sqldata, 20, "%d",*(long*)sqlda->sqlvar[i].sqldata);
+            bsnprintf(vars[i].sqldata, 20, "%lld",*(long*)sqlda->sqlvar[i].sqldata);
             break;
          }
          break;
@@ -256,7 +261,11 @@ ING_ROW *INGgetRowSpace(INGresult *ing_res)
          break;
       }
       vars[i].sqlind = (short *)malloc(sizeof(short));
-      memcpy(vars[i].sqlind,sqlda->sqlvar[i].sqlind,sizeof(short));
+      if (sqlda->sqlvar[i].sqlind) {
+         memcpy(vars[i].sqlind,sqlda->sqlvar[i].sqlind,sizeof(short));
+      } else {
+         *vars[i].sqlind = 0;
+      }
    }
    
    return row;
@@ -271,9 +280,13 @@ void INGfreeRowSpace(ING_ROW *row, IISQLDA *sqlda)
       return;
    }
 
-   for (i = 0; i < sqlda->sqld; ++i ) {
-      free(row->sqlvar[i].sqldata);
-      free(row->sqlvar[i].sqlind);
+   for (i = 0; i < sqlda->sqld; ++i) {
+      if (row->sqlvar[i].sqldata) {
+         free(row->sqlvar[i].sqldata);
+      }
+      if (row->sqlvar[i].sqlind) {
+         free(row->sqlvar[i].sqlind);
+      }
    }
    free(row->sqlvar);
    free(row);
@@ -301,10 +314,12 @@ int INGfetchAll(const char *stmt, INGresult *ing_res)
    /* for (linecount = 0; sqlca.sqlcode == 0; ++linecount) */
    while(sqlca.sqlcode == 0) {
       EXEC SQL FETCH c2 USING DESCRIPTOR :desc;
-      if ((check = INGcheck()) < 0) { return check;}
+      if ((check = INGcheck()) < 0) {
+         EXEC SQL CLOSE c2;
+         return check;
+      }
 
-      if (sqlca.sqlcode == 0)
-      {
+      if (sqlca.sqlcode == 0) {
          row = INGgetRowSpace(ing_res); /* alloc space for fetched row */
             
          /*
@@ -384,7 +399,7 @@ int INGnfields(const INGresult *res)
 
 char *INGfname(const INGresult *res, int column_number)
 {
-   if ( (column_number > res->num_fields) || (column_number < 0) ) {
+   if ((column_number > res->num_fields) || (column_number < 0)) {
       return NULL;
    } else {
       return res->fields[column_number].name;
@@ -405,7 +420,7 @@ int INGexec(INGconn *conn, const char *query)
    EXEC SQL END DECLARE SECTION;
    
    stmt = (char *)malloc(strlen(query)+1);
-   strncpy(stmt,query,strlen(query)+1);
+   bstrncpy(stmt,query,strlen(query)+1);
    rowcount = -1;
 
    EXEC SQL EXECUTE IMMEDIATE :stmt;
@@ -470,14 +485,14 @@ INGconn *INGconnectDB(char *dbname, char *user, char *passwd)
    int sess_id;
    EXEC SQL END DECLARE SECTION;
 
-   strcpy(ingdbname,dbname);
+   bstrncpy(ingdbname, dbname, sizeof(ingdbname));
    
    if (user != NULL) {
-      strcpy(ingdbuser,user);
-      if ( passwd != NULL) {
-         strcpy(ingdbpasw,passwd);
+      bstrncpy(ingdbuser, user, sizeof(ingdbuser));
+      if (passwd != NULL) {
+         bstrncpy(ingdbpasw, passwd, sizeof(ingdbpasw));
       } else {
-         strcpy(ingdbpasw, "");
+         memset(ingdbpasw, 0, sizeof(ingdbpasw));
       }
       EXEC SQL CONNECT
          :ingdbname
@@ -490,10 +505,10 @@ INGconn *INGconnectDB(char *dbname, char *user, char *passwd)
    EXEC SQL INQUIRE_SQL(:conn_name = connection_name);
    EXEC SQL INQUIRE_SQL(:sess_id = session);
    
-   strncpy(dbconn->dbname, ingdbname, sizeof(dbconn->dbname));
-   strncpy(dbconn->user, ingdbuser, sizeof(dbconn->user));
-   strncpy(dbconn->password, ingdbpasw, sizeof(dbconn->password));
-   strncpy(dbconn->connection_name, conn_name, sizeof(dbconn->connection_name));
+   bstrncpy(dbconn->dbname, ingdbname, sizeof(dbconn->dbname));
+   bstrncpy(dbconn->user, ingdbuser, sizeof(dbconn->user));
+   bstrncpy(dbconn->password, ingdbpasw, sizeof(dbconn->password));
+   bstrncpy(dbconn->connection_name, conn_name, sizeof(dbconn->connection_name));
    dbconn->session_id = sess_id;
    dbconn->msg = (char*)malloc(257);
    memset(dbconn->msg, 0, 257);