fix a crash & a wrong pointer
authorU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Wed, 3 Feb 2010 13:54:29 +0000 (21:54 +0800)
committerU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Wed, 3 Feb 2010 13:54:29 +0000 (21:54 +0800)
pgadmin/utils/pgcsvfile.cpp

index 803482c0b3497f3fbf2eb8b3b0baee105af6c871..c1b7f1810be982290cf824127141f89872375eeb 100755 (executable)
@@ -1111,7 +1111,7 @@ void pgCSVFile::SetPreviewRowsNum(const size_t rowsnum)
     else\r
         m_pvrowsnum = rowsnum;\r
 \r
-    GenCSVPreview(rowsnum==(size_t)0);\r
+    GenCSVPreview(m_pvparsedrowsnum==(size_t)0);\r
 }\r
 \r
 wxFileOffset pgCSVFile::GenMoreFilePreview(wxString *pvstr)\r
@@ -1261,7 +1261,7 @@ size_t pgCSVFile::GenCSVPreview(const bool isinit)
     bool isfileeof = Eof(), incolparsing, inquotedblk;\r
     size_t *tmpcolsnums;\r
     wxString *fileline, **tmpcsvlines, **parsedvals, ***tmpcolsvals;\r
-    while (isinit || m_pvparsedrowsnum<pvrowsnum)\r
+    while (m_pvparsedrowsnum<pvrowsnum)\r
     {\r
         curcolnr = (size_t)0;\r
         filelinenum = (size_t)0;\r
@@ -1970,75 +1970,40 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
             {\r
                 if (linedata)\r
                     linedata->Append(csvdata[*parsedoffset]);\r
-                if (csvdata[(*parsedoffset)+1])\r
+\r
+                if (csvdata[(*parsedoffset)+1]==m_quotedby)\r
                 {\r
-                    if (csvdata[(*parsedoffset)+1]==m_quotedby)\r
+                    if (csvdata[(*parsedoffset)+2])\r
                     {\r
-                        if (csvdata[(*parsedoffset)+2])\r
+                        if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0])\r
                         {\r
-                            if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0])\r
+                            size_t dlmidx = (size_t)1;\r
+                            while (m_chardlmvals[dlmidx])\r
                             {\r
-                                size_t dlmidx = (size_t)1;\r
-                                while (m_chardlmvals[dlmidx])\r
-                                {\r
-                                    if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx])\r
-                                        break;\r
-                                    dlmidx++;\r
-                                }\r
-                                if (m_chardlmvals[dlmidx])\r
+                                if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx])\r
+                                    break;\r
+                                dlmidx++;\r
+                            }\r
+                            if (m_chardlmvals[dlmidx])\r
+                            {\r
+                                if (csvdata[(*parsedoffset)+dlmidx+2])\r
                                 {\r
-                                    if (csvdata[(*parsedoffset)+dlmidx+2])\r
+                                    if (linedata)\r
+                                        linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
+                                    if (!colval)\r
+                                        colval = new wxString;\r
+                                    colval->Append(csvdata[*parsedoffset]);\r
+                                    (*parsedoffset)++;\r
+                                    (*parsedoffset)++;\r
+                                    while (dlmidx--)\r
                                     {\r
                                         if (linedata)\r
-                                            linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                                        if (!colval)\r
-                                            colval = new wxString;\r
-                                        colval->Append(csvdata[*parsedoffset]);\r
-                                        (*parsedoffset)++;\r
-                                        (*parsedoffset)++;\r
-                                        while (dlmidx--)\r
-                                        {\r
-                                            if (linedata)\r
-                                                linedata->Append(csvdata[*parsedoffset]);\r
-                                            colval->Append(csvdata[(*parsedoffset)++]);\r
-                                        }\r
-                                    }\r
-                                    else\r
-                                    {\r
-                                        if (parsedarr)\r
-                                        {\r
-                                            if (!(*incolparsing))\r
-                                            {\r
-                                                tmparr = parsedarr;\r
-                                                parsedarr = new wxString *[(*curcolnr)+2];\r
-                                                memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                                delete []tmparr;\r
-                                                (*curcolnr)++;\r
-                                                *incolparsing = true;\r
-                                            }\r
-                                        }\r
-                                        else\r
-                                        {\r
-                                            parsedarr = new wxString *[1];\r
-                                            *curcolnr = (size_t)0;\r
-                                        }\r
-                                        parsedarr[*curcolnr] = colval;\r
-                                        if (hasmore)\r
-                                            *rsval = wxInvalidOffset;\r
-                                        else\r
-                                        {\r
-                                            *parsedoffset += dlmidx + 2;\r
-                                            *rsval = *parsedoffset;\r
-                                        }\r
-                                        return parsedarr;\r
+                                            linedata->Append(csvdata[*parsedoffset]);\r
+                                        colval->Append(csvdata[(*parsedoffset)++]);\r
                                     }\r
                                 }\r
                                 else\r
                                 {\r
-                                    if (colval)\r
-                                        colval->Append(csvdata[*parsedoffset]);\r
-                                    else\r
-                                        colval = new wxString;\r
                                     if (parsedarr)\r
                                     {\r
                                         if (!(*incolparsing))\r
@@ -2048,9 +2013,8 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                                             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                                             delete []tmparr;\r
                                             (*curcolnr)++;\r
+                                            *incolparsing = true;\r
                                         }\r
-                                        else\r
-                                            *incolparsing = false;\r
                                     }\r
                                     else\r
                                     {\r
@@ -2058,27 +2022,49 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                                         *curcolnr = (size_t)0;\r
                                     }\r
                                     parsedarr[*curcolnr] = colval;\r
-                                    colval = NULL;\r
-                                    parsedoffset += dlmidx + 2;\r
-                                    if (linedata)\r
+                                    if (hasmore)\r
+                                        *rsval = wxInvalidOffset;\r
+                                    else\r
                                     {\r
-                                        linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                                        colval->Append(m_chardlmvals);\r
+                                        *parsedoffset += dlmidx + 2;\r
+                                        *rsval = *parsedoffset;\r
                                     }\r
+                                    return parsedarr;\r
                                 }\r
                             }\r
                             else\r
                             {\r
+                                if (colval)\r
+                                    colval->Append(csvdata[*parsedoffset]);\r
+                                else\r
+                                    colval = new wxString;\r
+\r
+                                if (parsedarr)\r
+                                {\r
+                                    if (!(*incolparsing))\r
+                                    {\r
+                                        tmparr = parsedarr;\r
+                                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                                        delete []tmparr;\r
+                                        (*curcolnr)++;\r
+                                    }\r
+                                    else\r
+                                        *incolparsing = false;\r
+                                }\r
+                                else\r
+                                {\r
+                                    parsedarr = new wxString *[1];\r
+                                    *curcolnr = (size_t)0;\r
+                                }\r
+                                parsedarr[*curcolnr] = colval;\r
+                                colval = NULL;\r
+                                *parsedoffset += dlmidx + 2;\r
                                 if (linedata)\r
                                     linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                                if (!colval)\r
-                                    colval = new wxString;\r
-                                colval->Append(csvdata[*parsedoffset]);\r
-                                (*parsedoffset)++;\r
-                                (*parsedoffset)++;\r
                             }\r
                         }\r
-                        else if (hasmore)\r
+                        else\r
                         {\r
                             if (linedata)\r
                                 linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
@@ -2087,66 +2073,74 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                             colval->Append(csvdata[*parsedoffset]);\r
                             (*parsedoffset)++;\r
                             (*parsedoffset)++;\r
-                            if (parsedarr)\r
-                            {\r
-                                if (!(*incolparsing))\r
-                                {\r
-                                    tmparr = parsedarr;\r
-                                    parsedarr = new wxString *[(*curcolnr)+2];\r
-                                    memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                    delete []tmparr;\r
-                                    (*curcolnr)++;\r
-                                }\r
-                            }\r
-                            else\r
+                        }\r
+                    }\r
+                    else if (hasmore)\r
+                    {\r
+                        if (linedata)\r
+                            linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
+                        if (!colval)\r
+                            colval = new wxString;\r
+                        colval->Append(csvdata[*parsedoffset]);\r
+                        (*parsedoffset)++;\r
+                        (*parsedoffset)++;\r
+                        if (parsedarr)\r
+                        {\r
+                            if (!(*incolparsing))\r
                             {\r
-                                parsedarr = new wxString *[1];\r
-                                *curcolnr = (size_t)0;\r
+                                tmparr = parsedarr;\r
+                                parsedarr = new wxString *[(*curcolnr)+2];\r
+                                memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                                delete []tmparr;\r
+                                (*curcolnr)++;\r
                             }\r
-                            *incolparsing = true;\r
-                            parsedarr[*curcolnr] = colval;\r
-                            *rsval = wxInvalidOffset;\r
-                            return parsedarr;\r
                         }\r
                         else\r
                         {\r
-                            if (linedata)\r
-                                linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                            if (!colval)\r
-                                colval = new wxString;\r
-                            colval->Append(csvdata[*parsedoffset]);\r
-                            (*parsedoffset)++;\r
-                            (*parsedoffset)++;\r
-                            if (parsedarr)\r
-                            {\r
-                                if (!(*incolparsing))\r
-                                {\r
-                                    tmparr = parsedarr;\r
-                                    parsedarr = new wxString *[(*curcolnr)+2];\r
-                                    memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                    delete []tmparr;\r
-                                    (*curcolnr)++;\r
-                                }\r
-                            }\r
-                            else\r
-                            {\r
-                                parsedarr = new wxString *[1];\r
-                                *curcolnr = (size_t)0;\r
-                            }\r
-                            *incolparsing = false;\r
-                            parsedarr[*curcolnr] = colval;\r
-                            *rsval = *parsedoffset;\r
-                            return parsedarr;\r
+                            parsedarr = new wxString *[1];\r
+                            *curcolnr = (size_t)0;\r
                         }\r
+                        *incolparsing = true;\r
+                        parsedarr[*curcolnr] = colval;\r
+                        *rsval = wxInvalidOffset;\r
+                        return parsedarr;\r
                     }\r
                     else\r
                     {\r
-                        //if (linedata)\r
-                        //    linedata->Append(csvdata[*parsedoffset]);\r
-                        *inquotedblk = true;\r
+                        if (linedata)\r
+                            linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
+                        if (!colval)\r
+                            colval = new wxString;\r
+                        colval->Append(csvdata[*parsedoffset]);\r
+                        (*parsedoffset)++;\r
                         (*parsedoffset)++;\r
+                        if (parsedarr)\r
+                        {\r
+                            if (!(*incolparsing))\r
+                            {\r
+                                tmparr = parsedarr;\r
+                                parsedarr = new wxString *[(*curcolnr)+2];\r
+                                memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                                delete []tmparr;\r
+                                (*curcolnr)++;\r
+                            }\r
+                        }\r
+                        else\r
+                        {\r
+                            parsedarr = new wxString *[1];\r
+                            *curcolnr = (size_t)0;\r
+                        }\r
+                        *incolparsing = false;\r
+                        parsedarr[*curcolnr] = colval;\r
+                        *rsval = *parsedoffset;\r
+                        return parsedarr;\r
                     }\r
                 }\r
+                else if (csvdata[(*parsedoffset)+1])\r
+                {\r
+                    *inquotedblk = true;\r
+                    (*parsedoffset)++;\r
+                }\r
                 else if (hasmore)\r
                 {\r
                     if (parsedarr)\r