You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2018/11/20 23:15:54 UTC

[2/5] trafodion git commit: add the trim function and optimize error print

add the trim function and optimize error print


Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/3c9cc942
Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/3c9cc942
Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/3c9cc942

Branch: refs/heads/master
Commit: 3c9cc94218014e951377ea53b7d47f08ef678268
Parents: 5161f7b
Author: SuJinpei <87...@qq.com>
Authored: Mon Aug 13 11:26:06 2018 +0800
Committer: SuJinpei <87...@qq.com>
Committed: Tue Nov 20 12:55:38 2018 +0800

----------------------------------------------------------------------
 core/conn/odb/src/odb.c | 54 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafodion/blob/3c9cc942/core/conn/odb/src/odb.c
----------------------------------------------------------------------
diff --git a/core/conn/odb/src/odb.c b/core/conn/odb/src/odb.c
index d008d82..8e2593f 100755
--- a/core/conn/odb/src/odb.c
+++ b/core/conn/odb/src/odb.c
@@ -720,6 +720,7 @@ static void setan ( int eid, int tid, int nrag, char *rag[], char *ql );
 static int Omexec(int tid, int eid, int ten, int scn, SQLCHAR *Ocmd, char *label, char *dcat, char *dsch);
 static char *strup ( char *s );
 static char *strlo ( char *s );
+static char *strtrim(char *str);
 int mrinit ( void );
 void mrend ( void );
 char *mreadline ( char *prompt, unsigned int *length );
@@ -6979,6 +6980,8 @@ static void Oload(int eid)
                             fprintf(stderr, "odb [Oload(%d)] - DIV error for %s\n", __LINE__, (char *)etab[eid].td[j].Oname);
                             goto oload_exit;
                         }
+                    } else if (!strmicmp("trim", bp, 4)) {
+                        map[j].op = 17;
                     }
                     else {
                         map[j].op = 0;
@@ -7378,6 +7381,7 @@ static void Oload(int eid)
             }
             if ( fg & 0062 ) {                                  /* field/record ready or nofile */
                 oload_lastrow:
+                str[ifl] = '\0';
                 if ( rmap && rmap[k] >= 0 ) {
                     Odp = &etab[eid].Orowsetl[m*etab[eid].s + etab[eid].td[rmap[k]].start];
                     if ( fg & 0200 ) {                          /* embed file reading mode */
@@ -7542,6 +7546,10 @@ static void Oload(int eid)
                             }
                         }
                             break;
+                        case 17: // trim
+                            str = strtrim(str);
+                            ifl = strlen(str);
+                            break;
                         }
                         if ( ifl > (int)etab[eid].td[rmap[k]].Osize ) { /* prevent Orowsetl[] overflow */
                             str[ifl]='\0';
@@ -10106,6 +10114,7 @@ static int Oloadbuff(int eid)
         clock_gettime(CLOCK_MONOTONIC, &tsp1);
 #endif
         Or = SQLExecute(thps[tid].Os) ;         /* Execute INSERT (load/copy) or tgt command */
+        SQLLEN tLastRow = -1;           /* this is special solution for China Union Pay, print only first error message for state 22003 */
 #ifdef ODB_PROFILE
         clock_gettime(CLOCK_MONOTONIC, &tsp2);
         ti += tspdiff ( &tsp1 , &tsp2 ) ;
@@ -10189,20 +10198,24 @@ static int Oloadbuff(int eid)
                         /* Ok, now we have an error message (Otxt), a five char SQLState (Ostate), 
                          * a native error code (Onative) and the rowset row number (Orown). Let's
                          * print everything to stderr. */
-                        fprintf(stderr, "[%d] odb [Oloadbuff(%d)] - Error loading row %lu (State: %s, Native %ld)\n%s\n",
-                            tid, __LINE__, (unsigned long)Orown + etab[eid].nbs, (char *)Ostate, (long)Onative, (char *)Otxt);
-                        if ( type == 'C' ) {        /* 'C' thread */
-                            if ( etab[eid].fdmp ) { /* dump ODBC buffer */
-                                MutexLock(&etab[gpar].pmutex);
-                                fprintf(etab[eid].fdmp, "[%d] odb [Oloadbuff(%d)] - Error loading row %lu (State: %s, Native %ld)\n%s\n",
-                                    tid, __LINE__, (unsigned long)Orown + etab[eid].nbs, (char *)Ostate, (long)Onative, (char *)Otxt);
-                                fprintf(etab[eid].fdmp, "[%d] Dumping row %lu in a block of %zu rows. ODBC row length = %zu\n",
-                                    tid, (unsigned long) Orown, etab[eid].ar, etab[par].s ) ;
-                                dumpbuff(etab[eid].fdmp, tid, (unsigned char *)(etab[eid].Orowsetl + (Orown - 1) * etab[par].s), etab[par].s, 0 );
-                                MutexUnlock(&etab[gpar].pmutex);
+                        if (tLastRow != Orown) {
+                            tLastRow = Orown;
+                            fprintf(stderr, "[%d] odb [Oloadbuff(%d)] - Error loading row %lu (State: %s, Native %ld)\n%s\n",
+                                tid, __LINE__, (unsigned long)Orown + etab[eid].nbs, (char *)Ostate, (long)Onative, (char *)Otxt);
+                            if (type == 'C') {        /* 'C' thread */
+                                if (etab[eid].fdmp) { /* dump ODBC buffer */
+                                    MutexLock(&etab[gpar].pmutex);
+                                    fprintf(etab[eid].fdmp, "[%d] odb [Oloadbuff(%d)] - Error loading row %lu (State: %s, Native %ld)\n%s\n",
+                                        tid, __LINE__, (unsigned long)Orown + etab[eid].nbs, (char *)Ostate, (long)Onative, (char *)Otxt);
+                                    fprintf(etab[eid].fdmp, "[%d] Dumping row %lu in a block of %zu rows. ODBC row length = %zu\n",
+                                        tid, (unsigned long)Orown, etab[eid].ar, etab[par].s);
+                                    dumpbuff(etab[eid].fdmp, tid, (unsigned char *)(etab[eid].Orowsetl + (Orown - 1) * etab[par].s), etab[par].s, 0);
+                                    MutexUnlock(&etab[gpar].pmutex);
+                                }
+                            }
+                            else {                /* either multi ('L') or single ('l') threaded loaders */
+                                prec('L', (unsigned char *)(etab[eid].Orowsetl + etab[par].s*(Orown - 1)), eid);
                             }
-                        } else {                /* either multi ('L') or single ('l') threaded loaders */
-                            prec('L', (unsigned char *)(etab[eid].Orowsetl + etab[par].s*(Orown-1)), eid);
                         }
                         break;
                     }
@@ -13299,6 +13312,21 @@ static char *strlo ( char *s )
     return(save);
 }
 
+static char *strtrim(char *str)
+{
+    // trim tailing space
+    size_t i = strlen(str) - 1;
+    while (str[i] == ' ') --i;
+    str[i + 1] = '\0';
+
+    // trim heading space
+    for (i = 0; str[i] == ' '; ++i);
+    if (i > 0)
+        strcpy(str, str + i);
+
+    return str;
+}
+
 /* expandtype:
  *      return SQL type string associated with a given data type
  *