new options & bug fix
authorU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Sun, 21 Mar 2010 09:18:35 +0000 (17:18 +0800)
committerU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Sun, 21 Mar 2010 09:18:35 +0000 (17:18 +0800)
pgadmin/frm/frmImport.cpp
pgadmin/include/frm/frmImport.h
pgadmin/include/utils/pgcsvfile.h
pgadmin/ui/frmImport.xrc
pgadmin/utils/pgcsvfile.cpp

index 4bd37023bcdf47d9b64c9be887ce5de6f21c13b5..d878eaa41c2764769d5c2623c1871527f9830e24 100755 (executable)
@@ -74,6 +74,7 @@
 //wzdFileOptsPage\r
 #define chkFileSkipEmptyRow       CTRL_CHECKBOX("chkFileSkipEmptyRow")\r
 #define txtFileOptImpRegEx        CTRL_TEXT("txtFileOptImpRegEx")\r
+#define txtFileOptStartWith       CTRL_TEXT("txtFileOptStartWith")\r
 #define spinFileSkipFirstRows     CTRL_SPIN("spinFileSkipFirstRows")\r
 #define rdbFileImpAllRows         CTRL_RADIOBUTTON("rdbFileImpAllRows")\r
 #define rdbFileImpOnlyRows        CTRL_RADIOBUTTON("rdbFileImpOnlyRows")\r
@@ -96,6 +97,7 @@
 #define chcImpDest             CTRL_CHOICE("chcImpDest")\r
 #define txtDestFilePath        CTRL_TEXT("txtDestFilePath")\r
 #define btnDestFileBrowse      CTRL_BUTTON("btnDestFileBrowse")\r
+#define chkDestFileAppend      CTRL_CHECKBOX("chkDestFileAppend")\r
 #define spinCommitEvery        CTRL_SPIN("spinCommitEvery")\r
 #define spinStopOnError        CTRL_SPIN("spinStopOnError")\r
 #define rdbLogToScreen         CTRL_RADIOBUTTON("rdbLogToScreen")\r
 #define rdbLogToScrFile        CTRL_RADIOBUTTON("rdbLogToScrFile")\r
 #define txtLogFilePath         CTRL_TEXT("txtLogFilePath")\r
 #define btnLogFileBrowse       CTRL_BUTTON("btnLogFileBrowse")\r
+#define chkLogFileAppend       CTRL_CHECKBOX("chkLogFileAppend")\r
 #define rdbLogVerbose          CTRL_RADIOBUTTON("rdbLogVerbose")\r
 #define rdbLogSummary          CTRL_RADIOBUTTON("rdbLogSummary")\r
 #define rdbLogSilent           CTRL_RADIOBUTTON("rdbLogSilent")\r
@@ -125,15 +128,17 @@ BEGIN_EVENT_TABLE(frmImport, wxWizard)
     // wizard event\r
     EVT_WIZARD_PAGE_CHANGING(XRCID("frmImport"),        frmImport::OnPageChanging)\r
     EVT_WIZARD_CANCEL(XRCID("frmImport"),               frmImport::OnWizardCancel)\r
+    // TODO: check whether finish button has bug that can't be disabled?\r
+    // if or not add a new method to catch finish wizard event.\r
     // Source Type page\r
     EVT_RADIOBUTTON(XRCID("rdbSrcTextFile"),            frmImport::OnSourceType)\r
     EVT_RADIOBUTTON(XRCID("rdbSrcArchFile"),            frmImport::OnSourceType)\r
     EVT_RADIOBUTTON(XRCID("rdbSrcODBC"),                frmImport::OnSourceType)\r
     EVT_RADIOBUTTON(XRCID("rdbSrcPgSQL"),               frmImport::OnSourceType)\r
     // Text file page\r
-    EVT_BUTTON(XRCID("btnTextFileBrowse"),               frmImport::OnTextFileBrowse)\r
-    EVT_CHOICE(XRCID("chcTextFileEncoding"),             frmImport::OnTextFileEncoding)\r
-    EVT_BUTTON(XRCID("btnTextFilePreviewMore"),          frmImport::OnTextFilePreviewMore)\r
+    EVT_BUTTON(XRCID("btnTextFileBrowse"),              frmImport::OnTextFileBrowse)\r
+    EVT_CHOICE(XRCID("chcTextFileEncoding"),            frmImport::OnTextFileEncoding)\r
+    EVT_BUTTON(XRCID("btnTextFilePreviewMore"),         frmImport::OnTextFilePreviewMore)\r
     // Archive file page\r
     EVT_BUTTON(XRCID("btnArchFileBrowse"),              frmImport::OnArchFileBrowse)\r
     EVT_CHOICE(XRCID("chcArchFileEncoding"),            frmImport::OnArchFileEncoding)\r
@@ -333,6 +338,8 @@ frmImport::~frmImport()
 \r
     if (m_fileoptimpregex)\r
         delete m_fileoptimpregex;\r
+    if (m_fileoptstartwith)\r
+        delete m_fileoptstartwith;\r
 \r
     if (m_booltruevals)\r
         delete m_booltruevals;\r
@@ -449,6 +456,7 @@ void frmImport::Init()
     m_srcfile = NULL;\r
 \r
     m_fileoptimpregex = NULL;\r
+    m_fileoptstartwith = NULL;\r
     m_booltruevals = NULL;\r
     m_boolfalsevals = NULL;\r
 \r
@@ -554,6 +562,11 @@ void frmImport::OnPageChanging(wxWizardEvent& ev)
                     delete m_fileoptimpregex;\r
                     m_fileoptimpregex = NULL;\r
                 }\r
+                if (m_fileoptstartwith)\r
+                {\r
+                    delete m_fileoptstartwith;\r
+                    m_fileoptstartwith = NULL;\r
+                }\r
             }\r
 \r
             if ((m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE))\r
@@ -1289,11 +1302,13 @@ void frmImport::OnDestImpDest(wxCommandEvent &ev)
     {\r
         txtDestFilePath->Enable();\r
         btnDestFileBrowse->Enable();\r
+        chkDestFileAppend->Enable();\r
     }\r
     else\r
     {\r
         txtDestFilePath->Disable();\r
         btnDestFileBrowse->Disable();\r
+        chkDestFileAppend->Disable();\r
     }\r
 }\r
 \r
@@ -1316,7 +1331,7 @@ void frmImport::OnDestFileBrowse(wxCommandEvent &ev)
 \r
 bool frmImport::OnDestFilePathChange(const wxString& filepath)\r
 {\r
-    if (wxFileExists(filepath))\r
+    if (!chkDestFileAppend->GetValue() && wxFileExists(filepath))\r
     {\r
         wxString msg;\r
         msg.Printf(_("The output file: \n\n%s\n\nalready exists. Do you want to overwrite it?"), filepath.c_str());\r
@@ -1334,11 +1349,13 @@ void frmImport::OnDestLogTo(wxCommandEvent &ev)
     {\r
         txtLogFilePath->Disable();\r
         btnLogFileBrowse->Disable();\r
+        chkLogFileAppend->Disable();\r
     }\r
     else\r
     {\r
         txtLogFilePath->Enable();\r
         btnLogFileBrowse->Enable();\r
+        chkLogFileAppend->Enable();\r
     }\r
 }\r
 \r
@@ -1361,7 +1378,7 @@ void frmImport::OnLogFileBrowse(wxCommandEvent &ev)
 \r
 bool frmImport::OnLogFilePathChange(const wxString& filepath)\r
 {\r
-    if (wxFileExists(filepath))\r
+    if (!chkLogFileAppend->GetValue() && wxFileExists(filepath))\r
     {\r
         wxString msg;\r
         msg.Printf(_("The log file: \n\n%s\n\nalready exists. Do you want to overwrite it?"), filepath.c_str());\r
@@ -1465,11 +1482,12 @@ void frmImport::ImportData()
     int impmode = (int)chcImportMode->GetClientData(chcImportMode->GetSelection());\r
     int impdest = (int)chcImpDest->GetClientData(chcImpDest->GetSelection());\r
 \r
+    bool fileopened;\r
     if (m_procstatus==IMPPREPARED)\r
     {\r
         txtLogMessages->Clear();\r
 \r
-        if ((!m_destfile && impdest==IMPDESTFCOPY) || impdest==IMPDESTFINS || impdest==IMPDESTFTEST || impdest==IMPDESTFILE)\r
+        if (!m_destfile && (impdest==IMPDESTFCOPY || impdest==IMPDESTFINS || impdest==IMPDESTFTEST || impdest==IMPDESTFILE))\r
         {\r
             wxString destfilename = txtDestFilePath->GetValue();\r
             if (wxFile::Exists(destfilename) && !wxFile::Access(destfilename, wxFile::write))\r
@@ -1481,7 +1499,11 @@ void frmImport::ImportData()
                 return;\r
             }\r
             m_destfile = new wxFile;\r
-            if (!m_destfile->Open(destfilename, wxFile::write))\r
+            if (chkDestFileAppend->GetValue())\r
+                fileopened = m_destfile->Open(destfilename, wxFile::write_append);\r
+            else\r
+                fileopened = m_destfile->Open(destfilename, wxFile::write);\r
+            if (!fileopened)\r
             {\r
                 delete m_destfile;\r
                 m_destfile = NULL;\r
@@ -1505,7 +1527,11 @@ void frmImport::ImportData()
                 return;\r
             }\r
             m_logfile = new wxFile;\r
-            if (!m_logfile->Open(logfilename, wxFile::write))\r
+            if (chkLogFileAppend->GetValue())\r
+                fileopened = m_logfile->Open(logfilename, wxFile::write_append);\r
+            else\r
+                fileopened = m_logfile->Open(logfilename, wxFile::write);\r
+            if (!fileopened)\r
             {\r
                 delete m_logfile;\r
                 m_logfile = NULL;\r
@@ -1718,6 +1744,7 @@ void frmImport::ImportData()
 \r
         m_imperrnum = 0;\r
         m_improwsnum = 0;\r
+        m_skiprowsnum = 0;\r
         m_transrowsnum = 0;\r
         RandomSavepointName(m_imptransname);\r
 \r
@@ -1727,7 +1754,7 @@ void frmImport::ImportData()
     {\r
         m_imppausedts += wxDateTime::UNow() - m_imppausedt;\r
 \r
-        //m_procstatus = IMPRUNNING;\r
+        m_procstatus = IMPRUNNING;\r
         btnImpStart->SetLabel(_("&Pause"));\r
         wzdctrlbtn = (wxButton*)FindWindowById(wxID_BACKWARD);\r
         wzdctrlbtn->Disable();\r
@@ -1807,8 +1834,8 @@ void frmImport::ImportData()
         skipfirstrows = false;\r
     }\r
 \r
-    int commitevery = spinCommitEvery->GetValue();\r
-    int stoponerror = spinStopOnError->GetValue();\r
+    unsigned int commitevery = spinCommitEvery->GetValue();\r
+    unsigned int stoponerror = spinStopOnError->GetValue();\r
 \r
 #if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
     SQLSMALLINT stmtcolsnum;\r
@@ -1837,18 +1864,17 @@ void frmImport::ImportData()
     wxString **linevals;\r
     int valsnum;\r
     wxDateTime clienttime;\r
-    wxTimeSpan elapsedspan;\r
-    int avgrowtime;\r
     wxString impdatalist, insstmt, rowlog;\r
     wxChar imptranssn[32];\r
-    bool copybolcking = false;\r
-    bool rowdataisok;\r
+    bool needflush = false;\r
+    bool rowdataisok, lineisskipped = false;\r
     int commres;\r
 \r
     while (true)\r
     {\r
         if (m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE)\r
         {\r
+            lineisskipped = false;\r
             linedata.Empty();\r
             linevals = NULL;\r
             if (!m_srcfile->NextLine(linedata, linevals, valsnum))\r
@@ -1907,7 +1933,7 @@ void frmImport::ImportData()
                     }\r
                 }\r
 \r
-                continue;\r
+                lineisskipped = true;\r
             }\r
 \r
             if (skipemptyline && linedata.IsEmpty())\r
@@ -1926,7 +1952,7 @@ void frmImport::ImportData()
                     }\r
                 }\r
 \r
-                continue;\r
+                lineisskipped = true;\r
             }\r
 \r
             if (m_fileoptimpregex && !m_fileoptimpregex->Matches(linedata))\r
@@ -1945,7 +1971,26 @@ void frmImport::ImportData()
                     }\r
                 }\r
 \r
-                continue;\r
+                lineisskipped = true;\r
+            }\r
+\r
+            if (m_fileoptstartwith && !linedata.StartsWith(*m_fileoptstartwith))\r
+            {\r
+                if (loginfo)\r
+                {\r
+                    if (logtoscr)\r
+                    {\r
+                        txtLogMessages->AppendText(_("Skip not match start with row."));\r
+                        txtLogMessages->AppendText(END_OF_LINE);\r
+                    }\r
+                    if (m_logfile)\r
+                    {\r
+                        m_logfile->Write(_("Skip not match start with row."));\r
+                        m_logfile->Write(END_OF_LINE);\r
+                    }\r
+                }\r
+\r
+                lineisskipped = true;\r
             }\r
         }\r
 #if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
@@ -2081,11 +2126,15 @@ void frmImport::ImportData()
         else\r
             break;\r
 \r
-        impdatalist.Empty();\r
-        clienttime = wxDateTime::UNow();\r
-        rowlog.Empty();\r
+        if (!lineisskipped)\r
+        {\r
+            impdatalist.Empty();\r
+            clienttime = wxDateTime::UNow();\r
+            rowlog.Empty();\r
+        }\r
 \r
-        if (m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE)\r
+        if (lineisskipped);\r
+        else if (m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE)\r
             rowdataisok = GenCSVSQLData(impdatalist, rowlog, linevals, valsnum, clienttime, impmode, fmtstyle);\r
 #if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
         else if (m_datasrctype==SRCODBCPAGE)\r
@@ -2094,45 +2143,170 @@ void frmImport::ImportData()
         else\r
             rowdataisok = false;\r
 \r
-        if (rowdataisok)\r
+        if (needflush)\r
         {\r
             if (impmode==IMPORTMODECOPY)\r
             {\r
-                if (copybolcking)\r
+                if (m_impconn->FlushData())\r
                 {\r
-                    if (m_impconn->FlushData())\r
+                    if (loginfo)\r
                     {\r
-                        if (loginfo)\r
+                        if (logtoscr)\r
+                        {\r
+                            txtLogMessages->AppendText(_("Data flushed."));\r
+                            txtLogMessages->AppendText(END_OF_LINE);\r
+                        }\r
+                        if (m_logfile)\r
+                        {\r
+                            m_logfile->Write(_("Data flushed."));\r
+                            m_logfile->Write(END_OF_LINE);\r
+                        }\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    if (logerror)\r
+                    {\r
+                        if (logtoscr)\r
+                            txtLogMessages->AppendText(_("Failed to flush data: ") + m_impconn->GetLastError());\r
+                        if (m_logfile)\r
+                            m_logfile->Write(_("Failed to flush data: ") + m_impconn->GetLastError());\r
+                    }\r
+                    m_procstatus = IMPERRORSTOP;\r
+                    m_imperrnum++;\r
+                    break;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                insstmt.Empty();\r
+                swprintf(imptranssn, 32, wxT("%d"), m_improwsnum-1);\r
+\r
+                if (m_impconn->GetAsyncResult())\r
+                {\r
+                    if (loginfo)\r
+                    {\r
+                        if (logtoscr)\r
+                        {\r
+                            txtLogMessages->AppendText(_("Succeeded."));\r
+                            txtLogMessages->AppendText(END_OF_LINE);\r
+                        }\r
+                        if (m_logfile)\r
+                        {\r
+                            m_logfile->Write(_("Succeeded."));\r
+                            m_logfile->Write(END_OF_LINE);\r
+                        }\r
+                    }\r
+                    m_transrowsnum++;\r
+                }\r
+                else\r
+                {\r
+                    if (logerror)\r
+                    {\r
+                        if (logtoscr)\r
+                            txtLogMessages->AppendText(m_impconn->GetLastError());\r
+                        if (m_logfile)\r
+                            m_logfile->Write(m_impconn->GetLastError());\r
+                    }\r
+\r
+                    insstmt.Append(wxT("ROLLBACK TO ")).Append(m_imptransname).Append(imptranssn).Append(wxT(';'));\r
+                    m_imperrnum++;\r
+                }\r
+\r
+                insstmt.Append(wxT("RELEASE SAVEPOINT ")).Append(m_imptransname).Append(imptranssn).Append(wxT(';'));\r
+                if (commitevery && m_transrowsnum>=commitevery)\r
+                {\r
+                    if (impdest==IMPDESTTEST || impdest==IMPDESTFTEST)\r
+                    {\r
+                        insstmt.Append(wxT("ROLLBACK;"));\r
+                        txtLogMessages->AppendText(_("Rollback and begin new transaction."));\r
+                        txtLogMessages->AppendText(END_OF_LINE);\r
+                        if (loginfo && m_logfile)\r
+                        {\r
+                            m_logfile->Write(_("Rollback and begin new transaction."));\r
+                            m_logfile->Write(END_OF_LINE);\r
+                        }\r
+                    }\r
+                    else\r
+                    {\r
+                        insstmt.Append(wxT("COMMIT;"));\r
+                        txtLogMessages->AppendText(_("Commit and begin new transaction."));\r
+                        txtLogMessages->AppendText(END_OF_LINE);\r
+                        if (loginfo && m_logfile)\r
+                        {\r
+                            m_logfile->Write(_("Commit and begin new transaction."));\r
+                            m_logfile->Write(END_OF_LINE);\r
+                        }\r
+                    }\r
+                    insstmt.Append(wxT("BEGIN TRANSACTION;"));\r
+                    m_transrowsnum = 0;\r
+                }\r
+                if (logstmt)\r
+                {\r
+                    if (logtoscr)\r
+                    {\r
+                        txtLogMessages->AppendText(insstmt);\r
+                        txtLogMessages->AppendText(END_OF_LINE);\r
+                    }\r
+                    if (m_logfile)\r
+                    {\r
+                        m_logfile->Write(insstmt);\r
+                        m_logfile->Write(END_OF_LINE);\r
+                    }\r
+                }\r
+                if (m_impconn->ExecuteVoid(insstmt, false))\r
+                {\r
+                    if (loginfo)\r
+                    {\r
+                        if (logtoscr)\r
+                        {\r
+                            txtLogMessages->AppendText(_("Succeeded."));\r
+                            txtLogMessages->AppendText(END_OF_LINE);\r
+                        }\r
+                        if (m_logfile)\r
+                        {\r
+                            m_logfile->Write(_("Succeeded."));\r
+                            m_logfile->Write(END_OF_LINE);\r
+                        }\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    if (logerror)\r
+                    {\r
+                        if (!logstmt)\r
                         {\r
                             if (logtoscr)\r
                             {\r
-                                txtLogMessages->AppendText(_("Data flushed."));\r
+                                txtLogMessages->AppendText(insstmt);\r
                                 txtLogMessages->AppendText(END_OF_LINE);\r
                             }\r
                             if (m_logfile)\r
                             {\r
-                                m_logfile->Write(_("Data flushed."));\r
+                                m_logfile->Write(insstmt);\r
                                 m_logfile->Write(END_OF_LINE);\r
                             }\r
                         }\r
-                    }\r
-                    else\r
-                    {\r
-                        if (logerror)\r
-                        {\r
-                            if (logtoscr)\r
-                                txtLogMessages->AppendText(_("Failed to flush data: ") + m_impconn->GetLastError());\r
-                            if (m_logfile)\r
-                                m_logfile->Write(_("Failed to flush data: ") + m_impconn->GetLastError());\r
-                        }\r
-                        m_procstatus = IMPERRORSTOP;\r
-                        m_imperrnum++;\r
-                        break;\r
+                        if (logtoscr)\r
+                            txtLogMessages->AppendText(m_impconn->GetLastError());\r
+                        if (m_logfile)\r
+                            m_logfile->Write(m_impconn->GetLastError());\r
                     }\r
 \r
-                    copybolcking = false;\r
+                    m_procstatus = IMPERRORSTOP;\r
+                    m_imperrnum++;\r
+                    break;\r
                 }\r
+            }\r
 \r
+            needflush = false;\r
+        }\r
+\r
+        if (lineisskipped);\r
+        else if (rowdataisok)\r
+        {\r
+            if (impmode==IMPORTMODECOPY)\r
+            {\r
                 if (loginfo && impdest!=IMPDESTFILE)\r
                 {\r
                     if (logtoscr)\r
@@ -2211,137 +2385,12 @@ void frmImport::ImportData()
                             m_logfile->Write(END_OF_LINE);\r
                         }\r
                     }\r
-                    copybolcking = true;\r
+                    needflush = true;\r
                 }\r
 \r
             }\r
             else\r
             {\r
-                if (m_procstatus==IMPPAUSED)\r
-                    m_procstatus = IMPRUNNING;\r
-                else if (impdest!=IMPDESTFILE && m_improwsnum)\r
-                {\r
-                    insstmt.Empty();\r
-                    //_itow(m_improwsnum-1, imptranssn, 10);\r
-                    swprintf(imptranssn, 32, wxT("%d"), m_improwsnum-1);\r
-\r
-                    if (m_impconn->GetAsyncResult())\r
-                    {\r
-                        if (loginfo)\r
-                        {\r
-                            if (logtoscr)\r
-                            {\r
-                                txtLogMessages->AppendText(_("Succeeded."));\r
-                                txtLogMessages->AppendText(END_OF_LINE);\r
-                            }\r
-                            if (m_logfile)\r
-                            {\r
-                                m_logfile->Write(_("Succeeded."));\r
-                                m_logfile->Write(END_OF_LINE);\r
-                            }\r
-                        }\r
-                        m_transrowsnum++;\r
-                    }\r
-                    else\r
-                    {\r
-                        if (logerror)\r
-                        {\r
-                            if (logtoscr)\r
-                                txtLogMessages->AppendText(m_impconn->GetLastError());\r
-                            if (m_logfile)\r
-                                m_logfile->Write(m_impconn->GetLastError());\r
-                        }\r
-\r
-                        insstmt.Append(wxT("ROLLBACK TO ")).Append(m_imptransname).Append(imptranssn).Append(wxT(';'));\r
-                        m_imperrnum++;\r
-                    }\r
-\r
-                    insstmt.Append(wxT("RELEASE SAVEPOINT ")).Append(m_imptransname).Append(imptranssn).Append(wxT(';'));\r
-                    if (commitevery && m_transrowsnum>=commitevery)\r
-                    {\r
-                        if (impdest==IMPDESTTEST || impdest==IMPDESTFTEST)\r
-                        {\r
-                            insstmt.Append(wxT("ROLLBACK;"));\r
-                            txtLogMessages->AppendText(_("Rollback and begin new transaction."));\r
-                            txtLogMessages->AppendText(END_OF_LINE);\r
-                            if (loginfo && m_logfile)\r
-                            {\r
-                                m_logfile->Write(_("Rollback and begin new transaction."));\r
-                                m_logfile->Write(END_OF_LINE);\r
-                            }\r
-                        }\r
-                        else\r
-                        {\r
-                            insstmt.Append(wxT("COMMIT;"));\r
-                            txtLogMessages->AppendText(_("Commit and begin new transaction."));\r
-                            txtLogMessages->AppendText(END_OF_LINE);\r
-                            if (loginfo && m_logfile)\r
-                            {\r
-                                m_logfile->Write(_("Commit and begin new transaction."));\r
-                                m_logfile->Write(END_OF_LINE);\r
-                            }\r
-                        }\r
-                        insstmt.Append(wxT("BEGIN TRANSACTION;"));\r
-                        m_transrowsnum = 0;\r
-                    }\r
-                    if (logstmt)\r
-                    {\r
-                        if (logtoscr)\r
-                        {\r
-                            txtLogMessages->AppendText(insstmt);\r
-                            txtLogMessages->AppendText(END_OF_LINE);\r
-                        }\r
-                        if (m_logfile)\r
-                        {\r
-                            m_logfile->Write(insstmt);\r
-                            m_logfile->Write(END_OF_LINE);\r
-                        }\r
-                    }\r
-                    if (m_impconn->ExecuteVoid(insstmt, false))\r
-                    {\r
-                        if (loginfo)\r
-                        {\r
-                            if (logtoscr)\r
-                            {\r
-                                txtLogMessages->AppendText(_("Succeeded."));\r
-                                txtLogMessages->AppendText(END_OF_LINE);\r
-                            }\r
-                            if (m_logfile)\r
-                            {\r
-                                m_logfile->Write(_("Succeeded."));\r
-                                m_logfile->Write(END_OF_LINE);\r
-                            }\r
-                        }\r
-                    }\r
-                    else\r
-                    {\r
-                        if (logerror)\r
-                        {\r
-                            if (!logstmt)\r
-                            {\r
-                                if (logtoscr)\r
-                                {\r
-                                    txtLogMessages->AppendText(insstmt);\r
-                                    txtLogMessages->AppendText(END_OF_LINE);\r
-                                }\r
-                                if (m_logfile)\r
-                                {\r
-                                    m_logfile->Write(insstmt);\r
-                                    m_logfile->Write(END_OF_LINE);\r
-                                }\r
-                            }\r
-                            if (logtoscr)\r
-                                txtLogMessages->AppendText(m_impconn->GetLastError());\r
-                            if (m_logfile)\r
-                                m_logfile->Write(m_impconn->GetLastError());\r
-                        }\r
-\r
-                        m_procstatus = IMPERRORSTOP;\r
-                        m_imperrnum++;\r
-                        break;\r
-                    }\r
-                }\r
-\r
                 if (impdest==IMPDESTFILE)\r
                 {\r
                     insstmt.Empty();\r
@@ -2350,7 +2399,6 @@ void frmImport::ImportData()
                 }\r
                 else\r
                 {\r
-                    //_itow(m_improwsnum, imptranssn, 10);\r
                     swprintf(imptranssn, 32, wxT("%d"), m_improwsnum);\r
 \r
                     insstmt.Empty();\r
@@ -2421,6 +2469,7 @@ void frmImport::ImportData()
                                     m_logfile->Write(END_OF_LINE);\r
                                 }\r
                             }\r
+                            needflush = true;\r
                         }\r
                         else\r
                         {\r
@@ -2498,45 +2547,19 @@ void frmImport::ImportData()
             m_imperrnum++;\r
         }\r
 \r
-        m_improwsnum++;\r
+        if (lineisskipped)\r
+            m_skiprowsnum++;\r
+        else\r
+            m_improwsnum++;\r
 \r
         if (logproc)\r
-        {\r
-            stxtInsertedRows->SetLabel(wxString::Format(_("%d row(s) inserted, %d error(s)."), m_improwsnum-m_imperrnum, m_imperrnum));\r
-            elapsedspan = wxDateTime::UNow().Subtract(m_impstartdt).Subtract(m_imppausedts);\r
-            avgrowtime = elapsedspan.GetMilliseconds().ToLong()/m_improwsnum;\r
-            stxtElapsedTime->SetLabel(elapsedspan.Format(wxT("%H:%M:%S.%l")));\r
-            stxtAvgRowTime->SetLabel(wxString::Format(_("%d ms"), avgrowtime));\r
-\r
-            if (m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE)\r
-            {\r
-                if (m_srcsize==wxInvalidOffset)\r
-                    gaugeImp->SetValue(m_improwsnum%100);\r
-                else\r
-                {\r
-                    gaugeImp->SetValue(m_srcfile->Tell()*1000/m_srcsize);\r
-                    stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(elapsedspan.GetMilliseconds().ToLong()*((m_srcsize-m_srcfile->Tell())/m_srcfile->Tell())).Format(wxT("%H:%M:%S.%l")));\r
-                }\r
-            }\r
-#if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
-            else if (m_datasrctype==SRCODBCPAGE)\r
-            {\r
-                if (m_srcsize==-1)\r
-                    gaugeImp->SetValue(m_improwsnum%100);\r
-                else\r
-                {\r
-                    gaugeImp->SetValue(m_improwsnum*1000/m_srcsize);\r
-                    stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(avgrowtime*(m_srcsize-m_improwsnum)).Format(wxT("%H:%M:%S.%l")));\r
-                }\r
-            }\r
-#endif\r
-        }\r
+            RefreshProc();\r
 \r
         if (logtoscr)\r
             if (txtLogMessages->GetLastPosition()>MAXLOGCOUNT)\r
             {\r
                 txtLogMessages->Freeze();\r
-                txtLogMessages->Remove(0, 1024);\r
+                txtLogMessages->Remove(0, 2048);\r
                 txtLogMessages->Thaw();\r
             }\r
 \r
@@ -2557,7 +2580,7 @@ void frmImport::ImportData()
 \r
         if (impdest!=IMPDESTFILE && (m_procstatus==IMPPAUSING || m_procstatus==IMPSTOPING))\r
         {\r
-            if (impmode==IMPORTMODECOPY && copybolcking)\r
+            if (impmode==IMPORTMODECOPY && needflush)\r
             {\r
                 if (m_impconn->FlushData())\r
                 {\r
@@ -2586,10 +2609,9 @@ void frmImport::ImportData()
                     }\r
                 }\r
             }\r
-            else if (impmode==IMPORTMODEINSERT)\r
+            else if (impmode==IMPORTMODEINSERT && needflush)\r
             {\r
                 insstmt.Empty();\r
-                //_itow(m_improwsnum-1, imptranssn, 10);\r
                 swprintf(imptranssn, 32, wxT("%d"), m_improwsnum-1);\r
 \r
                 if (m_impconn->GetAsyncResult())\r
@@ -2607,6 +2629,7 @@ void frmImport::ImportData()
                             m_logfile->Write(END_OF_LINE);\r
                         }\r
                     }\r
+                    m_transrowsnum++;\r
                 }\r
                 else\r
                 {\r
@@ -2685,8 +2708,6 @@ void frmImport::ImportData()
         {\r
             m_imppausedt = wxDateTime::UNow();\r
             wxLog::GetActiveTarget()->SetLogLevel(settings->GetLogLevel());\r
-            btnImpStart->Enable();\r
-            btnImpStop->Enable();\r
             btnImpStart->SetLabel(_("&Resume"));\r
 \r
 #if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
@@ -2695,24 +2716,13 @@ void frmImport::ImportData()
 #endif\r
 \r
             if (!logproc)\r
-            {\r
-                if (m_srcsize==-1)\r
-                    gaugeImp->SetValue(m_improwsnum%100);\r
-                else\r
-                    gaugeImp->SetValue(m_improwsnum*1000/m_srcsize);\r
-\r
-                stxtInsertedRows->SetLabel(wxString::Format(_("%d row(s) inserted, %d error(s)."), m_improwsnum-m_imperrnum, m_imperrnum));\r
-                elapsedspan = wxDateTime::UNow().Subtract(m_impstartdt).Subtract(m_imppausedts);\r
-                avgrowtime = elapsedspan.GetMilliseconds().ToLong()/m_improwsnum;\r
-                stxtElapsedTime->SetLabel(elapsedspan.Format(wxT("%H:%M:%S.%l")));\r
-                if (m_srcsize!=-1)\r
-                    stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(avgrowtime*(m_srcsize-m_improwsnum)).Format(wxT("%H:%M:%S.%l")));\r
-                stxtAvgRowTime->SetLabel(wxString::Format(_("%d ms"), avgrowtime));\r
-            }\r
+                RefreshProc();\r
 \r
             wzdctrlbtn = (wxButton*)FindWindowById(wxID_BACKWARD);\r
             wzdctrlbtn->Enable();\r
             m_procstatus = IMPPAUSED;\r
+            btnImpStart->Enable();\r
+            btnImpStop->Enable();\r
 \r
             return;\r
         }\r
@@ -2757,7 +2767,7 @@ void frmImport::ImportData()
         {\r
             if (impdest!=IMPDESTFILE)\r
             {\r
-                if (copybolcking)\r
+                if (needflush)\r
                 {\r
                     if (m_impconn->FlushData())\r
                     {\r
@@ -2810,10 +2820,9 @@ void frmImport::ImportData()
         }\r
         else\r
         {\r
-            if (impdest!=IMPDESTFILE)\r
+            if (needflush && impdest!=IMPDESTFILE)\r
             {\r
                 insstmt.Empty();\r
-                //_itow(m_improwsnum-1, imptranssn, 10);\r
                 swprintf(imptranssn, 32, wxT("%d"), m_improwsnum-1);\r
 \r
                 if (m_impconn->GetAsyncResult())\r
@@ -2997,15 +3006,7 @@ void frmImport::ImportData()
         gaugeImp->SetValue(gaugeImp->GetRange());\r
 \r
     if (!logproc && m_procstatus!=IMPERRORSTOP && m_procstatus!=IMPSTOPED)\r
-    {\r
-        stxtInsertedRows->SetLabel(wxString::Format(_("%d row(s) inserted, %d error(s)."), m_improwsnum-m_imperrnum, m_imperrnum));\r
-        elapsedspan = wxDateTime::UNow().Subtract(m_impstartdt).Subtract(m_imppausedts);\r
-        avgrowtime = elapsedspan.GetMilliseconds().ToLong()/m_improwsnum;\r
-        stxtElapsedTime->SetLabel(elapsedspan.Format(wxT("%H:%M:%S.%l")));\r
-        if (m_srcsize!=-1)\r
-            stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(avgrowtime*(m_srcsize-m_improwsnum)).Format(wxT("%H:%M:%S.%l")));\r
-        stxtAvgRowTime->SetLabel(wxString::Format(_("%d ms"), avgrowtime));\r
-    }\r
+        RefreshProc(false);\r
 \r
     btnImpStart->Disable();\r
     btnImpStop->Disable();\r
@@ -3039,6 +3040,42 @@ void frmImport::ImportData()
 \r
 }\r
 \r
+void frmImport::RefreshProc(bool incgauge)\r
+{\r
+    wxTimeSpan elapsedspan;\r
+    int avgrowtime;\r
+\r
+    stxtInsertedRows->SetLabel(wxString::Format(_("%d row(s) inserted, %d error(s), %d skipped."),\r
+            m_improwsnum-m_imperrnum, m_imperrnum, m_skiprowsnum));\r
+    elapsedspan = wxDateTime::UNow().Subtract(m_impstartdt).Subtract(m_imppausedts);\r
+    avgrowtime = elapsedspan.GetMilliseconds().ToLong()/(m_improwsnum + m_skiprowsnum);\r
+    stxtElapsedTime->SetLabel(elapsedspan.Format(wxT("%H:%M:%S.%l")));\r
+    stxtAvgRowTime->SetLabel(wxString::Format(_("%d ms"), avgrowtime));\r
+\r
+    if (m_srcsize==-1)\r
+    {\r
+        if (incgauge)\r
+            gaugeImp->SetValue((m_improwsnum + m_skiprowsnum)%100);\r
+    }\r
+    else\r
+    {\r
+        if (m_datasrctype==TEXTFILEPAGE || m_datasrctype==ARCHFILEPAGE)\r
+        {\r
+            if (incgauge)\r
+                gaugeImp->SetValue(m_srcfile->Tell()*1000/m_srcsize);\r
+            stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(elapsedspan.GetMilliseconds().ToLong()*((m_srcsize-m_srcfile->Tell())/m_srcfile->Tell())).Format(wxT("%H:%M:%S.%l")));\r
+        }\r
+#if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
+        else if (m_datasrctype==SRCODBCPAGE)\r
+        {\r
+            if (incgauge)\r
+                gaugeImp->SetValue(m_improwsnum*1000/m_srcsize);\r
+            stxtRemainingTime->SetLabel(wxTimeSpan::Milliseconds(avgrowtime*(m_srcsize-m_improwsnum)).Format(wxT("%H:%M:%S.%l")));\r
+        }\r
+#endif\r
+    }\r
+}\r
+\r
 bool frmImport::CheckWizardPage()\r
 {\r
     if (m_procstatus!=IMPPREPARED)\r
@@ -3125,6 +3162,23 @@ bool frmImport::CheckWizardPage()
             }\r
         }\r
 \r
+        if (txtFileOptStartWith->GetValue().IsEmpty())\r
+        {\r
+            if (m_fileoptstartwith)\r
+            {\r
+                delete m_fileoptstartwith;\r
+                m_fileoptstartwith = NULL;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            if (m_fileoptstartwith)\r
+                m_fileoptstartwith->Empty();\r
+            else\r
+                m_fileoptstartwith = new wxString;\r
+            m_fileoptstartwith->Append(txtFileOptStartWith->GetValue());\r
+        }\r
+\r
         if (chkFileCheckTrueFirst->GetValue())\r
         {\r
             wxString truevals = txtFileOptTrueVals->GetValue().Trim().Trim(false);\r
@@ -5154,46 +5208,54 @@ void frmImport::ResetWizardPage(WizardPageNumber pagenr)
             chcImpDest->SetSelection(0);\r
             txtDestFilePath->Disable();\r
             btnDestFileBrowse->Disable();\r
+            chkDestFileAppend->Disable();\r
         }\r
         else if (impdest==IMPDESTFCOPY || impdest==IMPDESTFINS)\r
         {\r
             chcImpDest->SetSelection(1);\r
             txtDestFilePath->Enable();\r
             btnDestFileBrowse->Enable();\r
+            chkDestFileAppend->Enable();\r
         }\r
         else if (impdest==IMPDESTTEST)\r
         {\r
             chcImpDest->SetSelection(2);\r
             txtDestFilePath->Disable();\r
             btnDestFileBrowse->Disable();\r
+            chkDestFileAppend->Disable();\r
         }\r
         else if (impdest==IMPDESTFTEST)\r
         {\r
             chcImpDest->SetSelection(3);\r
             txtDestFilePath->Enable();\r
             btnDestFileBrowse->Enable();\r
+            chkDestFileAppend->Enable();\r
         }\r
         else\r
         {\r
             chcImpDest->SetSelection(4);\r
             txtDestFilePath->Enable();\r
             btnDestFileBrowse->Enable();\r
+            chkDestFileAppend->Enable();\r
         }\r
 \r
         if (rdbLogToScreen->GetValue())\r
         {\r
             txtLogFilePath->Disable();\r
             btnLogFileBrowse->Disable();\r
+            chkLogFileAppend->Disable();\r
         }\r
         else if (rdbLogToFile->GetValue())\r
         {\r
             txtLogFilePath->Enable();\r
             btnLogFileBrowse->Enable();\r
+            chkLogFileAppend->Enable();\r
         }\r
         else\r
         {\r
             txtLogFilePath->Disable();\r
             btnLogFileBrowse->Disable();\r
+            chkLogFileAppend->Disable();\r
             rdbLogToScreen->SetValue(true);\r
         }\r
 \r
@@ -5624,11 +5686,11 @@ void frmImport::ResetColSettingOnEmptyColEditor(int dbcolnr)
             gce_onempty->Append(IMPERRORDISP);\r
             if ((!hassrccol || impmode==IMPORTMODEINSERT) && (!m_tgtcolsisnotnull[rowidx] || (m_tgtcolsisnotnull[rowidx] && m_tgtcolshasdef[rowidx])))\r
                 gce_onempty->Append(IMPDEFAULTDISP);\r
-            if (hassrccol && !m_tgtcolsisnotnull[rowidx])\r
+            if (!m_tgtcolsisnotnull[rowidx])\r
                 gce_onempty->Append(IMPNULLDISP);\r
             gce_onempty->Append(IMPBOOLFALSEDISP);\r
             gce_onempty->Append(IMPBOOLTRUEDISP);\r
-            if (impmode==IMPORTMODEINSERT && (m_origsrctype==TEXTFILEPAGE || m_origsrctype==ARCHFILEPAGE))\r
+            if (impmode==IMPORTMODEINSERT)\r
                 gce_onempty->Append(IMPEXPRDISP);\r
 \r
             if (onemptyact.IsEmpty() || !gce_onempty->Contains(onemptyact))\r
@@ -6205,10 +6267,7 @@ void frmImport::ParseColsImpSetting(int dbcolnr)
     int expcolnr, onemptycolnr, fmtcolnr;\r
     for (dbcolidx=loopstartnr; dbcolidx<loopuntilnr; dbcolidx++)\r
     {\r
-        if (m_datasrctype==SRCPGSQLPAGE)\r
-        {\r
-            continue;\r
-        }\r
+        m_colsettingiserr[dbcolidx] = false;\r
 \r
 #if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
         if (m_datasrctype==SRCODBCPAGE)\r
@@ -6433,13 +6492,9 @@ void frmImport::ParseColsImpSetting(int dbcolnr)
                         txtColsSettingLog->AppendText(_(" -- Please specify a constant for NOT NULL column: ") + *m_tgtcolsnames[dbcolidx]);\r
                         gridColSetting->SetCellBackgroundColour(dbcolidx, expcolnr, *wxRED);\r
 \r
+                        m_colsettingiserr[dbcolidx] = true;\r
                         if (dbcolnr==wxNOT_FOUND || !origcolerr)\r
-                            //m_colsettingerrnum++;\r
-                        //else if (!origcolerr)\r
-                        {\r
-                            m_colsettingiserr[dbcolidx] = true;\r
                             m_colsettingerrnum++;\r
-                        }\r
                     }\r
                     else\r
                     {\r
@@ -6475,13 +6530,9 @@ void frmImport::ParseColsImpSetting(int dbcolnr)
                         txtColsSettingLog->AppendText(_(" -- Please specify a expression for NOT NULL column: ") + *m_tgtcolsnames[dbcolidx]);\r
                         gridColSetting->SetCellBackgroundColour(dbcolidx, expcolnr, *wxRED);\r
 \r
+                        m_colsettingiserr[dbcolidx] = true;\r
                         if (dbcolnr==wxNOT_FOUND || !origcolerr)\r
-                            //m_colsettingerrnum++;\r
-                        //else if (!origcolerr)\r
-                        {\r
-                            m_colsettingiserr[dbcolidx] = true;\r
                             m_colsettingerrnum++;\r
-                        }\r
                     }\r
                     else\r
                     {\r
@@ -6532,23 +6583,16 @@ void frmImport::ParseColsImpSetting(int dbcolnr)
             txtColsSettingLog->AppendText(_("Error"));\r
             txtColsSettingLog->AppendText(_(" -- Can't import any rows since setting error: ") + *m_tgtcolsnames[dbcolidx]);\r
             gridColSetting->SetCellBackgroundColour(dbcolidx, onemptycolnr, *wxRED);\r
-            \r
+\r
+            m_colsettingiserr[dbcolidx] = true;\r
             if (dbcolnr==wxNOT_FOUND || !origcolerr)\r
-                //m_colsettingerrnum++;\r
-            //else if (!origcolerr)\r
-            {\r
-                m_colsettingiserr[dbcolidx] = true;\r
                 m_colsettingerrnum++;\r
-            }\r
         }\r
-        else\r
+        if (!m_colsettingiserr[dbcolidx])\r
         {\r
             gridColSetting->SetCellBackgroundColour(dbcolidx, onemptycolnr, *wxWHITE);\r
             if (origcolerr)\r
-            {\r
-                m_colsettingiserr[dbcolidx] = false;\r
                 m_colsettingerrnum--;\r
-            }\r
         }\r
 \r
         if (impmode==IMPORTMODEINSERT && dbcolnr==wxNOT_FOUND)\r
index eb3a2c9d6887c5befe6dee1b35ebf049b1cfd96b..36e0755c91004174e0536e769010356b3e9e56e7 100755 (executable)
@@ -178,10 +178,8 @@ private:
     static void RandomSavepointName(wxChar* randname, short namelen=10);\r
 \r
     void ImportData();\r
-    void ImportFileData();\r
-#if defined(__WXMSW__) || defined(__WITHIODBC__) || defined(__WITHUNIXODBC__)\r
-    void ImportODBCData();\r
-#endif\r
+    void RefreshProc(bool incgauge=true);\r
+\r
     bool ImportRow(wxString& impdatalist, const int impmode, const int impdest,\r
                 bool& copybolcking, bool logtoscr, bool logtofile,\r
                 bool logerror, bool logwarn, bool logstmt, bool loginfo, bool logproc,\r
@@ -212,8 +210,9 @@ private:
     pgCSVFile *m_srcfile;\r
     bool m_datapverr;\r
 \r
-    // match regular expression\r
+    // match regular expression & start with\r
     wxRegEx *m_fileoptimpregex;\r
+    wxString *m_fileoptstartwith;\r
 \r
     // boolean values\r
     wxArrayString *m_booltruevals;\r
@@ -250,8 +249,8 @@ private:
     int m_procstatus;\r
     wxFile *m_destfile, *m_logfile;\r
     wxFileOffset m_srcsize;\r
-    wxFileOffset m_improwsnum;\r
-    int m_imperrnum, m_transrowsnum;\r
+    unsigned int m_improwsnum, m_skiprowsnum;\r
+    unsigned int m_imperrnum, m_transrowsnum;\r
     wxChar m_imptransname[16];\r
     wxChar m_imptranssn[32];\r
     wxDateTime m_impstartdt, m_imppausedt;\r
index 85743aacc86e21d9648c6d10a68ec7cf63bc6701..3f8f0719e440507325d5959dd72f68701185568c 100755 (executable)
@@ -60,7 +60,7 @@ public:
 // setting relative functions\r
 public:\r
     wxFileOffset Length() { return m_filesize; }\r
-    wxFileOffset Tell();\r
+    wxFileOffset Tell() { return m_fileoffset; }\r
     bool Eof();\r
 \r
     wxString GetFilePath() { return m_filepath; }\r
@@ -156,7 +156,8 @@ public:
     size_t GetCurCSVLineNr() { return m_csvlinenr; }\r
 \r
 private:\r
-    void Init();\r
+    wxFileOffset TellI();\r
+    //void Init();\r
 \r
     void GenHeader();\r
     bool ValidateSetting();\r
@@ -189,7 +190,6 @@ private:
        bool m_firstrowisheader;// the first line is header\r
     bool m_backslashquote;// backslash-quote style\r
        wxChar m_quotedby;\r
-    //bool m_canpreview;\r
     size_t m_pvrowsnum;\r
     bool m_forcelinebreak;\r
 \r
@@ -200,8 +200,9 @@ private:
        wxString m_filepath;// text file path\r
        wxFile *m_rawfile;// corresponding file\r
     wxFileOffset m_filesize;\r
-    //wxFileOffset m_fileoffset;\r
-    //short m_charwidth;\r
+    wxFileOffset m_baseoffset;\r
+    wxFileOffset m_fileoffset;\r
+    float m_charavglen;\r
 \r
     size_t m_linenumber;// current file line number\r
     size_t m_csvrownr;\r
index 0b4a349015dbef77585e973753ad654df24658a5..d9490e47595789203c1056d9da7aaae93bf48069 100755 (executable)
                                 <maxlength>0</maxlength>\r
                             </object>\r
                         </object>\r
+                        <object class="sizeritem">\r
+                            <option>0</option>\r
+                            <flag>wxALL</flag>\r
+                            <border>5</border>\r
+                            <object class="wxStaticText" name="m_staticText71">\r
+                                <label>Start with</label>\r
+                            </object>\r
+                        </object>\r
+                        <object class="sizeritem">\r
+                            <option>0</option>\r
+                            <flag>wxALL</flag>\r
+                            <border>5</border>\r
+                            <object class="wxTextCtrl" name="txtFileOptStartWith">\r
+                                <value></value>\r
+                                <maxlength>0</maxlength>\r
+                            </object>\r
+                        </object>\r
                         <object class="sizeritem">\r
                             <option>0</option>\r
                             <flag>wxALL</flag>\r
                             <border>5</border>\r
                             <object class="wxFlexGridSizer">\r
                                 <rows>1</rows>\r
-                                <cols>2</cols>\r
+                                <cols>3</cols>\r
                                 <vgap>0</vgap>\r
                                 <hgap>0</hgap>\r
                                 <growablecols>0</growablecols>\r
                                         <default>0</default>\r
                                     </object>\r
                                 </object>\r
+                                <object class="sizeritem">\r
+                                    <option>0</option>\r
+                                    <flag>wxALL</flag>\r
+                                    <border>5</border>\r
+                                    <object class="wxCheckBox" name="chkDestFileAppend">\r
+                                        <label>Append</label>\r
+                                        <checked>0</checked>\r
+                                    </object>\r
+                                </object>\r
                             </object>\r
                         </object>\r
                         <object class="sizeritem">\r
                             <border>5</border>\r
                             <object class="wxFlexGridSizer">\r
                                 <rows>1</rows>\r
-                                <cols>2</cols>\r
+                                <cols>3</cols>\r
                                 <vgap>0</vgap>\r
                                 <hgap>0</hgap>\r
                                 <growablecols>0</growablecols>\r
                                         <default>0</default>\r
                                     </object>\r
                                 </object>\r
+                                <object class="sizeritem">\r
+                                    <option>0</option>\r
+                                    <flag>wxALL</flag>\r
+                                    <border>5</border>\r
+                                    <object class="wxCheckBox" name="chkLogFileAppend">\r
+                                        <label>Append</label>\r
+                                        <checked>0</checked>\r
+                                    </object>\r
+                                </object>\r
                             </object>\r
                         </object>\r
                         <object class="sizeritem">\r
index 9f175789e7549aad9d9680c3079f757b44b9b62b..7a7459f7ddec3debd7de1efc208340dff3d65c23 100755 (executable)
@@ -67,7 +67,10 @@ pgCSVFile::pgCSVFile()
     m_csvlinenr = 0;\r
 \r
     m_filesize = 0;\r
-    //m_fileoffset = 0;\r
+    m_baseoffset = 0;\r
+    m_fileoffset = 0;\r
+    m_charavglen = 0;\r
+\r
     m_settingisok = true;\r
     //Init();\r
 }\r
@@ -747,7 +750,7 @@ void pgCSVFile::Close()
     m_ferrmsg = _("File closed.");\r
 }\r
 \r
-wxFileOffset pgCSVFile::Tell()\r
+wxFileOffset pgCSVFile::TellI()\r
 {\r
 #if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS && (wxUSE_ZIPSTREAM || wxUSE_TARSTREAM)\r
 #if wxUSE_ZIPSTREAM\r
@@ -2451,10 +2454,11 @@ bool pgCSVFile::EndPreview()
     size_t pvcurbufsz, readlen = 0;\r
 \r
     m_parsedoffset = 0;\r
+    size_t parsedoffset = (size_t)0;\r
     if (m_firstrowisheader)\r
     {\r
         wxFileOffset parsedrs;\r
-        size_t curcolnr = (size_t)0, parsedoffset = (size_t)0;\r
+        size_t curcolnr = (size_t)0;\r
         wxString **parsedvals;\r
         if (m_delimitedbychar)\r
         {\r
@@ -2509,6 +2513,10 @@ bool pgCSVFile::EndPreview()
     if (leftbyte)\r
         memcpy(m_leftbuf+MAXWORDSZ-leftbyte, pvbufdata+m_pvdecoffset+readlen, leftbyte);\r
 \r
+    m_charavglen = TellI()*1.0/(parsedoffset+m_curfilecont.Len());\r
+    if (parsedoffset)\r
+        m_fileoffset = (wxFileOffset)parsedoffset*m_charavglen;\r
+\r
     ClearPreview();\r
 \r
     return true;\r
@@ -2536,14 +2544,21 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
     wxFileOffset parsedrs;\r
     size_t curcolnr = (size_t)0, parsedoffset = m_parsedoffset, convlen;\r
     wxString **parsedvals = NULL;\r
-    char* readbuf = NULL;\r
     bool incolparsing = false, inquotedblk = false;\r
     wxString convstr, tmpstr;\r
+    char* readbuf = NULL;\r
+    size_t bufoffs = 0, readlen;\r
+    wxCSConv *txtconv = NULL;\r
 \r
     while (true)\r
     {\r
         if (!filedata[m_parsedoffset])\r
+        {\r
             parsedrs = wxInvalidOffset;\r
+            m_curfilecont.Empty();\r
+            m_parsedoffset = 0;\r
+            m_baseoffset = TellI();\r
+        }\r
         else if (m_delimitedbychar)\r
             parsedvals = ParseLine(filedata, &parsedoffset, !Eof(), parsedvals, &curcolnr,\r
                     &incolparsing, &inquotedblk, &parsedrs, &m_filelinenr, &linedata);\r
@@ -2559,7 +2574,6 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
             if (!readbuf)\r
                 readbuf = new char[READBUFSZ];\r
             memcpy(readbuf, m_leftbuf, MAXWORDSZ);\r
-            size_t bufoffs = 0, readlen;\r
             while (!readbuf[bufoffs] && bufoffs<MAXWORDSZ)\r
                 bufoffs++;\r
 \r
@@ -2569,6 +2583,7 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
             {\r
                 m_zipinstrm->Read(readbuf + MAXWORDSZ, READBLKSZ);\r
                 readlen = m_zipinstrm->LastRead();\r
+                txtconv = m_entryconv;\r
             }\r
 #endif\r
 #if wxUSE_TARSTREAM\r
@@ -2576,14 +2591,18 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
             {\r
                 m_tarinstrm->Read(readbuf + MAXWORDSZ, READBLKSZ);\r
                 readlen = m_tarinstrm->LastRead();\r
+                txtconv = m_entryconv;\r
             }\r
 #endif\r
 #endif\r
             if (m_rawfile)\r
+            {\r
                 readlen = m_rawfile->Read(readbuf + MAXWORDSZ, READBLKSZ);\r
+                txtconv = m_fileconv;\r
+            }\r
 \r
             memset(readbuf + MAXWORDSZ + readlen, 0, READBUFSZ - MAXWORDSZ - readlen);\r
-            convlen = MB2str(m_fileconv, &convstr, readbuf, bufoffs, readlen);\r
+            convlen = MB2str(txtconv, &convstr, readbuf, bufoffs, readlen);\r
             if (convlen==wxCONV_FAILED)\r
             {\r
                 m_fencisok = false;\r
@@ -2598,12 +2617,17 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
 \r
             if (m_parsedoffset)\r
             {\r
+                m_baseoffset = TellI() - (m_curfilecont.Len()-m_parsedoffset)*m_charavglen;\r
+                m_charavglen = ((m_curfilecont.Len()-m_parsedoffset)+convstr.Len())/\r
+                        ((m_curfilecont.Len()-m_parsedoffset)*m_charavglen + (MAXWORDSZ-bufoffs) + readlen);\r
                 wxString tmpfilecont(m_curfilecont.GetData()+m_parsedoffset);\r
                 m_curfilecont.Empty();\r
                 m_curfilecont.Append(tmpfilecont);\r
                 parsedoffset -= m_parsedoffset;\r
                 m_parsedoffset = 0;\r
             }\r
+            else\r
+                m_charavglen = (m_curfilecont.Len()*m_charavglen+(MAXWORDSZ-bufoffs) + readlen)/convstr.Len();\r
 \r
             m_curfilecont.Append(convstr);\r
             filedata = m_curfilecont.GetData();\r
@@ -2615,6 +2639,7 @@ bool pgCSVFile::NextLine(wxString& linedata, wxString**& linevals, int &valsnum)
     m_prevcolvals = linevals = parsedvals;\r
     m_prevcolnum = valsnum = curcolnr+1;\r
     m_parsedoffset = parsedoffset;\r
+    m_fileoffset = m_baseoffset + (wxFileOffset)m_parsedoffset*m_charavglen;\r
     m_csvlinenr++;\r
 \r
     if (readbuf)\r