Salome HOME
Porting to Mandrake 10.1 and new products:
[modules/kernel.git] / src / Batch / Batch_JobInfo_PBS.cxx
1 /*
2  * JobInfo_PBS.cxx : 
3  *
4  * Auteur : Ivan DUTKA-MALEN - EDF R&D
5  * Mail   : mailto:ivan.dutka-malen@der.edf.fr
6  * Date   : Fri Nov 21 09:42:06 2003
7  * Projet : Salome 2
8  *
9  */
10
11 #include <cstdio>
12 #include <sstream>
13 //#include "MEDMEM_STRING.hxx"
14 #include "Batch_Parametre.hxx"
15 #include "Batch_Environnement.hxx"
16 #include "Batch_RunTimeException.hxx"
17 #include "Batch_JobInfo_PBS.hxx"
18 using namespace std;
19
20 namespace Batch {
21
22   // Constructeurs
23   JobInfo_PBS::JobInfo_PBS(struct batch_status * list, bool tobedeleted) : JobInfo()
24   {
25     // On ne considere que le premier element de la liste
26     // Si tout est OK, la liste ne devrait contenir qu'un element
27     // Sinon on leve une exception.
28     struct batch_status * p_job = list;
29     int i;
30     for(i=0; p_job; p_job = p_job->next) i++;
31     if (i == 0) throw RunTimeException("Liste vide (le job est absent de la file)");
32     if (i > 1) {
33       //MEDMEM::STRING sst;
34       ostringstream sst;
35       sst << "JobInfo_PBS::JobInfo_PBS(struct batch_status * list, bool tobedeleted) : la liste contient "
36           << i << " elements" << " (1 seul requis)" << endl;
37       throw RunTimeException(sst.str());
38     }
39     p_job = list;
40
41     // On remplit les membres _param et _env
42
43     if (p_job->name && strlen(p_job->name)) _param[ID]   = p_job->name;
44     if (p_job->text && strlen(p_job->text)) _param[TEXT] = p_job->text;
45
46     for(struct attrl * p_attr = p_job->attribs; p_attr; p_attr = p_attr->next) {
47
48       string name, res, value;
49       if (p_attr->name && strlen(p_attr->name)) name = p_attr->name;
50       if (p_attr->resource && strlen(p_attr->resource)) res = p_attr->resource;
51       if (p_attr->value && strlen(p_attr->value)) value = p_attr->value;
52
53       if (name == ATTR_N) {
54         _param[NAME] = value;
55       
56       } else if (name == ATTR_owner) {
57         _param[USER] = value;
58
59       } else if (name == ATTR_state) {
60         _param[STATE] = value;
61
62       } else if (name == ATTR_queue) {
63         _param[QUEUE] = value;
64
65       } else if (name == ATTR_A) {
66         _param[ACCOUNT] = value;
67
68       } else if (name == ATTR_M) {
69         _param[MAIL] = value;
70
71       } else if (name == ATTR_c) {
72         if (!strcmp(value.c_str(), CHECKPOINT_UNSPECIFIED)) _param[CHECKPOINT] = 1L;
73         else _param[CHECKPOINT] = 0L;
74
75       } else if (name == ATTR_h) {
76         if (!strcmp(value.c_str(), NO_HOLD)) _param[HOLD] = 0L;
77         else _param[HOLD] = 1L;
78
79       } else if (name == ATTR_ctime) {
80         _param[CREATIONTIME] = atol(value.c_str());
81
82       } else if (name == ATTR_etime) {
83         _param[ELIGIBLETIME] = atol(value.c_str());
84
85       } else if (name == ATTR_mtime) {
86         _param[MODIFICATIONTIME] = atol(value.c_str());
87
88       } else if (name == ATTR_qtime) {
89         _param[QUEUEDTIME] = atol(value.c_str());
90
91       } else if (name == ATTR_exechost) {
92         _param[EXECUTIONHOST] = value;
93
94       } else if (name == ATTR_session) {
95         _param[PID] = atol(value.c_str());
96
97       } else if (name == ATTR_euser) {
98         _param[EUSER] = value;
99
100       } else if (name == ATTR_egroup) {
101         _param[EGROUP] = value;
102
103       } else if (name == ATTR_l) {
104         if (res == "cput") {
105           _param[MAXCPUTIME] = HMStoLong(value);
106
107         } else if (res == "walltime") {
108           _param[MAXWALLTIME] = HMStoLong(value);
109
110         }
111
112       } else if (name == ATTR_used) {
113         if (res == "cput") {
114           _param[USEDCPUTIME] = HMStoLong(value);
115
116         } else if (res == "walltime") {
117           _param[USEDWALLTIME] = HMStoLong(value);
118
119         }
120
121       } else if (name == ATTR_v) {
122         int deb = 0;
123         int pos = 0;
124         bool ok = true;
125
126         while (ok) {
127           pos = value.find(",", deb);
128           string sub = value.substr(deb, pos-deb);
129           deb = pos + 1;
130           if (pos < 0) ok = false;
131
132           int eq = sub.find("=");
133           _env[sub.substr(0, eq)] = sub.substr(eq+1);
134         }
135
136       }
137     }
138
139
140     if (tobedeleted) pbs_statfree(list);
141   }
142
143   // Destructeur
144   JobInfo_PBS::~JobInfo_PBS()
145   {
146     // Nothing to do
147   }
148   
149   // Convertit une date HH:MM:SS en secondes
150   long JobInfo_PBS::HMStoLong(const string & s)
151   {
152     long hour, min, sec;
153
154     sscanf( s.c_str(), "%ld:%ld:%ld", &hour, &min, &sec);
155     return ( ( ( hour * 60L ) + min ) * 60L ) + sec;
156   }
157
158   // Methode pour l'interfacage avec Python (SWIG) : affichage en Python
159   string JobInfo_PBS::__str__() const
160   {
161     //MEDMEM::STRING sst; 
162     ostringstream sst;
163     sst << "<JobInfo_PBS (" << this << ") :" << endl;
164     sst << " ID = " <<_param[ID] << endl;
165
166     sst << "  + Parametre :" << endl;
167     Parametre::const_iterator itp;
168     for(itp=_param.begin(); itp!=_param.end(); itp++) {
169       if ( (*itp).first != ID ) {
170         sst << "    * " << (*itp).first << " = " << (*itp).second << endl;
171       }
172     }
173     return sst.str();
174   }
175
176
177 }