Commit 232a6b9fcba210fc1a6bec40d7026c0d9f5e1029

Authored by Benjamin Renard
2 parents 9ed2a53f ba104fff
Exists in master

Merge branch 'WIP'

src/DATA/TOOLS/GetModificationDate.c 0 → 100644
@@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
  1 +
  2 +/** @file GetModificationDate.c
  3 +* @brief Stand-alone executable <br> Returns modification date for given VI in DDBase <br>
  4 +*
  5 +* @details GetModificationDate(string *) <br>
  6 +* @arg \c argv[1] Path to VI directory
  7 +* @arg \c argv[2] Times file name
  8 +*/
  9 +
  10 +
  11 +#include <stdlib.h>
  12 +#include <stdio.h>
  13 +#include <string.h>
  14 +#include <time.h>
  15 +#include <sys/stat.h>
  16 +#include <math.h>
  17 +#include <netcdf.h>
  18 +#include <DD.h>
  19 +
  20 +
  21 +
  22 +/*---------------- NC ERROR --------------------------------------*/
  23 +void nc_handle_error(int status)
  24 +{
  25 + fprintf(stderr, "%s\n", nc_strerror(status));
  26 + exit(1);
  27 +}
  28 +
  29 +/* ----------------------- MAIN ------------------------------------*/
  30 +int main(int argc, char *argv[])
  31 +{
  32 + int status, len;
  33 +
  34 + if (argc < 3){
  35 + fprintf(stderr,"Usage: GetModificationDate path_to_vi times_file_name\n");
  36 + exit(1);
  37 + }
  38 +
  39 + char timesPath[512];
  40 + memset(timesPath, 0, 512*sizeof(char));
  41 + strcat(timesPath, argv[1]);
  42 + strcat(timesPath, "/");
  43 + strcat(timesPath, argv[2]);
  44 +
  45 + // Open VI_times.nc
  46 + int DataID;
  47 + if ((status = nc_open(timesPath, NC_NOWRITE, &DataID)) != NC_NOERR)
  48 + nc_handle_error(status);
  49 +
  50 + char modificationDate[21];
  51 + memset(modificationDate, 0, 21*sizeof(char));
  52 + if ((status = nc_get_att_text(DataID, NC_GLOBAL, "ModificationDate", modificationDate)) != NC_NOERR) {
  53 + struct stat b;
  54 + if (!stat(timesPath, &b)) {
  55 + strftime(modificationDate, 21, "%Y-%m-%dT%H:%M:%SZ", localtime( &b.st_mtime));
  56 + }
  57 + }
  58 +
  59 + nc_close(DataID);
  60 +
  61 + if (strcmp(modificationDate, "") == 0) {
  62 + exit(1);
  63 + }
  64 +
  65 + printf("%s\n", modificationDate);
  66 +
  67 + exit(0);
  68 +}
src/DATA/TOOLS/GetReleaseDate.c 0 → 100644
@@ -0,0 +1,98 @@ @@ -0,0 +1,98 @@
  1 +
  2 +/** @file GetReleaseDate.c
  3 +* @brief Stand-alone executable <br> Returns release date for given VI in DDBase <br>
  4 +*
  5 +* @details GetReleaseDate(string *) <br>
  6 +* @arg \c argv[1] Path to VI directory
  7 +* @arg \c argv[2] Times file name
  8 +*
  9 +*/
  10 +
  11 +
  12 +#include <stdlib.h>
  13 +#include <stdio.h>
  14 +#include <string.h>
  15 +#include <time.h>
  16 +#include <sys/stat.h>
  17 +#include <math.h>
  18 +#include <netcdf.h>
  19 +#include <DD.h>
  20 +
  21 +
  22 +
  23 +/*---------------- NC ERROR --------------------------------------*/
  24 +void nc_handle_error(int status)
  25 +{
  26 + fprintf(stderr, "%s\n", nc_strerror(status));
  27 + exit(1);
  28 +}
  29 +
  30 +/* ----------------------- MAIN ------------------------------------*/
  31 +int main(int argc, char *argv[])
  32 +{
  33 + int status, len;
  34 +
  35 + if (argc < 3){
  36 + fprintf(stderr,"Usage: GetReleaseDate path_to_vi times_file_name\n");
  37 + exit(1);
  38 + }
  39 +
  40 + char timesPath[512];
  41 + memset(timesPath, 0, 512*sizeof(char));
  42 + strcat(timesPath, argv[1]);
  43 + strcat(timesPath, "/");
  44 + strcat(timesPath, argv[2]);
  45 +
  46 + // Open VI_times.nc
  47 + int DataID;
  48 + if ((status = nc_open(timesPath, NC_NOWRITE, &DataID)) != NC_NOERR)
  49 + nc_handle_error(status);
  50 +
  51 + int FileID;
  52 + if ((status = nc_inq_varid(DataID, "FileName", &FileID)) != NC_NOERR)
  53 + nc_handle_error(status);
  54 +
  55 + int Filedims[2];
  56 + if ((status = nc_inq_var(DataID, FileID, NULL, NULL, NULL, Filedims, NULL)) != NC_NOERR)
  57 + nc_handle_error(status);
  58 +
  59 + size_t nb_records;
  60 + if ((nc_inq_dimlen(DataID, Filedims[0], &nb_records)) != NC_NOERR)
  61 + nc_handle_error(status);
  62 +
  63 + int i;
  64 + char FileName[32];
  65 + char filePath[512];
  66 + size_t count[2] = {1L,32L};
  67 + size_t start[2] = {0L,0L};
  68 + struct stat attrib;
  69 +
  70 + time_t releaseDate = 0;
  71 + for (i = 0; i < nb_records; ++i) {
  72 + count[1] = 32;
  73 + start[0] = i;
  74 + if ((status = nc_get_vara_text(DataID, FileID, start, count, FileName)) != NC_NOERR)
  75 + nc_handle_error(status);
  76 + memset(filePath, 0, 512*sizeof(char));
  77 + strcat(filePath, argv[1]);
  78 + strcat(filePath, "/");
  79 + strcat(filePath, FileName);
  80 + strcat(filePath, ".gz");
  81 + stat(filePath, &attrib);
  82 + if (releaseDate < attrib.st_mtime)
  83 + releaseDate = attrib.st_mtime;
  84 + }
  85 +
  86 +
  87 + nc_close(DataID);
  88 +
  89 + if (releaseDate == 0)
  90 + exit(1);
  91 +
  92 + char releaseDateISO[21];
  93 + memset(releaseDateISO, 0, 21*sizeof(char));
  94 + strftime(releaseDateISO, 21, "%Y-%m-%dT%H:%M:%SZ", localtime( &releaseDate));
  95 +
  96 + printf("%s\n", releaseDateISO);
  97 + exit(0);
  98 +}
src/DATA/TOOLS/TimesUpdate.c
@@ -46,6 +46,7 @@ @@ -46,6 +46,7 @@
46 #include <dirent.h> 46 #include <dirent.h>
47 #include <netcdf.h> 47 #include <netcdf.h>
48 #include <math.h> 48 #include <math.h>
  49 +#include <time.h>
49 #include <DD.h> 50 #include <DD.h>
50 51
51 /* Global Constant definitions */ 52 /* Global Constant definitions */
@@ -269,6 +270,7 @@ main(int argc, char **argv) @@ -269,6 +270,7 @@ main(int argc, char **argv)
269 char name[100]; 270 char name[100];
270 int compress = 0; 271 int compress = 0;
271 int status; 272 int status;
  273 + int updateModificationDate = 0;
272 274
273 double LastTime = 0.0, FirstTime = 0.0; // Times of the hall between files 275 double LastTime = 0.0, FirstTime = 0.0; // Times of the hall between files
274 276
@@ -390,14 +392,18 @@ main(int argc, char **argv) @@ -390,14 +392,18 @@ main(int argc, char **argv)
390 /*--------- Look the conditions ---------------*/ 392 /*--------- Look the conditions ---------------*/
391 condition = ALLRIGHT; 393 condition = ALLRIGHT;
392 if((CurrentRecord->StartD < FirstTime - 60.0) && 394 if((CurrentRecord->StartD < FirstTime - 60.0) &&
393 - (CurrentRecord->StopD > LastTime + 60.0)) condition = LEFTRIGHTOVER; 395 + (CurrentRecord->StopD > LastTime + 60.0))
  396 + condition = LEFTRIGHTOVER;
394 else if((CurrentRecord->StartD < FirstTime - 60.0) && 397 else if((CurrentRecord->StartD < FirstTime - 60.0) &&
395 - (CurrentRecord->StopD < FirstTime + 60.0)) condition = ALLLEFT; 398 + (CurrentRecord->StopD < FirstTime + 60.0))
  399 + condition = ALLLEFT;
396 else if((CurrentRecord->StartD < FirstTime - 60.0) && 400 else if((CurrentRecord->StartD < FirstTime - 60.0) &&
397 (CurrentRecord->StopD > FirstTime) && 401 (CurrentRecord->StopD > FirstTime) &&
398 - (CurrentRecord->StopD < LastTime + 60.0)) condition = LEFTOVER; 402 + (CurrentRecord->StopD < LastTime + 60.0))
  403 + condition = LEFTOVER;
399 else if((CurrentRecord->StartD >= FirstTime - 60.0) && 404 else if((CurrentRecord->StartD >= FirstTime - 60.0) &&
400 - (CurrentRecord->StopD <= LastTime + 60.0)) condition = WELLIN; 405 + (CurrentRecord->StopD <= LastTime + 60.0))
  406 + condition = WELLIN;
401 else if((CurrentRecord->StartD >= FirstTime - 60.0) && 407 else if((CurrentRecord->StartD >= FirstTime - 60.0) &&
402 (CurrentRecord->StartD < LastTime) && 408 (CurrentRecord->StartD < LastTime) &&
403 (CurrentRecord->StopD > LastTime + 60.0))condition = RIGHTOVER; 409 (CurrentRecord->StopD > LastTime + 60.0))condition = RIGHTOVER;
@@ -407,14 +413,33 @@ main(int argc, char **argv) @@ -407,14 +413,33 @@ main(int argc, char **argv)
407 /* What to do with these conditions ----------------*/ 413 /* What to do with these conditions ----------------*/
408 switch(condition) 414 switch(condition)
409 { 415 {
410 - case WELLIN : InsertRecord((size_t)ihole, CurrentRecord); InsertFlag = 1; break;  
411 - case ALLLEFT : RemoveRecord((size_t)(ihole-1),CurrentRecord); ihole--; break;  
412 - case ALLRIGHT : ihole++; break;  
413 - case LEFTOVER : RemoveRecord((size_t)(ihole-1),CurrentRecord); ihole--; break;  
414 - case RIGHTOVER : RemoveRecord((size_t)ihole,CurrentRecord); break;  
415 - case LEFTRIGHTOVER : RemoveRecord((size_t)(ihole-1),CurrentRecord);  
416 - RemoveRecord((size_t)(ihole-1),CurrentRecord);  
417 - ihole--; break; 416 + case WELLIN :
  417 + InsertRecord((size_t)ihole, CurrentRecord);
  418 + InsertFlag = 1;
  419 + break;
  420 + case ALLLEFT :
  421 + RemoveRecord((size_t)(ihole-1),CurrentRecord);
  422 + updateModificationDate = 1;
  423 + ihole--;
  424 + break;
  425 + case ALLRIGHT :
  426 + ihole++;
  427 + break;
  428 + case LEFTOVER :
  429 + RemoveRecord((size_t)(ihole-1),CurrentRecord);
  430 + updateModificationDate = 1;
  431 + ihole--;
  432 + break;
  433 + case RIGHTOVER :
  434 + RemoveRecord((size_t)ihole,CurrentRecord);
  435 + updateModificationDate = 1;
  436 + break;
  437 + case LEFTRIGHTOVER :
  438 + RemoveRecord((size_t)(ihole-1),CurrentRecord);
  439 + RemoveRecord((size_t)(ihole-1),CurrentRecord);
  440 + updateModificationDate = 1;
  441 + ihole--;
  442 + break;
418 } 443 }
419 } // While InsertFlag 444 } // While InsertFlag
420 } // if RecordsNumber > 0 445 } // if RecordsNumber > 0
@@ -425,6 +450,25 @@ main(int argc, char **argv) @@ -425,6 +450,25 @@ main(int argc, char **argv)
425 } // If current argument file is OK 450 } // If current argument file is OK
426 } // CASE 451 } // CASE
427 } // For several arguments 452 } // For several arguments
  453 +
  454 + char modificationDate[21];
  455 + memset(modificationDate, 0, 21*sizeof(char));
  456 +
  457 + int modDateAttrib;
  458 + if ((status = nc_inq_attid(tmID, NC_GLOBAL, "ModificationDate", &modDateAttrib)) != NC_NOERR) {
  459 + updateModificationDate = 1;
  460 + }
  461 +
  462 + if (updateModificationDate == 1) {
  463 + char modificationDate[21];
  464 + memset(modificationDate, 0, 21*sizeof(char));
  465 + time_t t = time(NULL);
  466 + strftime(modificationDate, 21, "%Y-%m-%dT%H:%M:%SZ", localtime(&t));
  467 + nc_redef(tmID);
  468 + status = nc_put_att_text (tmID, NC_GLOBAL, "ModificationDate", 20, modificationDate);
  469 + nc_enddef(tmID);
  470 + }
  471 +
428 status = nc_close(tmID); 472 status = nc_close(tmID);
429 return(0); 473 return(0);
430 } 474 }
src/DDSERVICES/SOAP/DDserverWeb.php
@@ -101,6 +101,81 @@ @@ -101,6 +101,81 @@
101 return $result; 101 return $result;
102 } 102 }
103 103
  104 +
  105 +/**
  106 +* Returns list of datasets with TimeRestriction
  107 +*/
  108 +function getVIInfo($viId)
  109 +{
  110 + $result = array(
  111 + );
  112 + $referXML = baseDir."/DDsys.xml";
  113 + $DDsys = new DOMDocument("1.0");
  114 + @$DDsys->load($referXML);
  115 + $xp = new domxpath($DDsys);
  116 + $VINodes = $xp->query("//NAME[.='".str_replace(":", "_",$viId)."']");
  117 + $result = array(
  118 + 'success' => FALSE
  119 + );
  120 +
  121 + if ($VINodes->length == 0) {
  122 + return $result;
  123 + }
  124 +
  125 + $VINode = $VINodes->item(0)->parentNode;
  126 +
  127 + $locationNode = $VINode->getElementsByTagName("LOCATION");
  128 + $nameNode = $VINode->getElementsByTagName("NAME");
  129 + $timesNode = $VINode->getElementsByTagName("TIMES");
  130 + if (($locationNode->length > 0) && ($nameNode->length > 0) && ($timesNode->length > 0))
  131 + {
  132 +
  133 +
  134 + $locationNode = $locationNode->item(0);
  135 + $nameNode = $nameNode->item(0);
  136 + $location = $locationNode->nodeValue;
  137 + $viName = $nameNode->nodeValue;
  138 + $timesNode = $timesNode->item(0);
  139 + $timesFile = $timesNode->nodeValue;
  140 +
  141 + if (!empty($location) && !empty($viName)) {
  142 +
  143 + // Start / Stop Date
  144 + $referFile = baseDir."/refer.nc";
  145 + $cmd = DDBASEBIN."/StartStop ".$referFile." ".$viId;
  146 + $startStopDate = system($cmd);
  147 +
  148 + // Release date
  149 + $releaseDate = NULL;
  150 + $cmd = "/opt/tools/DDServer/bin/GetReleaseDate ".$location." ".$timesFile;
  151 + $output = array();
  152 + exec($cmd, $output, $result_code);
  153 + if ($result_code == 0)
  154 + $releaseDate = $output[0];
  155 +
  156 + // Modification date
  157 + $cmd = "/opt/tools/DDServer/bin/GetModificationDate ".$location." ".$timesFile;
  158 + $output = array();
  159 + exec($cmd, $output, $result_code);
  160 + if ($result_code == 0)
  161 + $modificationDate = $output[0];
  162 + if (!isset($releaseDate))
  163 + $releaseDate = $modificationDate;
  164 +
  165 +
  166 + $result = array(
  167 + 'success' => TRUE,
  168 + 'viName' => $viName,
  169 + 'releaseDate' => $releaseDate,
  170 + 'modificationDate' => $modificationDate,
  171 + 'startStopDate' => $startStopDate
  172 + );
  173 + }
  174 + }
  175 +
  176 + return $result;
  177 +}
  178 +
104 /** 179 /**
105 * Returns restricted TimeRestriction and GlobalStop in case of time restriction 180 * Returns restricted TimeRestriction and GlobalStop in case of time restriction
106 */ 181 */
src/DDSERVICES/SOAP/dd.wsdl.in
@@ -47,6 +47,14 @@ @@ -47,6 +47,14 @@
47 </tns:element> 47 </tns:element>
48 </tns:sequence> 48 </tns:sequence>
49 </tns:complexType> 49 </tns:complexType>
  50 + <tns:complexType name="VIInfo">
  51 + <tns:sequence>
  52 + <tns:element minOccurs="1" maxOccurs="1" name="vi" type="xsd:string"/>
  53 + <tns:element minOccurs="1" maxOccurs="1" name="releaseDate" type="xsd:string"/>
  54 + <tns:element minOccurs="1" maxOccurs="1" name="modificationDate" type="xsd:string"/>
  55 + <tns:element minOccurs="1" maxOccurs="1" name="startStopDate" type="xsd:string"/>
  56 + </tns:sequence>
  57 + </tns:complexType>
50 </types> 58 </types>
51 59
52 <message name='isRemoteViAddedRequest'> 60 <message name='isRemoteViAddedRequest'>
@@ -182,6 +190,12 @@ @@ -182,6 +190,12 @@
182 <message name='getDatasetsWithTimeRestrictionResponse'> 190 <message name='getDatasetsWithTimeRestrictionResponse'>
183 <part name='Result' type='tns:ListOfDatasetTimeRestrictionData'/> 191 <part name='Result' type='tns:ListOfDatasetTimeRestrictionData'/>
184 </message> 192 </message>
  193 +<message name='getVIInfoRequest'>
  194 + <part name='viId' type='xsd:string'/>
  195 +</message>
  196 +<message name='getVIInfoResponse'>
  197 + <part name='Result' type='tns:VIInfo'/>
  198 +</message>
185 199
186 <portType name='AmdaPortType'> 200 <portType name='AmdaPortType'>
187 <operation name='isRemoteViAdded'> 201 <operation name='isRemoteViAdded'>
@@ -268,6 +282,12 @@ @@ -268,6 +282,12 @@
268 <input message='tns:getDatasetsWithTimeRestrictionRequest'/> 282 <input message='tns:getDatasetsWithTimeRestrictionRequest'/>
269 <output message='tns:getDatasetsWithTimeRestrictionResponse'/> 283 <output message='tns:getDatasetsWithTimeRestrictionResponse'/>
270 </operation> 284 </operation>
  285 + <operation name='getVIInfo'>
  286 + <input message='tns:getVIInfoRequest'/>
  287 + <output message='tns:getVIInfoResponse'/>
  288 + </operation>
  289 +
  290 +
271 </portType> 291 </portType>
272 292
273 <binding name='AmdaBinding' type='tns:AmdaPortType'> 293 <binding name='AmdaBinding' type='tns:AmdaPortType'>
@@ -504,6 +524,17 @@ @@ -504,6 +524,17 @@
504 encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 524 encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
505 </output> 525 </output>
506 </operation> 526 </operation>
  527 + <operation name='getVIInfo'>
  528 + <soap:operation soapAction='getVIInfo'/>
  529 + <input>
  530 + <soap:body use='encoded'
  531 + encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
  532 + </input>
  533 + <output>
  534 + <soap:body use='encoded'
  535 + encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
  536 + </output>
  537 + </operation>
507 </binding> 538 </binding>
508 539
509 <service name='AmdaService'> 540 <service name='AmdaService'>