1 krisbash 1.1 #include "/usr/include/python2.6/Python.h"
2 #include "structmember.h"
3 #include "MI.h"
4 #include <stdlib.h>
5 #include "datetime.h"
6
7 static PyObject *MIError;
8
9 /*Defines a PMI_Instance Type Object which is a Python Object that contains a reference to an intance of MI_Instance */
10 typedef struct{
11 PyObject_HEAD
12 MI_Instance *miInstance;
13 PyObject *propertyValues;
14 PyObject *propertyTypes;
15 PyObject *propertyFlags;
16 } PMI_Instance;
17
18
19 static void PMI_Instance_dealloc(PMI_Instance *self)
20 {
21 MI_Result miResult = MI_RESULT_OK;
22 krisbash 1.1 miResult = MI_Instance_Delete(self->miInstance);
23
24 Py_CLEAR(self->propertyValues);
25 Py_CLEAR(self->propertyTypes);
26 Py_CLEAR(self->propertyFlags);
27 self->ob_type->tp_free((PyObject*) self);
28
29 }
30
31 static PyObject* PMI_Instance_new(PyTypeObject *type)
32 {
33 PMI_Instance *self;
34 self = (PMI_Instance *)type->tp_alloc(type,0);
35 if(self != NULL){
36 self-> miInstance = NULL;
37 self-> propertyValues = NULL;
38 self-> propertyTypes = NULL;
39 self-> propertyFlags = NULL;
40 }
41 return (PyObject *)self;
42 }
43 krisbash 1.1
44 static PyTypeObject PMI_InstanceType ;
45
46 static PyObject* initPMI()
47 {
48 PyObject *instance = PyObject_CallObject((PyObject*) &PMI_InstanceType, NULL);
49 Py_INCREF(instance);
50 return instance;
51 }
52
53 static PyObject* MakePropertyDict(PMI_Instance *pmiInstance);
54
55 static PyObject* Get_Element_Value(const MI_Value *elementValue, MI_Type elementType)
56
57 {
58 MI_Type nonArrayType = (MI_Type) (elementType & (~MI_ARRAY));
59 switch (elementType)
60 {
61 case MI_BOOLEAN:
62 {
63 if(elementValue->boolean)
64 krisbash 1.1 return Py_True;
65 return Py_False;
66 }
67
68 case MI_SINT8:
69 {
70 return Py_BuildValue("b",elementValue->sint8);
71 }
72
73 case MI_UINT8:
74 {
75 return Py_BuildValue("B",elementValue->uint8);
76 }
77
78 case MI_SINT16:
79 {
80 return Py_BuildValue("h",elementValue->sint16);
81 }
82
83 case MI_UINT16:
84 {
85 krisbash 1.1 return Py_BuildValue("H",elementValue->uint16);
86 }
87
88 case MI_SINT32:
89 {
90 return Py_BuildValue("i",elementValue->sint32);
91 }
92
93 case MI_UINT32:
94 {
95 return Py_BuildValue("I",elementValue->uint32);
96 }
97
98 case MI_SINT64:
99 {
100 return Py_BuildValue("L",elementValue->sint64);
101 }
102
103 case MI_UINT64:
104 {
105 return Py_BuildValue("K",elementValue->uint64);
106 krisbash 1.1 }
107
108 case MI_REAL32:
109 {
110 return Py_BuildValue("f",elementValue->real32);
111 }
112
113 case MI_REAL64:
114 {
115 return Py_BuildValue("d",elementValue->real64);
116 }
117
118 case MI_CHAR16:
119 {
120 return Py_BuildValue("H",elementValue->char16);
121 }
122
123 case MI_DATETIME:
124 {
125 const MI_Datetime* x = &elementValue->datetime;
126
127 krisbash 1.1 if(x->isTimestamp)
128 {
129 //MI_Sint32 utc = x->u.timestamp.utc;
130 PyObject* datetimeObject = PyDateTime_FromDateAndTime(x->u.timestamp.year,x->u.timestamp.month,x->u.timestamp.day,x->u.timestamp.hour,x->u.timestamp.minute,x->u.timestamp.second,x->u.timestamp.microseconds);
131 return datetimeObject;
132 }
133 else
134 {
135 //Convert MI_Datetime object to PyDatetime object with only day, hour and second attributes
136 int hours = x->u.interval.hours;
137 int minutes = x->u.interval.minutes;
138 int seconds = x->u.interval.seconds;
139 PyObject* delta = PyDelta_FromDSU(x->u.interval.days,hours*24+minutes*60+seconds,x->u.interval.microseconds);
140 return delta;
141 }
142 }
143
144 case MI_STRING:
145 {
146 return Py_BuildValue("s",elementValue->string);
147 }
148 krisbash 1.1
149 case MI_BOOLEANA:
150 {
151 MI_Uint32 i;
152 PyObject* valueSets = PyTuple_New(elementValue->booleana.size);
153
154 for (i = 0; i < elementValue->booleana.size; i++)
155 {
156 MI_Value value;
157 value.boolean = elementValue->booleana.data[i];
158 PyObject* propertyValue= Get_Element_Value(&value, nonArrayType);
159 PyTuple_SetItem(valueSets,i,propertyValue);
160 }
161 return valueSets;
162 }
163
164 case MI_SINT8A:
165 {
166 MI_Uint32 i;
167 PyObject* valueSets = PyTuple_New(elementValue->sint8a.size);
168 for (i = 0; i < elementValue->sint8a.size; i++)
169 krisbash 1.1 {
170 MI_Value value;
171 value.sint8 = elementValue->sint8a.data[i];
172 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
173 PyTuple_SetItem(valueSets,i,propertyValue);
174 }
175 return valueSets;
176 }
177
178 case MI_UINT8A:
179 {
180 MI_Uint32 i;
181 PyObject* valueSets = PyTuple_New(elementValue->uint8a.size);
182 for (i = 0; i < elementValue->uint8a.size; i++)
183 {
184 MI_Value value;
185 value.uint8 = elementValue->uint8a.data[i];
186 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
187 PyTuple_SetItem(valueSets,i,propertyValue);
188 }
189 return valueSets;
190 krisbash 1.1 }
191
192 case MI_SINT16A:
193 {
194 MI_Uint32 i;
195 PyObject* valueSets = PyTuple_New(elementValue->sint16a.size);
196 for (i = 0; i < elementValue->sint16a.size; i++)
197 {
198 MI_Value value;
199 value.sint16 = elementValue->sint16a.data[i];
200 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
201 PyTuple_SetItem(valueSets,i,propertyValue);
202 }
203 return valueSets;
204 }
205
206 case MI_UINT16A:
207 {
208 MI_Uint32 i;
209 PyObject* valueSets = PyTuple_New(elementValue->uint16a.size);
210 for (i = 0; i < elementValue->uint16a.size; i++)
211 krisbash 1.1 {
212 MI_Value value;
213 value.uint16 = elementValue->uint16a.data[i];
214 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
215 PyTuple_SetItem(valueSets,i,propertyValue);
216 }
217 return valueSets;
218 }
219
220 case MI_SINT32A:
221 {
222 MI_Uint32 i;
223 PyObject* valueSets = PyTuple_New(elementValue->sint32a.size);
224 for (i = 0; i < elementValue->sint32a.size; i++)
225 {
226 MI_Value value;
227 value.sint32 = elementValue->sint32a.data[i];
228 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
229 PyTuple_SetItem(valueSets,i,propertyValue);
230 }
231 return valueSets;
232 krisbash 1.1 }
233
234 case MI_UINT32A:
235 {
236 MI_Uint32 i;
237 PyObject* valueSets = PyTuple_New(elementValue->uint32a.size);
238 for (i = 0; i < elementValue->uint32a.size; i++)
239 {
240 MI_Value value;
241 value.uint32 = elementValue->uint32a.data[i];
242 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
243 PyTuple_SetItem(valueSets,i,propertyValue);
244 }
245 return valueSets;
246 }
247
248 case MI_SINT64A:
249 {
250 MI_Uint32 i;
251 PyObject* valueSets = PyTuple_New(elementValue->sint64a.size);
252 for (i = 0; i < elementValue->sint64a.size; i++)
253 krisbash 1.1 {
254 MI_Value value;
255 value.sint64 = elementValue->sint64a.data[i];
256 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
257 PyTuple_SetItem(valueSets,i,propertyValue);
258 }
259 return valueSets;
260 }
261
262 case MI_UINT64A:
263 {
264 MI_Uint32 i;
265 PyObject* valueSets = PyTuple_New(elementValue->uint64a.size);
266 for (i = 0; i < elementValue->uint64a.size; i++)
267 {
268 MI_Value value;
269 value.uint64 = elementValue->uint64a.data[i];
270 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
271 PyTuple_SetItem(valueSets,i,propertyValue);
272 }
273 return valueSets;
274 krisbash 1.1 }
275
276 case MI_REAL32A:
277 {
278 MI_Uint32 i;
279 PyObject* valueSets = PyTuple_New(elementValue->real32a.size);
280 for (i = 0; i < elementValue->real32a.size; i++)
281 {
282 MI_Value value;
283 value.real32 = elementValue->real32a.data[i];
284 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
285 PyTuple_SetItem(valueSets,i,propertyValue);
286 }
287 return valueSets;
288 }
289
290 case MI_REAL64A:
291 {
292 MI_Uint32 i;
293 PyObject* valueSets = PyTuple_New(elementValue->real64a.size);
294 for (i = 0; i < elementValue->real64a.size; i++)
295 krisbash 1.1 {
296 MI_Value value;
297 value.real64 = elementValue->real64a.data[i];
298 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
299 PyTuple_SetItem(valueSets,i,propertyValue);
300 }
301 return valueSets;
302 }
303
304 case MI_CHAR16A:
305 {
306 MI_Uint32 i;
307 PyObject* valueSets = PyTuple_New(elementValue->char16a.size);
308 for (i = 0; i < elementValue->char16a.size; i++)
309 {
310 MI_Value value;
311 value.char16 = elementValue->char16a.data[i];
312 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
313 PyTuple_SetItem(valueSets,i,propertyValue);
314 }
315 return valueSets;
316 krisbash 1.1 }
317
318 case MI_DATETIMEA:
319 {
320 MI_Uint32 i;
321 PyObject* valueSets = PyTuple_New(elementValue->datetimea.size);
322 for (i = 0; i < elementValue->datetimea.size; i++)
323 {
324 MI_Value value;
325 value.datetime = elementValue->datetimea.data[i];
326 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
327 PyTuple_SetItem(valueSets,i,propertyValue);
328 }
329 return valueSets;
330 }
331
332 case MI_STRINGA:
333 {
334 MI_Uint32 i;
335 PyObject* valueSets = PyTuple_New(elementValue->stringa.size);
336 for (i = 0; i < elementValue->stringa.size; i++)
337 krisbash 1.1 {
338 MI_Value value;
339 value.string = elementValue->stringa.data[i];
340 PyObject* propertyValue = Get_Element_Value(&value, nonArrayType);
341 PyTuple_SetItem(valueSets,i,propertyValue);
342 }
343 return valueSets;
344 }
345
346 case MI_INSTANCE:
347 {
348 MI_Instance* inst = elementValue->instance;
349 PMI_Instance* embedded = (PMI_Instance*) initPMI();
350 embedded-> miInstance = inst;
351 if(inst!=NULL)
352 {
353 MakePropertyDict(embedded);
354 }
355 return (PyObject *)embedded;
356 }
357
358 krisbash 1.1 case MI_REFERENCE:
359 {
360 MI_Instance* inst = elementValue->reference;
361 PMI_Instance* embedded = (PMI_Instance*) initPMI();
362 embedded-> miInstance = inst;
363 if(inst!=NULL)
364 {
365 MakePropertyDict(embedded);
366 }
367 return (PyObject *)embedded;
368 }
369
370 case MI_INSTANCEA:
371 case MI_REFERENCEA:
372 {
373 const MI_InstanceA* inst = &elementValue->instancea;
374 MI_Uint32 i;
375 PyObject* valueSets = PyTuple_New(inst->size);
376 for (i = 0; i< inst->size; i++)
377 {
378 PMI_Instance* embedded = (PMI_Instance*) initPMI();
379 krisbash 1.1 if(inst->data[i]!=NULL)
380 {
381 embedded-> miInstance = inst->data[i];
382 MakePropertyDict(embedded);
383 PyTuple_SetItem(valueSets,i,(PyObject *)embedded);
384 }
385 else
386 {
387 PyTuple_SetItem(valueSets,i,Py_None);
388 }
389 }
390 return valueSets;
391 }
392
393 default:
394 Py_INCREF(Py_None);
395 return Py_None;
396 }
397
398 }
399
400 krisbash 1.1
401 static PyObject* MakePropertyDict(PMI_Instance *pmiInstance)
402 {
403 MI_Uint32 elementCount;
404 MI_Result miResult;
405 MI_Uint32 elementIndex;
406 const MI_Instance *miInstance = pmiInstance->miInstance;
407 if(miInstance == NULL)
408 {
409 PyErr_SetString(MIError,"MI_Instance is not valid");
410 return NULL;
411 }
412
413 miResult = MI_Instance_GetElementCount(miInstance, &elementCount);
414 if(miResult != MI_RESULT_OK)
415 {
416 PyErr_SetString(MIError,"MI_Instance_GetElement failed");
417 return NULL;
418 }
419
420 /*make a property dictionary containing property name and value pairs. */
421 krisbash 1.1 PyObject *propertyValues = PyDict_New();
422 PyObject *propertyTypes = PyDict_New();
423 PyObject *propertyFlags = PyDict_New();
424
425
426 const MI_Char *nameSpace;
427 miResult = MI_Instance_GetNameSpace(miInstance,&nameSpace);
428 if(miResult != MI_RESULT_OK)
429 {
430 PyErr_SetString(MIError,"MI_Instance_GetNameSpace failed");
431 return NULL;
432 }
433 PyObject *nameSpaceValue = Py_BuildValue("s",nameSpace);
434 PyDict_SetItemString(propertyValues,"nameSpace",nameSpaceValue);
435 PyDict_SetItemString(propertyTypes,"nameSpace",Py_BuildValue("i",13));
436
437
438 const MI_Char *classDecl;
439 miResult = MI_Instance_GetClassName(miInstance,&classDecl);
440 if(miResult != MI_RESULT_OK)
441 {
442 krisbash 1.1 PyErr_SetString(MIError,"MI_Instance_GetClassName failed");
443 return NULL;
444 }
445 PyObject *classDeclValue = Py_BuildValue("s",classDecl);
446 PyDict_SetItemString(propertyValues,"classDecl",classDeclValue);
447 PyDict_SetItemString(propertyTypes,"classDecl",Py_BuildValue("i",13));
448
449 for(elementIndex = 0; elementIndex < elementCount; elementIndex++)
450 {
451 const MI_Char *key;
452 MI_Value elementValue;
453 MI_Type elementType;
454 MI_Uint32 elementFlags;
455
456 miResult = MI_Instance_GetElementAt(miInstance,elementIndex,&key,&elementValue,&elementType,&elementFlags);
457 if(miResult != MI_RESULT_OK)
458 {
459 PyErr_SetString(MIError,"MI_Instance_GetElement failed");
460 return NULL;
461 }
462
463 krisbash 1.1 PyObject *value = Get_Element_Value(&elementValue,elementType);
464 if(PyDict_SetItemString(propertyValues,key,value))
465 {
466 PyErr_SetString(MIError,"Property dictionary insert item failed");
467 return NULL;
468 }
469 PyObject *typeValue = PyInt_FromLong(elementType);
470 //PyObject *flagValue = PyInt_FromLong(elementFlags); //Are we going to return the dictionary of pair <name,flag> ?
471 if(PyDict_SetItemString(propertyTypes,key,typeValue))
472 {
473 PyErr_SetString(MIError,"Property type dictionary insert item failed");
474 return NULL;
475 }
476 PyObject *flag = Py_BuildValue("s","");
477 if(elementFlags & MI_FLAG_KEY)
478 {
479 flag = Py_BuildValue("s","MI_FLAG_KEY");
480 }
481 if(PyDict_SetItemString(propertyFlags,key,flag))
482 {
483 PyErr_SetString(MIError,"Property flag dictionary insert item failed");
484 krisbash 1.1 return NULL;
485 }
486 }
487
488 pmiInstance->propertyValues = propertyValues;
489 pmiInstance->propertyTypes = propertyTypes;
490 pmiInstance->propertyFlags = propertyFlags;
491 Py_INCREF(Py_None);
492 return Py_None;
493 }
494
495
496 void SetPropertyValues(MI_Type elementType, PyObject *propertyValue, MI_Value *miValue)
497 {
498 MI_Value value;
499 switch (elementType)
500 {
501 case MI_BOOLEAN:
502 {
503 MI_Boolean booleanValue = propertyValue == Py_True? MI_TRUE:MI_FALSE;
504 value.boolean = booleanValue;
505 krisbash 1.1 *miValue = value;
506 break;
507 }
508 case MI_SINT8:
509 {
510 MI_Sint8 sint8Value = PyInt_AsLong(propertyValue);
511 value.sint8 = sint8Value;
512 *miValue = value;
513 break;
514 }
515 case MI_UINT8:
516 {
517 MI_Uint8 uint8Value = PyInt_AsLong(propertyValue);
518 value.uint8 = uint8Value;
519 *miValue = value;
520 break;
521 }
522 case MI_SINT16:
523 {
524 MI_Sint16 sint16Value = PyInt_AsLong(propertyValue);
525 value.sint16 = sint16Value;
526 krisbash 1.1 *miValue = value;
527 break;
528 }
529 case MI_UINT16:
530 {
531 MI_Uint16 uint16Value = PyInt_AsLong(propertyValue);
532 value.uint16 = uint16Value;
533 *miValue = value;
534 break;
535 }
536 case MI_SINT32:
537 {
538 MI_Sint32 sint32Value = PyInt_AsLong(propertyValue);
539 value.sint32 = sint32Value;
540 *miValue = value;
541 break;
542 }
543 case MI_UINT32:
544 {
545 MI_Uint32 uint32Value = PyInt_AsLong(propertyValue);
546 value.uint32 = uint32Value;
547 krisbash 1.1 *miValue = value;
548 break;
549 }
550 case MI_SINT64:
551 {
552 MI_Sint64 sint64Value = PyLong_AsLong(propertyValue);
553 value.sint64 = sint64Value;
554 *miValue = value;
555 break;
556 }
557 case MI_UINT64:
558 {
559 MI_Uint64 uint64Value = PyLong_AsUnsignedLong(propertyValue);
560 value.uint64 = uint64Value;
561 *miValue = value;
562 break;
563 }
564 case MI_REAL32:
565 {
566 MI_Real32 real32Value = PyFloat_AsDouble(propertyValue);
567 value.real32 = real32Value;
568 krisbash 1.1 *miValue = value;
569 break;
570 }
571 case MI_REAL64:
572 {
573 MI_Real64 real64Value = PyFloat_AsDouble(propertyValue);
574 value.real64 = real64Value;
575 *miValue = value;
576 break;
577 }
578 case MI_CHAR16:
579 {
580 MI_Char16 char16Value = PyInt_AsLong(propertyValue);
581 value.char16 = char16Value;
582 *miValue = value;
583 break;
584 }
585 case MI_STRING:
586 {
587 char *stringValue = PyString_AsString(propertyValue);
588 value.string = stringValue;
589 krisbash 1.1 *miValue = value;
590 break;
591 }
592
593 case MI_DATETIME:
594 {
595 /*Check whether the input python object is of type DateTime or TimeDelta */
596 if(PyDateTime_Check(propertyValue))
597 {
598 MI_Datetime dateTime;
599 MI_Timestamp timeStamp;
600 dateTime.isTimestamp = 1;
601 int year = PyDateTime_GET_YEAR(propertyValue);
602 int month = PyDateTime_GET_MONTH(propertyValue);
603 int day = PyDateTime_GET_DAY(propertyValue);
604 int hour = PyDateTime_DATE_GET_HOUR(propertyValue);
605 int minute = PyDateTime_DATE_GET_MINUTE(propertyValue);
606 int second = PyDateTime_DATE_GET_SECOND(propertyValue);
607 int microseconds = PyDateTime_DATE_GET_MICROSECOND(propertyValue);
608 timeStamp.year = year;
609 timeStamp.month = month;
610 krisbash 1.1 timeStamp.day = day;
611 timeStamp.hour = hour;
612 timeStamp.minute = minute;
613 timeStamp.second = second;
614 timeStamp.microseconds = microseconds;
615 //if timezone not specified, set the default to UTC time
616 timeStamp.utc = 5;
617 dateTime.u.timestamp = timeStamp;
618 value.datetime = dateTime;
619 *miValue = value;
620 }
621 /* no equivalent way of doing conversions. pydatetime object does not have days */
622 else
623 {
624 MI_Datetime dateTime;
625 dateTime.isTimestamp = 0;
626 MI_Interval interval;
627 int days = PyDateTime_GET_DAY(propertyValue);
628 int seconds = PyDateTime_DATE_GET_SECOND(propertyValue);
629 int hours = (int)seconds/60/60;
630 int minutes = (seconds-hours*60*60)/60;
631 krisbash 1.1 seconds = seconds - hours*60*60 - minutes *60;
632 int microseconds = PyDateTime_DATE_GET_MICROSECOND(propertyValue);
633 interval.days = days;
634 interval.hours = hours;
635 interval.minutes = minutes;
636 interval.seconds = seconds;
637 interval.microseconds = microseconds;
638 interval.__padding1 = 0;
639 interval.__padding2 = 0;
640 interval.__padding3 = 0;
641 dateTime.u.interval = interval;
642 value.datetime = dateTime;
643 *miValue = value;
644 }
645 break;
646 }
647 case MI_BOOLEANA:
648 {
649 Py_ssize_t size = PyList_Size(propertyValue);
650 MI_BooleanA miBooleanA;
651 miBooleanA.size = size;
652 krisbash 1.1 int i;
653 MI_Boolean booleanA[size];
654 for (i = 0; i < size; i++)
655 {
656 PyObject* boolean = PyList_GetItem(propertyValue,i);
657 if(boolean == Py_False)
658 {
659 booleanA[i] = MI_FALSE;
660 }
661 else
662 {
663 booleanA[i] = MI_TRUE;
664 }
665 }
666 miBooleanA.data = booleanA;
667 value.booleana = miBooleanA;
668 *miValue = value;
669 break;
670 }
671 case MI_UINT8A:
672 {
673 krisbash 1.1 Py_ssize_t size = PyList_Size(propertyValue);
674 MI_Uint8A miUint8A;
675 miUint8A.size = size;
676 int i;
677 MI_Uint8 uint8A[size];
678 for (i = 0; i < size; i++)
679 {
680 PyObject *value = PyList_GetItem(propertyValue,i);
681 uint8A[i] = PyInt_AsLong(value);
682 }
683 miUint8A.data = uint8A;
684 value.uint8a = miUint8A;
685 *miValue = value;
686 break;
687 }
688 case MI_SINT8A:
689 {
690 Py_ssize_t size = PyList_Size(propertyValue);
691 MI_Sint8A miSint8A;
692 miSint8A.size = size;
693 int i;
694 krisbash 1.1 MI_Sint8 sint8A[size];
695 for (i = 0; i < size; i++)
696 {
697 PyObject *value = PyList_GetItem(propertyValue,i);
698 sint8A[i] = PyInt_AsLong(value);
699 }
700 miSint8A.data = sint8A;
701 value.sint8a = miSint8A;
702 *miValue = value;
703 break;
704 }
705 case MI_UINT16A:
706 {
707 Py_ssize_t size = PyList_Size(propertyValue);
708 MI_Uint16A miUint16A;
709 miUint16A.size = size;
710 int i;
711 MI_Uint16 uint16A[size];
712 for (i = 0; i < size; i++)
713 {
714 PyObject *value = PyList_GetItem(propertyValue,i);
715 krisbash 1.1 uint16A[i] = PyInt_AsLong(value);
716 }
717 miUint16A.data = uint16A;
718 value.uint16a = miUint16A;
719 *miValue = value;
720 break;
721 }
722 case MI_SINT16A:
723 {
724 Py_ssize_t size = PyList_Size(propertyValue);
725 MI_Sint16A miSint16A;
726 miSint16A.size = size;
727 int i;
728 MI_Sint16 sint16A[size];
729 for (i = 0; i < size; i++)
730 {
731 PyObject *value = PyList_GetItem(propertyValue,i);
732 sint16A[i] = PyInt_AsLong(value);
733 }
734 miSint16A.data = sint16A;
735 value.sint16a = miSint16A;
736 krisbash 1.1 *miValue = value;
737 break;
738 }
739 case MI_UINT32A:
740 {
741 Py_ssize_t size = PyList_Size(propertyValue);
742 MI_Uint32A miUint32A;
743 miUint32A.size = size;
744 int i;
745 MI_Uint32 uint32A[size];
746 for (i = 0; i < size; i++)
747 {
748 PyObject *value = PyList_GetItem(propertyValue,i);
749 uint32A[i] = PyLong_AsLong(value);
750 }
751 miUint32A.data = uint32A;
752 value.uint32a = miUint32A;
753 *miValue = value;
754 break;
755 }
756 case MI_SINT32A:
757 krisbash 1.1 {
758 Py_ssize_t size = PyList_Size(propertyValue);
759 MI_Sint32A miSint32A;
760 miSint32A.size = size;
761 int i;
762 MI_Sint32 sint32A[size];
763 for (i = 0; i < size; i++)
764 {
765 PyObject *value = PyList_GetItem(propertyValue,i);
766 sint32A[i] = PyLong_AsLong(value);
767 }
768 miSint32A.data = sint32A;
769 value.sint32a = miSint32A;
770 *miValue = value;
771 break;
772 }
773 case MI_UINT64A:
774 {
775 Py_ssize_t size = PyList_Size(propertyValue);
776 MI_Uint64A miUint64A;
777 miUint64A.size = size;
778 krisbash 1.1 int i;
779 MI_Uint64 uint64A[size];
780 for (i = 0; i < size; i++)
781 {
782 PyObject *value = PyList_GetItem(propertyValue,i);
783 uint64A[i] = PyLong_AsUnsignedLong(value);
784 }
785 miUint64A.data = uint64A;
786 value.uint64a = miUint64A;
787 *miValue = value;
788 break;
789 }
790 case MI_SINT64A:
791 {
792 Py_ssize_t size = PyList_Size(propertyValue);
793 MI_Sint64A miSint64A;
794 miSint64A.size = size;
795 int i;
796 MI_Sint64 sint64A[size];
797 for (i = 0; i < size; i++)
798 {
799 krisbash 1.1 PyObject *value = PyList_GetItem(propertyValue,i);
800 sint64A[i] = PyLong_AsLong(value);
801 }
802 miSint64A.data = sint64A;
803 value.sint64a = miSint64A;
804 *miValue = value;
805 break;
806 }
807 case MI_REAL32A:
808 {
809 Py_ssize_t size = PyList_Size(propertyValue);
810 MI_Real32A miReal32A;
811 miReal32A.size = size;
812 int i;
813 MI_Real32 real32A[size];
814 for (i = 0; i < size; i++)
815 {
816 PyObject *value = PyList_GetItem(propertyValue,i);
817 real32A[i] = PyFloat_AsDouble(value);
818 }
819 miReal32A.data = real32A;
820 krisbash 1.1 value.real32a = miReal32A;
821 *miValue = value;
822 break;
823 }
824 case MI_REAL64A:
825 {
826 Py_ssize_t size = PyList_Size(propertyValue);
827 MI_Real64A miReal64A;
828 miReal64A.size = size;
829 int i;
830 MI_Real64 real64A[size];
831 for (i = 0; i < size; i++)
832 {
833 PyObject *value = PyList_GetItem(propertyValue,i);
834 real64A[i] = PyFloat_AsDouble(value);
835 }
836 miReal64A.data = real64A;
837 value.real64a = miReal64A;
838 *miValue = value;
839 break;
840 }
841 krisbash 1.1 case MI_CHAR16A:
842 {
843 Py_ssize_t size = PyList_Size(propertyValue);
844 MI_Char16A miChar16A;
845 miChar16A.size = size;
846 int i;
847 MI_Char16 char16A[size];
848 for (i = 0; i < size; i++)
849 {
850 PyObject *value = PyList_GetItem(propertyValue,i);
851 char16A[i] = PyInt_AsLong(value);
852 }
853 miChar16A.data = char16A;
854 value.char16a = miChar16A;
855 *miValue = value;
856 break;
857 }
858 case MI_STRINGA:
859 {
860 Py_ssize_t size = PyList_Size(propertyValue);
861 MI_StringA miStringA;
862 krisbash 1.1 miStringA.size = size;
863 int i;
864 MI_Char *stringA[size];
865 for (i = 0; i < size; i++)
866 {
867 PyObject *value = PyList_GetItem(propertyValue,i);
868 stringA[i] = PyString_AsString(value);
869 }
870 miStringA.data = stringA;
871 value.stringa = miStringA;
872 *miValue = value;
873 break;
874 }
875 case MI_DATETIMEA:
876 {
877 //to implement
878 Py_ssize_t size = PyList_Size(propertyValue);
879 MI_DatetimeA miDatetimeA;
880 miDatetimeA.size = size;
881 break;
882 }
883 krisbash 1.1 case MI_INSTANCE:
884 {
885 PMI_Instance *pmiInstance = (PMI_Instance *)propertyValue;
886 MI_Instance *miInstance = pmiInstance->miInstance;
887 value.instance = miInstance;
888 *miValue = value;
889 break;
890 }
891 case MI_REFERENCE:
892 {
893 PMI_Instance *pmiInstance = (PMI_Instance *)propertyValue;
894 MI_Instance *miReference = pmiInstance->miInstance;
895 value.reference = miReference;
896 *miValue = value;
897 break;
898 }
899 case MI_INSTANCEA:
900 {
901 Py_ssize_t size = PyList_Size(propertyValue);
902 MI_InstanceA miInstanceA;
903 miInstanceA.size = size;
904 krisbash 1.1 int i;
905 MI_Instance *instanceA[size];
906 for(i = 0; i< size; i++)
907 {
908 PyObject *value = PyList_GetItem(propertyValue,i);
909 PMI_Instance *pmiInstance = (PMI_Instance *)value;
910 instanceA[i] = pmiInstance->miInstance;
911 }
912 miInstanceA.data = instanceA;
913 value.instancea = miInstanceA;
914 *miValue = value;
915 break;
916 }
917 case MI_REFERENCEA:
918 {
919 Py_ssize_t size = PyList_Size(propertyValue);
920 MI_ReferenceA miReferenceA;
921 miReferenceA.size = size;
922 int i;
923 MI_Instance *referenceA[size];
924 for(i = 0; i< size; i++)
925 krisbash 1.1 {
926 PyObject *value = PyList_GetItem(propertyValue,i);
927 PMI_Instance *pmiInstance = (PMI_Instance *)value;
928 referenceA[i] = pmiInstance->miInstance;
929 }
930 miReferenceA.data = referenceA;
931 value.referencea = miReferenceA;
932 *miValue = value;
933 break;
934 }
935 }
936 }
937
938 static PyObject *EnumerateProperties(PMI_Instance *pmiInstance, char *propertyName)
939 {
940 if(pmiInstance->propertyValues == NULL)
941 {
942 Py_INCREF(Py_None);
943 return Py_None;
944 }
945 PyObject *propertyValues = pmiInstance->propertyValues;
946 krisbash 1.1 if(!strcmp(propertyName,"propertyValues"))
947 {
948 return propertyValues;
949 }
950 else if(!strcmp(propertyName,"propertyTypes"))
951 {
952 PyObject *propertyTypes = pmiInstance->propertyTypes;
953 return propertyTypes;
954 }
955 else if(!strcmp(propertyName,"propertyFlags"))
956 {
957 PyObject *propertyFlags = pmiInstance->propertyFlags;
958 return propertyFlags;
959 }
960 else
961 {
962 PyObject *value = PyDict_GetItemString(propertyValues,propertyName);
963 if(value == NULL)
964 {
965 PyErr_SetString(MIError,"MI_Instance doesn't have the property");
966 return NULL;
967 krisbash 1.1 }
968 return value;
969 }
970 }
971
972 static PyObject *GetProperty(PMI_Instance *self, char* propertyName)
973 {
974 return EnumerateProperties(self,propertyName);
975 }
976
977 static void SetProperty(PMI_Instance *self, char* propertyName, PyObject* value)
978 {
979 MI_Instance *miInstance = self->miInstance;
980 PyObject *propertyValues = self->propertyValues;
981 PyObject *newValue = PyDict_GetItemString(propertyValues,propertyName);
982 if(newValue == NULL)
983 {
984 PyErr_SetString(MIError,"MI_Instance doesn't have the property");
985 }
986 newValue = value;
987 if(PyDict_SetItemString(propertyValues,propertyName,newValue)<0)
988 krisbash 1.1 {
989 PyErr_SetString(MIError,"Set instance property failed");
990 }
991
992 PyObject *propertyTypes = self->propertyTypes;
993 PyObject *valueType = PyDict_GetItemString(propertyTypes,propertyName);
994 if(valueType == NULL)
995 {
996 PyErr_SetString(MIError,"MI_Instance doesn't have the property");
997 }
998 MI_Type miType = PyInt_AsLong(valueType);
999 MI_Value miValue;
1000 MI_Result miResult = MI_RESULT_OK;
1001 SetPropertyValues(miType,value,&miValue);
1002 miResult = MI_Instance_SetElement(miInstance,propertyName,&miValue,miType,0);
1003 if(miResult != MI_RESULT_OK)
1004 {
1005 PyErr_SetString(MIError,"MI_Instance set element failed");
1006 }
1007
1008 }
1009 krisbash 1.1
1010 static int PMI_Instance_init(PMI_Instance *self)
1011 {
1012 self-> miInstance = NULL;
1013 self->propertyValues = NULL;
1014 self->propertyTypes = NULL;
1015 self->propertyFlags = NULL;
1016 return 0;
1017 }
1018
1019 static PyMethodDef PMI_Instance_methods [] = {
1020 {NULL}
1021 };
1022
1023 static PyObject* PMI_Instance_getattr(PMI_Instance* self, char* propertyName)
1024 {
1025 PyObject *propertyValue = GetProperty(self, propertyName);
1026 Py_INCREF(propertyValue);
1027 return propertyValue;
1028 }
1029
1030 krisbash 1.1 static int PMI_Instance_setattr(PMI_Instance* self, char* propertyName, PyObject* value)
1031 {
1032 SetProperty(self,propertyName,value);
1033 return 0;
1034 }
1035
1036 static PyTypeObject PMI_InstanceType = {
1037 PyVarObject_HEAD_INIT(NULL, 0)
1038 "PMI_Instance.PMI_Instance", /* tp_name */
1039 sizeof(PMI_Instance), /* tp_basicsize */
1040 0, /* tp_itemsize */
1041 (destructor)PMI_Instance_dealloc, /* tp_dealloc */
1042 0, /* tp_print */
1043 (getattrfunc)PMI_Instance_getattr, /* tp_getattr */
1044 (setattrfunc)PMI_Instance_setattr, /* tp_setattr */
1045 0, /* tp_reserved */
1046 0, /* tp_repr */
1047 0, /* tp_as_number */
1048 0, /* tp_as_sequence */
1049 0, /* tp_as_mapping */
1050 0, /* tp_hash */
1051 krisbash 1.1 0, /* tp_call */
1052 0, /* tp_str */
1053 0, /* tp_getattro */
1054 0, /* tp_setattro */
1055 0, /* tp_as_buffer */
1056 Py_TPFLAGS_DEFAULT, /* tp_flags */
1057 "MI_Instance objects", /* tp_doc */
1058 0, /* tp_traverse */
1059 0, /* tp_clear */
1060 0, /* tp_richcompare */
1061 0, /* tp_weaklistoffset */
1062 0, /* tp_iter */
1063 0, /* tp_iternext */
1064 PMI_Instance_methods, /* tp_methods */
1065 0, /* tp_members */
1066 0, /* tp_getset */
1067 0, /* tp_base */
1068 0, /* tp_dict */
1069 0, /* tp_descr_get */
1070 0, /* tp_descr_set */
1071 0, /* tp_dictoffset */
1072 krisbash 1.1 (initproc)PMI_Instance_init, /* tp_init */
1073 0, /* tp_alloc */
1074 (newfunc)PMI_Instance_new, /* tp_new */
1075 };
1076
1077
1078 #define PyMODINIT_FUNC void
1079 #ifndef PyMODINIT_FUNC
1080 #endif
1081 PyMODINIT_FUNC
1082 initPMI_Instance(void)
1083 {
1084 PyObject *m;
1085 /*Make sure the new type object is initialized properly*/
1086 if (PyType_Ready(&PMI_InstanceType) <0)
1087 return;
1088 m = Py_InitModule3("mi",PMI_Instance_methods, "MI_Instance object");
1089 //Py_INCREF(&PMI_InstanceType);
1090
1091 /*Add the exception type to the module */
1092 MIError = PyErr_NewException("mi.error",NULL,NULL);
1093 krisbash 1.1 Py_INCREF(MIError);
1094 PyModule_AddObject(m,"MIError",MIError);
1095
1096 /*New type objects are all exported into mi module*/
1097 PyModule_AddObject(m, "PMI_Instance", (PyObject *)&PMI_InstanceType);
1098 PyDateTime_IMPORT;
1099 }
|