add scilab and SOD (hdf5 scilab open data format) version in hdf5 file 15/7215/6
Antoine ELIAS [Tue, 22 May 2012 11:18:07 +0000 (13:18 +0200)]
Change-Id: I488afdb754689dc1264ddeb38f0b5a42e21320f9

scilab/modules/hdf5/includes/h5_attributeConstants.h
scilab/modules/hdf5/includes/h5_readDataFromFile.h
scilab/modules/hdf5/includes/h5_writeDataToFile.h
scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/src/c/h5_readDataFromFile.c
scilab/modules/hdf5/src/c/h5_writeDataToFile.c

index 3f0da03..8865533 100644 (file)
 #ifndef __H5_ATTRIBUTECONSTATS_H__
 #define __H5_ATTRIBUTECONSTATS_H__
 
-//#define SCILAB_CLASS                 "SCILAB_Class"
-//#define SCILAB_CLASS_DOUBLE          "double"
-//#define SCILAB_CLASS_STRING          "string"
-//#define SCILAB_CLASS_LIST            "list"
-//#define SCILAB_CLASS_TLIST           "tlist"
-//#define SCILAB_CLASS_MLIST           "mlist"
+#define SOD_FILE_VERSION     1
 
 static const char g_SCILAB_CLASS[]              =      "SCILAB_Class";
 static const char g_SCILAB_CLASS_EMPTY[]        =      "SCILAB_empty";
@@ -28,6 +23,8 @@ static const char g_SCILAB_CLASS_PREC[]         =     "SCILAB_precision";
 static const char g_SCILAB_CLASS_ROWS[]         =      "SCILAB_rows";
 static const char g_SCILAB_CLASS_COLS[]         =      "SCILAB_cols";
 static const char g_SCILAB_CLASS_ITEMS[]        =      "SCILAB_items";
+static const char g_SCILAB_CLASS_SOD_VERSION[] =       "SCILAB_sod_version";
+static const char g_SCILAB_CLASS_SCI_VERSION[]  =      "SCILAB_scilab_version";
 
 
 static const char g_SCILAB_CLASS_DOUBLE[]       =      "double";
@@ -44,11 +41,11 @@ static const char g_SCILAB_CLASS_VOID[]         =   "void";
 static const char g_SCILAB_CLASS_UNDEFINED[]    =      "undefined";
 
 //interger precision
-#define SCI_INT8               1
-#define SCI_INT16              2
-#define SCI_INT32              4
-#define SCI_INT64              8
-#define SCI_UINT8              11
+#define SCI_INT8       1
+#define SCI_INT16      2
+#define SCI_INT32      4
+#define SCI_INT64      8
+#define SCI_UINT8      11
 #define SCI_UINT16     12
 #define SCI_UINT32     14
 #define SCI_UINT64     18
index 08bb159..0d7f9c6 100644 (file)
@@ -1,13 +1,13 @@
 /*
  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
- * 
+ *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
  *  you should have received as part of this distribution.  The terms
  *  are also available at
  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- * 
+ *
  */
 
 #ifndef __H5_READDATATOFILE_H__
@@ -21,6 +21,9 @@
 #define sci_undefined   -1
 #define sci_void        0
 
+char* getScilabVersionAttribute(int _iFile);
+int getSODFormatAttribute(int _iFile);
+
 HDF5_SCILAB_IMPEXP int isComplexData(int _iDatasetId);
 
 HDF5_SCILAB_IMPEXP int getVariableNames(int _iFile, char **pstNameList);
index 867e202..46099cd 100644 (file)
@@ -15,6 +15,9 @@
 
 #include "dynlib_hdf5_scilab.h"
 
+HDF5_SCILAB_IMPEXP int updateFileVersion(int _iFile);
+HDF5_SCILAB_IMPEXP int updateScilabVersion(int _iFile);
+
 HDF5_SCILAB_IMPEXP char* createGroupName(char* _pstGroupName);
 HDF5_SCILAB_IMPEXP char* createPathName(char* _pstGroupName, int _iIndex);
 
index d84a73c..d23e8d2 100644 (file)
@@ -25,6 +25,7 @@ extern "C"
 #include "h5_fileManagement.h"
 #include "h5_writeDataToFile.h"
 #include "h5_readDataFromFile.h"
+#include "h5_attributeConstants.h"
 #include "freeArrayOfString.h"
 #ifdef _MSC_VER
 #include "strdup_windows.h"
@@ -89,7 +90,7 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
     piAddrList = (int**)MALLOC(sizeof(int*) * (iNbVar));
     for (int i = 1 ; i < Rhs ; i++)
     {
-        if(strcmp(pstNameList[i], "-append") == 0)
+        if (strcmp(pstNameList[i], "-append") == 0)
         {
             bAppendMode = true;
         }
@@ -111,10 +112,10 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
     // open hdf5 file
     pstFileName = expandPathVariable(pstNameList[0]);
     int iH5File = 0;
-    if(bAppendMode)
+    if (bAppendMode)
     {
         iH5File = openHDF5File(pstFileName);
-        if(iH5File < 0)
+        if (iH5File < 0)
         {
             iH5File = createHDF5File(pstFileName);
         }
@@ -140,28 +141,34 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         return 1;
     }
 
-
-    if(bAppendMode)
+    if (bAppendMode)
     {
+        int iVersion = getSODFormatAttribute(iH5File);
+        if (iVersion != -1 && iVersion != SOD_FILE_VERSION)
+        {
+            Scierror(999, _("%s: Wrong hdf5 file format version. Expected: %d from file: %d\n"), fname, SOD_FILE_VERSION, iVersion);
+            return 1;
+        }
+
         //check if variable already exists
         int iNbItem = getVariableNames(iH5File, NULL);
-        if(iNbItem)
+        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 i = 0 ; i < iNbItem ; i++)
             {
-                for(int j = 1 ; j < Rhs ; j++)
+                for (int j = 1 ; j < Rhs ; j++)
                 {
-                    if(strcmp(pstNameList[i], "-append") == 0)
+                    if (strcmp(pstNameList[i], "-append") == 0)
                     {
                         continue;
                     }
 
-                    if(strcmp(pstVarNameList[i], pstNameList[j]) == 0)
+                    if (strcmp(pstVarNameList[i], pstNameList[j]) == 0)
                     {
 
                         Scierror(999, _("%s: Variable \'%s\' already exists in file \'%s\'."), fname, pstVarNameList[i], pstNameList[0]);
@@ -177,7 +184,7 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
     // export data
     for (int i = 1 ; i < Rhs ; i++)
     {
-        if(strcmp(pstNameList[i], "-append") == 0)
+        if (strcmp(pstNameList[i], "-append") == 0)
         {
             continue;
         }
@@ -189,6 +196,22 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         }
     }
 
+    if (bExport)
+    {
+        //add or update scilab version and file version in hdf5 file
+        if (updateScilabVersion(iH5File) < 0)
+        {
+            Scierror(999, _("%s: Unable to update Scilab version in \"%s\"."), fname, pstNameList[0]);
+            return 1;
+        }
+
+        if (updateFileVersion(iH5File) < 0)
+        {
+            Scierror(999, _("%s: Unable to update HDF5 format version in \"%s\"."), fname, pstNameList[0]);
+            return 1;
+        }
+    }
+
     //close hdf5 file
     closeHDF5File(iH5File);
     if (bExport == false)
@@ -218,7 +241,7 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
 
 
     //free memory
-    for(int i = 0 ; i < Rhs ; i++)
+    for (int i = 0 ; i < Rhs ; i++)
     {
         FREE(pstNameList[i]);
     }
@@ -323,7 +346,7 @@ static bool export_data(int _iH5File, int* _piVar, char* _pstName)
             break;
         }
 
-        default : 
+        default :
         {
             bReturn = false;
             break;
@@ -900,7 +923,7 @@ int extractVarNameList(int _iStart, int _iEnd, char** _pstNameList)
             return 0;
         }
 
-        if(getAllocatedSingleString(pvApiCtx, piAddr, &_pstNameList[iCount]))
+        if (getAllocatedSingleString(pvApiCtx, piAddr, &_pstNameList[iCount]))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), "export_to_hdf5", i);
             return 0;
index 392ad36..5ee23b4 100644 (file)
@@ -58,15 +58,15 @@ static herr_t op_func(hid_t loc_id, const char *name, void *operator_data)
 
     switch (statbuf.type)
     {
-    case H5G_GROUP:
-        break;
-    case H5G_DATASET:
-        *pDataSetId = H5Dopen(loc_id, name);
-        break;
-    case H5G_TYPE:
-        break;
-    default:
-        break;
+        case H5G_GROUP:
+            break;
+        case H5G_DATASET:
+            *pDataSetId = H5Dopen(loc_id, name);
+            break;
+        case H5G_TYPE:
+            break;
+        default:
+            break;
     }
 
     return 0;
@@ -76,33 +76,35 @@ static int readIntAttribute(int _iDatasetId, const char *_pstName)
 {
     hid_t iAttributeId;
     herr_t status;
-    int iVal = 0;
+    int iVal = -1;
 
-    iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
-    if (iAttributeId < 0)
+    if (H5Aiterate(_iDatasetId, NULL, find_attr_by_name, (void *)_pstName))
     {
-        return 0;
-    }
+        iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
+        if (iAttributeId < 0)
+        {
+            return -1;
+        }
 
-    status = H5Aread(iAttributeId, H5T_NATIVE_INT, &iVal);
-    if (status < 0)
-    {
-        return 0;
-    }
+        status = H5Aread(iAttributeId, H5T_NATIVE_INT, &iVal);
+        if (status < 0)
+        {
+            return -1;
+        }
 
-    status = H5Aclose(iAttributeId);
-    if (status < 0)
-    {
-        return 0;
+        status = H5Aclose(iAttributeId);
+        if (status < 0)
+        {
+            return -1;
+        }
     }
-
     return iVal;
 }
 
 /*
 ** WARNING : this function returns an allocated value that must be freed.
 */
-static char *readAttribute(int _iDatasetId, const char *_pstName)
+static char* readAttribute(int _iDatasetId, const char *_pstName)
 {
     hid_t iAttributeId;
     hid_t iFileType, memtype, iSpace;
@@ -213,6 +215,19 @@ static int checkAttribute(int _iDatasetId, char *_pstAttribute, char *_pstValue)
     return iRet;
 }
 
+/*
+** WARNING : this function returns an allocated value that must be freed.
+*/
+char* getScilabVersionAttribute(int _iFile)
+{
+    return readAttribute(_iFile, g_SCILAB_CLASS_SCI_VERSION);
+}
+
+int getSODFormatAttribute(int _iFile)
+{
+    return readIntAttribute(_iFile, g_SCILAB_CLASS_SOD_VERSION);
+}
+
 int getDatasetDimension(int _iDatasetId, int *_piRows, int *_piCols)
 {
     int iRet = 0;
@@ -475,7 +490,8 @@ int readDoubleComplexMatrix(int _iDatasetId, int _iRows, int _iCols, double *_pd
 }
 
 int readEmptyMatrix(int _iDatasetId)
-{                               //close dataset
+{
+    //close dataset
     herr_t status;
 
     status = H5Dclose(_iDatasetId);
index 409ba17..b6dda62 100644 (file)
 #include <math.h>
 #include <string.h>
 #include "sci_types.h"
+#include "version.h"
 #include "core_math.h"
 #include "h5_writeDataToFile.h"
+#include "h5_readDataFromFile.h"
 #include "h5_attributeConstants.h"
 
 static hid_t enableCompression(int _iLevel, int _iRank, const hsize_t * _piDims)
@@ -27,55 +29,55 @@ static hid_t enableCompression(int _iLevel, int _iRank, const hsize_t * _piDims)
     int iLevel = _iLevel;*/
 
     return H5P_DEFAULT;
-/*
-  if(iLevel < 0)
-    {
-        iLevel = 0;
-    }
-
-  if(iLevel > 9)
-    {
-        iLevel = 9;
-    }
+    /*
+      if(iLevel < 0)
+        {
+            iLevel = 0;
+        }
 
-    if(iLevel)
-    {
-        iRet = H5Pcreate(H5P_DATASET_CREATE);
-        if(iRet < 0)
+      if(iLevel > 9)
         {
-            iRet = 0;
+            iLevel = 9;
         }
-        else
+
+        if(iLevel)
         {
-            if(H5Pset_layout(iRet,H5D_COMPACT)<0)
+            iRet = H5Pcreate(H5P_DATASET_CREATE);
+            if(iRet < 0)
             {
-                H5Pclose(iRet);
                 iRet = 0;
             }
             else
             {
-                if(H5Pset_chunk(iRet,_iRank, _piDims)<0)
+                if(H5Pset_layout(iRet,H5D_COMPACT)<0)
                 {
                     H5Pclose(iRet);
                     iRet = 0;
                 }
                 else
                 {
-                    if(H5Pset_deflate(iRet,iLevel)<0)
+                    if(H5Pset_chunk(iRet,_iRank, _piDims)<0)
                     {
                         H5Pclose(iRet);
                         iRet = 0;
                     }
+                    else
+                    {
+                        if(H5Pset_deflate(iRet,iLevel)<0)
+                        {
+                            H5Pclose(iRet);
+                            iRet = 0;
+                        }
+                    }
                 }
             }
         }
-    }
-    else
-    {
-        iRet = H5Pcopy(H5P_DEFAULT);
-    }
-    return iRet;
-*/
+        else
+        {
+            iRet = H5Pcopy(H5P_DEFAULT);
+        }
+        return iRet;
+    */
 }
 
 static herr_t addIntAttribute(int _iDatasetId, const char *_pstName, const int _iVal)
@@ -162,75 +164,55 @@ static herr_t addAttribute(int _iDatasetId, const char *_pstName, const char *_p
     return 0;
 }
 
-/*
-static int writeString(int _iFile, char *_pstDatasetName, char *_pstData)
+
+int updateScilabVersion(int _iFile)
 {
-    hsize_t dims[1] = { 1 };
-    hid_t typeId, space, dset;
     herr_t status;
-    hid_t iCompress;
-
-    //Create string dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    space = H5Screate_simple(1, dims, NULL);
-    if (space < 0)
+    //try to read attribute
+    char* pstScilabVersion = getScilabVersionAttribute(_iFile);
+    if (pstScilabVersion)
     {
-        return -1;
-    }
-
-    //Create special string type
-    typeId = H5Tcopy(H5T_C_S1);
-    if (strlen(_pstData) > 0)
-    {
-        status = H5Tset_size(typeId, strlen(_pstData));
+        //delete before write
+        status = H5Adelete(_iFile, g_SCILAB_CLASS_SCI_VERSION);
         if (status < 0)
         {
             return -1;
         }
     }
 
-    //Create the data set and write it.
-    iCompress = enableCompression(9, 1, dims);
-    dset = H5Dcreate(_iFile, _pstDatasetName, typeId, space, iCompress);
-    if (dset < 0)
-    {
-        return -1;
-    }
-
-    status = H5Dwrite(dset, typeId, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pstData);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class = string to dataset
-    status = addAttribute(dset, g_SCILAB_CLASS, g_SCILAB_CLASS_STRING);
-    if (status < 0)
+    if (strstr(SCI_VERSION_STRING, "branch"))
     {
-        return -1;
+        //compiled by user
+        char pstVersion[64];
+        sprintf(pstVersion, "%s %d.%d.%d", SCI_VERSION_STRING, SCI_VERSION_MAJOR, SCI_VERSION_MINOR, SCI_VERSION_MAINTENANCE);
+        status = addAttribute(_iFile, g_SCILAB_CLASS_SCI_VERSION, pstVersion);
     }
-
-    //Close and release resources.
-    status = H5Dclose(dset);
-    if (status < 0)
+    else
     {
-        return -1;
+        //compiled by compilation chain
+        status = addAttribute(_iFile, g_SCILAB_CLASS_SCI_VERSION, SCI_VERSION_STRING);
     }
 
-    status = H5Tclose(typeId);
-    if (status < 0)
-    {
-        return -1;
-    }
+    return status;
+}
 
-    status = H5Sclose(space);
-    if (status < 0)
+int updateFileVersion(int _iFile)
+{
+    herr_t status;
+    //try to read attribute
+    int iHdf5Version = getSODFormatAttribute(_iFile);
+    if (iHdf5Version != -1)
     {
-        return -1;
+        status = H5Adelete(_iFile, g_SCILAB_CLASS_SOD_VERSION);
+        if (status < 0)
+        {
+            return -1;
+        }
     }
 
-    return 0;
+    return addIntAttribute(_iFile, g_SCILAB_CLASS_SOD_VERSION, SOD_FILE_VERSION);
 }
-*/
+
 int writeStringMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, char **data)
 {
     int i;
@@ -526,7 +508,7 @@ int writeUndefined(int _iFile, char *_pstDatasetName)
 }
 
 static hobj_ref_t writeCommomDoubleMatrix(int _iFile, char *_pstGroupName, char *_pstDatasetName, int _iIndex, int _iRows, int _iCols,
-                                          double *_pdblData)
+        double *_pdblData)
 {
     hid_t space;
     hid_t dset;
@@ -1996,17 +1978,17 @@ int closeList(int _iFile, void *_pvList, char *_pstListName, int _iNbItem, int _
 
     switch (_iVarType)
     {
-    case sci_list:
-        pcstClass = g_SCILAB_CLASS_LIST;
-        break;
-    case sci_tlist:
-        pcstClass = g_SCILAB_CLASS_TLIST;
-        break;
-    case sci_mlist:
-        pcstClass = g_SCILAB_CLASS_MLIST;
-        break;
-    default:
-        return 1;
+        case sci_list:
+            pcstClass = g_SCILAB_CLASS_LIST;
+            break;
+        case sci_tlist:
+            pcstClass = g_SCILAB_CLASS_TLIST;
+            break;
+        case sci_mlist:
+            pcstClass = g_SCILAB_CLASS_MLIST;
+            break;
+        default:
+            return 1;
     }
 
     if (_iNbItem == 0)