Bug #11954 fixed - export_to_hdf5 was not able to export the same variable twice. 17/10517/3
Antoine ELIAS [Mon, 18 Feb 2013 14:04:05 +0000 (15:04 +0100)]
Change-Id: I65a9002057f55e2c0bb0f16037ffb5732e0ed588

scilab/CHANGES_5.4.X
scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/tests/nonreg_tests/bug_11954.dia.ref [new file with mode: 0644]
scilab/modules/hdf5/tests/nonreg_tests/bug_11954.tst [new file with mode: 0644]

index d4eac81..3477e4a 100644 (file)
@@ -249,6 +249,8 @@ Bug fixes
 * Bug #11952 fixed - In SciNotes, a Java exception occured on selection of text
                     containing a \E.
 
+* Bug #11954 fixed - export_to_hdf5 was not able to export the same variable twice.
+
 * Bug #11958 fixed - axesflag=0 was not taken into account in plot2d3.
 
 * Bug #11962 fixed - event_handler may be called on wrong figure_id.
index 4ac92b4..253ac77 100644 (file)
@@ -39,6 +39,8 @@ extern "C"
 //#define PRINT_DEBUG
 int iLevel = 0;
 
+static bool isVarExist(int _iFile, char* _pstVarName);
+
 static bool export_data(int _iH5File, int *_piVar, char* _pstName);
 static bool export_list(int _iH5File, int *_piVar, char* _pstName, int _iVarType);
 static bool export_double(int _iH5File, int *_piVar, char* _pstName);
@@ -103,8 +105,6 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         }
     }
 
-    //check append option
-
     iLevel = 0;
     // open hdf5 file
     pstFileName = expandPathVariable(pstNameList[0]);
@@ -148,51 +148,6 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             Scierror(999, _("%s: Wrong SOD file format version. Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
             return 1;
         }
-
-        //check if variable already exists
-        int iNbItem = getVariableNames(iH5File, NULL);
-        if (iNbItem)
-        {
-            char **pstVarNameList = (char **)MALLOC(sizeof(char *) * iNbItem);
-
-            iNbItem = getVariableNames(iH5File, pstVarNameList);
-
-            //import all data
-            for (int i = 0 ; i < iNbItem ; i++)
-            {
-                for (int j = 1 ; j < iRhs ; j++)
-                {
-                    if (strcmp(pstNameList[j], "-append") == 0)
-                    {
-                        continue;
-                    }
-
-                    if (strcmp(pstVarNameList[i], pstNameList[j]) == 0)
-                    {
-                        if (bAppendMode == false)
-                        {
-                            closeHDF5File(iH5File);
-                            Scierror(999, _("%s: Variable \'%s\' already exists in file \'%s\'\nUse -append option to replace existing variable\n."), fname, pstVarNameList[i], pstNameList[0]);
-                            return 1;
-                        }
-                        else
-                        {
-                            if (deleteHDF5Var(iH5File, pstVarNameList[i]))
-                            {
-                                //failed to clean
-                                Scierror(999, _("%s: Unable to delete existing variable \"%s\"."), fname, pstVarNameList[i]);
-                                return 1;
-                            }
-                            continue;
-                        }
-                    }
-                }
-
-                FREE(pstVarNameList[i]);
-            }
-
-            FREE(pstVarNameList);
-        }
     }
 
     // export data
@@ -203,6 +158,25 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             continue;
         }
 
+        if (isVarExist(iH5File, pstNameList[i]))
+        {
+            if (bAppendMode)
+            {
+                if (deleteHDF5Var(iH5File, pstNameList[i]))
+                {
+                    closeHDF5File(iH5File);
+                    Scierror(999, _("%s: Unable to delete existing variable \"%s\"."), fname, pstNameList[i]);
+                    return 1;
+                }
+            }
+            else
+            {
+                closeHDF5File(iH5File);
+                Scierror(999, _("%s: Variable \'%s\' already exists in file \'%s\'\nUse -append option to replace existing variable\n."), fname, pstNameList[i], pstNameList[0]);
+                return 1;
+            }
+        }
+
         bExport = export_data(iH5File, piAddrList[i], pstNameList[i]);
         if (bExport == false)
         {
@@ -949,4 +923,30 @@ int extractVarNameList(int _iStart, int _iEnd, char** _pstNameList)
     return iCount;
 }
 
+static bool isVarExist(int _iFile, char* _pstVarName)
+{
+    //check if variable already exists
+    int iNbItem = getVariableNames(_iFile, NULL);
+    if (iNbItem)
+    {
+        char **pstVarNameList = (char **)MALLOC(sizeof(char *) * iNbItem);
+
+        iNbItem = getVariableNames(_iFile, pstVarNameList);
+
+        //import all data
+        for (int i = 0 ; i < iNbItem ; i++)
+        {
+            if (strcmp(pstVarNameList[i], _pstVarName) == 0)
+            {
+                return true;
+            }
+
+            FREE(pstVarNameList[i]);
+        }
+
+        FREE(pstVarNameList);
+    }
+
+    return false;
+}
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_11954.dia.ref b/scilab/modules/hdf5/tests/nonreg_tests/bug_11954.dia.ref
new file mode 100644 (file)
index 0000000..22770ce
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 11954 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11954
+//
+// <-- Short Description -->
+// 
+// save with two times the same name leads to an HDF5 error.
+x=123
+ x  =
+    123.  
+assert_checkerror("export_to_hdf5(TMPDIR + ""toto"" ,""x"", ""x"")", [], 999);
+assert_checktrue(export_to_hdf5(TMPDIR + "bug_11954.sod", "x", "x", "-append"));
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_11954.tst b/scilab/modules/hdf5/tests/nonreg_tests/bug_11954.tst
new file mode 100644 (file)
index 0000000..9aa0197
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 11954 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11954
+//
+// <-- Short Description -->
+// 
+// save with two times the same name leads to an HDF5 error.
+
+x=123
+assert_checkerror("export_to_hdf5(TMPDIR + ""toto"" ,""x"", ""x"")", [], 999);
+assert_checktrue(export_to_hdf5(TMPDIR + "bug_11954.sod", "x", "x", "-append"));