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
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"
23 JobInfo_PBS::JobInfo_PBS(struct batch_status * list, bool tobedeleted) : JobInfo()
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;
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)");
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());
41 // On remplit les membres _param et _env
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;
46 for(struct attrl * p_attr = p_job->attribs; p_attr; p_attr = p_attr->next) {
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;
56 } else if (name == ATTR_owner) {
59 } else if (name == ATTR_state) {
60 _param[STATE] = value;
62 } else if (name == ATTR_queue) {
63 _param[QUEUE] = value;
65 } else if (name == ATTR_A) {
66 _param[ACCOUNT] = value;
68 } else if (name == ATTR_M) {
71 } else if (name == ATTR_c) {
72 if (!strcmp(value.c_str(), CHECKPOINT_UNSPECIFIED)) _param[CHECKPOINT] = 1L;
73 else _param[CHECKPOINT] = 0L;
75 } else if (name == ATTR_h) {
76 if (!strcmp(value.c_str(), NO_HOLD)) _param[HOLD] = 0L;
77 else _param[HOLD] = 1L;
79 } else if (name == ATTR_ctime) {
80 _param[CREATIONTIME] = atol(value.c_str());
82 } else if (name == ATTR_etime) {
83 _param[ELIGIBLETIME] = atol(value.c_str());
85 } else if (name == ATTR_mtime) {
86 _param[MODIFICATIONTIME] = atol(value.c_str());
88 } else if (name == ATTR_qtime) {
89 _param[QUEUEDTIME] = atol(value.c_str());
91 } else if (name == ATTR_exechost) {
92 _param[EXECUTIONHOST] = value;
94 } else if (name == ATTR_session) {
95 _param[PID] = atol(value.c_str());
97 } else if (name == ATTR_euser) {
98 _param[EUSER] = value;
100 } else if (name == ATTR_egroup) {
101 _param[EGROUP] = value;
103 } else if (name == ATTR_l) {
105 _param[MAXCPUTIME] = HMStoLong(value);
107 } else if (res == "walltime") {
108 _param[MAXWALLTIME] = HMStoLong(value);
112 } else if (name == ATTR_used) {
114 _param[USEDCPUTIME] = HMStoLong(value);
116 } else if (res == "walltime") {
117 _param[USEDWALLTIME] = HMStoLong(value);
121 } else if (name == ATTR_v) {
127 pos = value.find(",", deb);
128 string sub = value.substr(deb, pos-deb);
130 if (pos < 0) ok = false;
132 int eq = sub.find("=");
133 _env[sub.substr(0, eq)] = sub.substr(eq+1);
140 if (tobedeleted) pbs_statfree(list);
144 JobInfo_PBS::~JobInfo_PBS()
149 // Convertit une date HH:MM:SS en secondes
150 long JobInfo_PBS::HMStoLong(const string & s)
154 sscanf( s.c_str(), "%ld:%ld:%ld", &hour, &min, &sec);
155 return ( ( ( hour * 60L ) + min ) * 60L ) + sec;
158 // Methode pour l'interfacage avec Python (SWIG) : affichage en Python
159 string JobInfo_PBS::__str__() const
161 //MEDMEM::STRING sst;
163 sst << "<JobInfo_PBS (" << this << ") :" << endl;
164 sst << " ID = " <<_param[ID] << endl;
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;