1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
47: abstract class AlphaDAO {
48: 49: 50: 51: 52: 53:
54: protected $OID;
55:
56: 57: 58: 59: 60: 61:
62: protected $lastQuery;
63:
64: 65: 66: 67: 68: 69:
70: protected $version_num;
71:
72: 73: 74: 75: 76: 77:
78: protected $created_ts;
79:
80: 81: 82: 83: 84: 85:
86: protected $created_by;
87:
88: 89: 90: 91: 92: 93:
94: protected $updated_ts;
95:
96: 97: 98: 99: 100: 101:
102: protected $updated_by;
103:
104: 105: 106: 107: 108: 109:
110: protected $defaultAttributes = array("OID", "lastQuery", "version_num", "dataLabels", "created_ts", "created_by", "updated_ts", "updated_by", "defaultAttributes", "transientAttributes", "uniqueAttributes", "TABLE_NAME", "logger");
111:
112: 113: 114: 115: 116: 117:
118: protected $transientAttributes = array("lastQuery", "dataLabels", "defaultAttributes", "transientAttributes", "uniqueAttributes", "TABLE_NAME", "logger");
119:
120: 121: 122: 123: 124: 125:
126: protected $uniqueAttributes = array();
127:
128: 129: 130: 131: 132: 133:
134: protected $dataLabels = array();
135:
136: 137: 138: 139: 140: 141:
142: private static $logger = null;
143:
144: 145: 146: 147: 148: 149:
150: private $maintainHistory = false;
151:
152: 153: 154: 155: 156:
157: public function __construct() {
158: self::$logger = new Logger('AlphaDAO');
159: self::$logger->debug('>>__construct()');
160:
161: $this->version_num = new Integer(0);
162: $this->created_ts = new Timestamp(date("Y-m-d H:i:s"));
163: $person_ID = (isset($_SESSION['currentUser'])? $_SESSION['currentUser']->getOID(): 0);
164: $this->created_by = new Integer($person_ID);
165: $this->updated_ts = new Timestamp(date("Y-m-d H:i:s"));
166: $this->updated_by = new Integer($person_ID);
167:
168: self::$logger->debug('<<__construct');
169: }
170:
171: 172: 173: 174: 175: 176: 177: 178:
179: public static function getConnection() {
180: throw new AlphaException('The static getConnection() method is not longer supported! Please update your code to instantiate a AlphaDAOProviderInterface '.
181: 'instance, then invoke the query() method on that instance to run a custom query.');
182: }
183:
184: 185: 186: 187: 188:
189: public static function disconnect() {
190: global $config;
191:
192: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), new PersonObject());
193: $provider->disconnect();
194: }
195:
196: 197: 198: 199: 200: 201: 202: 203:
204: public function query($sqlQuery) {
205: self::$logger->debug('>>query(sqlQuery=['.$sqlQuery.'])');
206:
207: global $config;
208:
209: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
210: $result = $provider->query($sqlQuery);
211:
212: self::$logger->debug('<<query ['.print_r($result, true).']');
213: return $result;
214: }
215:
216: 217: 218: 219: 220: 221: 222:
223: public function load($OID) {
224: self::$logger->debug('>>load(OID=['.$OID.'])');
225:
226: if(method_exists($this, 'before_load_callback'))
227: $this->before_load_callback();
228:
229: global $config;
230:
231: $this->OID = $OID;
232:
233: if($config->get('cache.provider.name') != '' && $this->loadFromCache()) {
234:
235: }else{
236: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
237: $provider->load($OID);
238:
239: if($config->get('cache.provider.name') != '')
240: $this->addToCache();
241: }
242:
243: $this->setEnumOptions();
244:
245: if(method_exists($this, 'after_load_callback'))
246: $this->after_load_callback();
247:
248: self::$logger->debug('<<load');
249: }
250:
251: 252: 253: 254: 255: 256: 257: 258: 259: 260:
261: public function loadByAttribute($attribute, $value, $ignoreClassType=false, $loadAttributes=array()) {
262: self::$logger->debug('>>loadByAttribute(attribute=['.$attribute.'], value=['.$value.'], ignoreClassType=['.$ignoreClassType.'],
263: loadAttributes=['.var_export($loadAttributes, true).'])');
264:
265: if(method_exists($this, 'before_loadByAttribute_callback'))
266: $this->before_loadByAttribute_callback();
267:
268: global $config;
269:
270: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
271: $provider->loadByAttribute($attribute, $value, $ignoreClassType, $loadAttributes);
272:
273: $this->setEnumOptions();
274:
275: if($config->get('cache.provider.name') != '' && count($loadAttributes) == 0)
276: $this->addToCache();
277:
278: if(method_exists($this, 'after_loadByAttribute_callback'))
279: $this->after_loadByAttribute_callback();
280:
281: self::$logger->debug('<<loadByAttribute');
282: }
283:
284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295:
296: public function loadAll($start=0, $limit=0, $orderBy='OID', $order='ASC', $ignoreClassType=false) {
297: self::$logger->debug('>>loadAll(start=['.$start.'], limit=['.$limit.'], orderBy=['.$orderBy.'], order=['.$order.'], ignoreClassType=['.$ignoreClassType.']');
298:
299: if(method_exists($this, 'before_loadAll_callback'))
300: $this->before_loadAll_callback();
301:
302: global $config;
303:
304: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
305: $objects = $provider->loadAll($start, $limit, $orderBy, $order, $ignoreClassType);
306:
307: if(method_exists($this, 'after_loadAll_callback'))
308: $this->after_loadAll_callback();
309:
310: self::$logger->debug('<<loadAll ['.count($objects).']');
311: return $objects;
312: }
313:
314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329:
330: public function loadAllByAttribute($attribute, $value, $start=0, $limit=0, $orderBy="OID", $order="ASC", $ignoreClassType=false, $constructorArgs=array()) {
331: self::$logger->debug('>>loadAllByAttribute(attribute=['.$attribute.'], value=['.$value.'], start=['.$start.'], limit=['.$limit.'], orderBy=['.$orderBy.'], order=['.$order.'], ignoreClassType=['.$ignoreClassType.'], constructorArgs=['.print_r($constructorArgs, true).']');
332:
333: if(method_exists($this, 'before_loadAllByAttribute_callback'))
334: $this->before_loadAllByAttribute_callback();
335:
336: global $config;
337:
338: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
339: $objects = $provider->loadAllByAttribute($attribute, $value, $start, $limit, $orderBy, $order, $ignoreClassType);
340:
341: if(method_exists($this, 'after_loadAllByAttribute_callback'))
342: $this->after_loadAllByAttribute_callback();
343:
344: self::$logger->debug('<<loadAllByAttribute ['.count($objects).']');
345: return $objects;
346: }
347:
348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362:
363: public function loadAllByAttributes($attributes=array(), $values=array(), $start=0, $limit=0, $orderBy='OID', $order='ASC', $ignoreClassType=false) {
364: self::$logger->debug('>>loadAllByAttributes(attributes=['.var_export($attributes, true).'], values=['.var_export($values, true).'], start=['.
365: $start.'], limit=['.$limit.'], orderBy=['.$orderBy.'], order=['.$order.'], ignoreClassType=['.$ignoreClassType.']');
366:
367: if(method_exists($this, 'before_loadAllByAttributes_callback'))
368: $this->before_loadAllByAttributes_callback();
369:
370: global $config;
371:
372: if(!is_array($attributes) || !is_array($values)) {
373: throw new IllegalArguementException('Illegal arrays attributes=['.var_export($attributes, true).'] and values=['.var_export($values, true).
374: '] provided to loadAllByAttributes');
375: }
376:
377: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
378: $objects = $provider->loadAllByAttributes($attributes, $values, $start, $limit, $orderBy, $order, $ignoreClassType);
379:
380: if(method_exists($this, 'after_loadAllByAttributes_callback'))
381: $this->after_loadAllByAttributes_callback();
382:
383: self::$logger->debug('<<loadAllByAttributes ['.count($objects).']');
384: return $objects;
385: }
386:
387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399:
400: public function loadAllByDayUpdated($date, $start=0, $limit=0, $orderBy="OID", $order="ASC", $ignoreClassType=false) {
401: self::$logger->debug('>>loadAllByDayUpdated(date=['.$date.'], start=['.$start.'], limit=['.$limit.'], orderBy=['.$orderBy.'], order=['.$order.'], ignoreClassType=['.$ignoreClassType.']');
402:
403: if(method_exists($this, 'before_loadAllByDayUpdated_callback'))
404: $this->before_loadAllByDayUpdated_callback();
405:
406: global $config;
407:
408: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
409: $objects = $provider->loadAllByDayUpdated($date, $start, $limit, $orderBy, $order, $ignoreClassType);
410:
411: if(method_exists($this, 'after_loadAllByDayUpdated_callback'))
412: $this->after_loadAllByDayUpdated_callback();
413:
414: self::$logger->debug('<<loadAllByDayUpdated ['.count($objects).']');
415: return $objects;
416: }
417:
418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430:
431: public function loadAllFieldValuesByAttribute($attribute, $value, $returnAttribute, $order='ASC', $ignoreClassType=false) {
432: self::$logger->debug('>>loadAllFieldValuesByAttribute(attribute=['.$attribute.'], value=['.$value.'], returnAttribute=['.$returnAttribute.'], order=['.$order.'], ignoreClassType=['.$ignoreClassType.']');
433:
434: global $config;
435:
436: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
437: $values = $provider->loadAllFieldValuesByAttribute($attribute, $value, $returnAttribute, $order, $ignoreClassType);
438:
439: self::$logger->debug('<<loadAllFieldValuesByAttribute ['.count($values).']');
440: return $values;
441: }
442:
443: 444: 445: 446: 447: 448: 449: 450:
451: public function save() {
452: self::$logger->debug('>>save()');
453:
454: if(method_exists($this, 'before_save_callback'))
455: $this->before_save_callback();
456:
457: global $config;
458:
459:
460: if(!$this->validate()) {
461: throw new FailedSaveException('Could not save due to a validation error.');
462: return;
463: }else{
464: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
465: $provider->save();
466:
467: if($config->get('cache.provider.name') != '')
468: $this->removeFromCache();
469:
470: if(method_exists($this, 'after_save_callback'))
471: $this->after_save_callback();
472: }
473: }
474:
475: 476: 477: 478: 479: 480: 481: 482: 483: 484:
485: public function saveAttribute($attribute, $value) {
486: self::$logger->debug('>>saveAttribute(attribute=['.$attribute.'], value=['.$value.'])');
487:
488: if(method_exists($this, 'before_saveAttribute_callback'))
489: $this->before_saveAttribute_callback();
490:
491: global $config;
492:
493: if(!isset($this->$attribute))
494: throw new IllegalArguementException('Could not perform save, as the attribute ['.$attribute.'] is not present on the class['.get_class($this).']');
495:
496: if($this->isTransient())
497: throw new FailedSaveException('Cannot perform saveAttribute method on transient BO!');
498:
499: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
500: $provider->saveAttribute($attribute, $value);
501:
502: $this->set($attribute, $value);
503:
504: if($config->get('cache.provider.name') != '')
505: $this->removeFromCache();
506:
507: if(method_exists($this, 'after_saveAttribute_callback'))
508: $this->after_saveAttribute_callback();
509:
510: self::$logger->debug('<<saveAttribute');
511: }
512:
513: 514: 515: 516: 517: 518:
519: public function saveHistory() {
520: self::$logger->debug('>>saveHistory()');
521:
522: if(method_exists($this, 'before_saveHistory_callback'))
523: $this->before_saveHistory_callback();
524:
525: global $config;
526:
527: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
528: $provider->saveHistory();
529:
530: if(method_exists($this, 'after_saveHistory_callback'))
531: $this->after_saveHistory_callback();
532: }
533:
534: 535: 536: 537: 538: 539: 540:
541: protected function validate() {
542: self::$logger->debug('>>validate()');
543:
544: if(method_exists($this, 'before_validate_callback'))
545: $this->before_validate_callback();
546:
547: $valid = true;
548:
549:
550: $reflection = new ReflectionClass(get_class($this));
551: $properties = $reflection->getProperties();
552:
553: foreach($properties as $propObj) {
554: $propName = $propObj->name;
555: if(!in_array($propName, $this->defaultAttributes) && !in_array($propName, $this->transientAttributes)) {
556: $propClass = get_class($this->getPropObject($propName));
557: if (strtoupper($propClass) != "ENUM" &&
558: strtoupper($propClass) != "DENUM" &&
559: strtoupper($propClass) != "DENUMITEM" &&
560: strtoupper($propClass) != "BOOLEAN") {
561: if ($this->getPropObject($propName) != false && !preg_match($this->getPropObject($propName)->getRule(), $this->getPropObject($propName)->getValue())) {
562: throw new ValidationException('Failed to save, validation error is: '.$this->getPropObject($propName)->getHelper());
563: $valid = false;
564: }
565: }
566: }
567: }
568:
569: if(method_exists($this, 'after_validate_callback'))
570: $this->after_validate_callback();
571:
572: self::$logger->debug('<<validate ['.$valid.']');
573: return $valid;
574: }
575:
576: 577: 578: 579: 580: 581:
582: public function delete() {
583: self::$logger->debug('>>delete()');
584:
585: if(method_exists($this, 'before_delete_callback'))
586: $this->before_delete_callback();
587:
588: global $config;
589:
590:
591: $reflection = new ReflectionClass(get_class($this));
592: $properties = $reflection->getProperties();
593:
594:
595: foreach($properties as $propObj) {
596: $propName = $propObj->name;
597:
598: if(!$propObj->isPrivate() && isset($this->$propName) && $this->$propName instanceof Relation) {
599: $prop = $this->getPropObject($propName);
600:
601:
602: if($prop->getRelationType() == 'MANY-TO-MANY') {
603: self::$logger->debug('Deleting MANY-TO-MANY lookup objects...');
604:
605: try{
606:
607: $side = $prop->getSide(get_class($this));
608: }catch (IllegalArguementException $iae) {
609: $side = $prop->getSide(ucfirst($this->getTableName()).'Object');
610: }
611:
612: self::$logger->debug('Side is ['.$side.']'.$this->getOID());
613:
614: $lookUp = $prop->getLookup();
615: self::$logger->debug('Lookup object['.var_export($lookUp, true).']');
616:
617:
618: if($side == 'left')
619: $lookUp->deleteAllByAttribute('leftID', $this->getOID());
620: else
621: $lookUp->deleteAllByAttribute('rightID', $this->getOID());
622: self::$logger->debug('...done deleting!');
623: }
624:
625:
626: if($prop->getRelationType() == 'ONE-TO-MANY' && !$prop->getRelatedClass() == 'TagObject') {
627: $relatedObjects = $prop->getRelatedObjects();
628:
629: foreach($relatedObjects as $object) {
630: $object->set($prop->getRelatedClassField(), null);
631: $object->save();
632: }
633: }
634:
635:
636: if($prop->getRelationType() == 'ONE-TO-MANY' && $prop->getRelatedClass() == 'TagObject') {
637:
638: $prop->setValue($this->getOID());
639: $relatedObjects = $prop->getRelatedObjects();
640:
641: foreach($relatedObjects as $object) {
642: $object->delete();
643: }
644: }
645: }
646: }
647:
648: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
649: $provider->delete();
650:
651: if($config->get('cache.provider.name') != '')
652: $this->removeFromCache();
653:
654: if(method_exists($this, 'after_delete_callback'))
655: $this->after_delete_callback();
656:
657: $this->clear();
658: self::$logger->debug('<<delete');
659: }
660:
661: 662: 663: 664: 665: 666: 667: 668: 669:
670: public function deleteAllByAttribute($attribute, $value) {
671: self::$logger->debug('>>deleteAllByAttribute(attribute=['.$attribute.'], value=['.$value.'])');
672:
673: if(method_exists($this, 'before_deleteAllByAttribute_callback'))
674: $this->before_deleteAllByAttribute_callback();
675:
676: try {
677: $doomedObjects = $this->loadAllByAttribute($attribute, $value);
678: $deletedRowCount = 0;
679:
680: foreach ($doomedObjects as $object) {
681: $object->delete();
682: $deletedRowCount++;
683: }
684: }catch (BONotFoundException $bonf) {
685:
686: self::$logger->warn($bonf->getMessage());
687: return 0;
688: }catch (AlphaException $e) {
689: throw new FailedDeleteException('Failed to delete objects, error is ['.$e->getMessage().']');
690: self::$logger->debug('<<deleteAllByAttribute [0]');
691: return 0;
692: }
693:
694: if(method_exists($this, 'after_deleteAllByAttribute_callback'))
695: $this->after_deleteAllByAttribute_callback();
696:
697: self::$logger->debug('<<deleteAllByAttribute ['.$deletedRowCount.']');
698: return $deletedRowCount;
699: }
700:
701: 702: 703: 704: 705: 706: 707:
708: public function getVersion() {
709: self::$logger->debug('>>getVersion()');
710:
711: if(method_exists($this, 'before_getVersion_callback'))
712: $this->before_getVersion_callback();
713:
714: global $config;
715:
716: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
717: $ver = $provider->getVersion();
718:
719: if(method_exists($this, 'after_getVersion_callback'))
720: $this->after_getVersion_callback();
721:
722: self::$logger->debug('<<getVersion ['.$ver.']');
723: return $ver;
724: }
725:
726: 727: 728: 729: 730: 731:
732: public function makeTable() {
733: self::$logger->debug('>>makeTable()');
734:
735: if(method_exists($this, 'before_makeTable_callback'))
736: $this->before_makeTable_callback();
737:
738: global $config;
739:
740: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
741: $provider->makeTable();
742:
743: if(method_exists($this, 'after_makeTable_callback'))
744: $this->after_makeTable_callback();
745:
746: self::$logger->info('Successfully created the table ['.$this->getTableName().'] for the class ['.get_class($this).']');
747:
748: self::$logger->debug('<<makeTable');
749: }
750:
751: 752: 753: 754: 755: 756:
757: public function makeHistoryTable() {
758: self::$logger->debug('>>makeHistoryTable()');
759:
760: if(method_exists($this, 'before_makeHistoryTable_callback'))
761: $this->before_makeHistoryTable_callback();
762:
763: global $config;
764:
765: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
766: $provider->makeHistoryTable();
767:
768: if(method_exists($this, 'after_makeHistoryTable_callback'))
769: $this->after_makeHistoryTable_callback();
770:
771: self::$logger->info('Successfully created the table ['.$this->getTableName().'_history] for the class ['.get_class($this).']');
772:
773: self::$logger->debug('<<makeHistoryTable');
774: }
775:
776: 777: 778: 779: 780: 781:
782: public function rebuildTable() {
783: self::$logger->debug('>>rebuildTable()');
784:
785: if(method_exists($this, 'before_rebuildTable_callback'))
786: $this->before_rebuildTable_callback();
787:
788: global $config;
789:
790: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
791: $provider->rebuildTable();
792:
793: if(method_exists($this, 'after_rebuildTable_callback'))
794: $this->after_rebuildTable_callback();
795:
796: self::$logger->debug('<<rebuildTable');
797: }
798:
799: 800: 801: 802: 803: 804: 805:
806: public function dropTable($tableName=null) {
807: self::$logger->debug('>>dropTable()');
808:
809: if(method_exists($this, 'before_dropTable_callback'))
810: $this->before_dropTable_callback();
811:
812: global $config;
813:
814: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
815: $provider->dropTable($tableName);
816:
817: if(method_exists($this, 'after_dropTable_callback'))
818: $this->after_dropTable_callback();
819:
820: self::$logger->debug('<<dropTable');
821: }
822:
823: 824: 825: 826: 827: 828: 829: 830:
831: public function addProperty($propName) {
832: self::$logger->debug('>>addProperty(propName=['.$propName.'])');
833:
834: global $config;
835:
836: if(method_exists($this, 'before_addProperty_callback'))
837: $this->before_addProperty_callback();
838:
839: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
840: $provider->addProperty($propName);
841:
842: if(method_exists($this, 'after_addProperty_callback'))
843: $this->after_addProperty_callback();
844:
845: self::$logger->debug('<<addProperty');
846: }
847:
848: 849: 850: 851: 852: 853:
854: public function populateFromPost($filterAll=false) {
855: self::$logger->debug('>>populateFromPost(filterAll=['.$filterAll.'])');
856:
857: if(method_exists($this, 'before_populateFromPost_callback'))
858: $this->before_populateFromPost_callback();
859:
860:
861: $reflection = new ReflectionClass(get_class($this));
862: $properties = $reflection->getProperties();
863:
864: foreach($properties as $propObj) {
865: $propName = $propObj->name;
866:
867: if(!in_array($propName, $this->defaultAttributes) && !in_array($propName, $this->transientAttributes)) {
868: $propClass = get_class($this->getPropObject($propName));
869:
870: if(isset($_POST[$propName])) {
871:
872: if(strtoupper($propClass) == 'BOOLEAN' && $_POST[$propName] == 'on') {
873: $_POST[$propName] = 1;
874: }
875:
876: if (strtoupper($propClass) != 'DATE' && strtoupper($propClass) != 'TIMESTAMP') {
877: if($filterAll) {
878: $this->getPropObject($propName)->setValue(InputFilter::encode($_POST[$propName], false));
879: }else{
880: if(strtoupper($propClass) == 'TEXT' && !$this->getPropObject($propName)->getAllowHTML())
881: $this->getPropObject($propName)->setValue(InputFilter::encode($_POST[$propName], false));
882: else
883: $this->getPropObject($propName)->setValue(InputFilter::encode($_POST[$propName], true));
884: }
885: }else{
886: if($filterAll)
887: $this->getPropObject($propName)->populateFromString(InputFilter::encode($_POST[$propName], false));
888: else
889: $this->getPropObject($propName)->populateFromString(InputFilter::encode($_POST[$propName], true));
890: }
891: }
892: }
893: if ($propName == 'version_num' && isset($_POST['version_num']))
894: $this->version_num->setValue($_POST['version_num']);
895: }
896: if(method_exists($this, 'after_populateFromPost_callback'))
897: $this->after_populateFromPost_callback();
898:
899: self::$logger->debug('<<populateFromPost');
900: }
901:
902: 903: 904: 905: 906: 907: 908:
909: public function getMAX() {
910: self::$logger->debug('>>getMAX()');
911:
912: if(method_exists($this, 'before_getMAX_callback'))
913: $this->before_getMAX_callback();
914:
915: global $config;
916:
917: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
918: $max = $provider->getMAX();
919:
920: if(method_exists($this, 'after_getMAX_callback'))
921: $this->after_getMAX_callback();
922:
923: self::$logger->debug('<<getMAX ['.$max.']');
924: return $max;
925: }
926:
927: 928: 929: 930: 931: 932: 933: 934: 935:
936: public function getCount($attributes=array(), $values=array()) {
937: self::$logger->debug('>>getCount(attributes=['.var_export($attributes, true).'], values=['.var_export($values, true).'])');
938:
939: if(method_exists($this, 'before_getCount_callback'))
940: $this->before_getCount_callback();
941:
942: global $config;
943:
944: if(!is_array($attributes) || !is_array($values)) {
945: throw new IllegalArguementException('Illegal arrays attributes=['.var_export($attributes, true).'] and values=['.var_export($values, true).'] provided to loadAllByAttributes');
946: }
947:
948: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
949: $count = $provider->getCount($attributes, $values);
950:
951: if(method_exists($this, 'after_getCount_callback'))
952: $this->after_getCount_callback();
953:
954: self::$logger->debug('<<getCount ['.$count.']');
955: return $count;
956: }
957:
958: 959: 960: 961: 962: 963: 964: 965:
966: public function getHistoryCount() {
967: self::$logger->debug('>>getHistoryCount()');
968:
969: if(method_exists($this, 'before_getHistoryCount_callback'))
970: $this->before_getHistoryCount_callback();
971:
972: global $config;
973:
974: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
975: $count = $provider->getHistoryCount();
976:
977: if(method_exists($this, 'after_getHistoryCount_callback'))
978: $this->after_getHistoryCount_callback();
979:
980: self::$logger->debug('<<getHistoryCount ['.$count.']');
981: return $count;
982: }
983:
984: 985: 986: 987: 988: 989: 990: 991:
992: public function getID() {
993: self::$logger->debug('>>getID()');
994: $oid = str_pad($this->OID, 11, '0', STR_PAD_LEFT);
995: self::$logger->debug('<<getID ['.$oid.']');
996: return $oid;
997: }
998:
999: 1000: 1001: 1002: 1003: 1004: 1005:
1006: public final function getOID() {
1007: if(self::$logger == null)
1008: self::$logger = new Logger('AlphaDAO');
1009: self::$logger->debug('>>getOID()');
1010: $oid = str_pad($this->OID, 11, '0', STR_PAD_LEFT);
1011: self::$logger->debug('<<getOID ['.$oid.']');
1012: return $oid;
1013: }
1014:
1015: 1016: 1017: 1018: 1019: 1020:
1021: public function getVersionNumber() {
1022: self::$logger->debug('>>getVersionNumber()');
1023: self::$logger->debug('<<getVersionNumber ['.$this->version_num.']');
1024: return $this->version_num;
1025: }
1026:
1027: 1028: 1029: 1030: 1031: 1032:
1033: protected function setEnumOptions() {
1034: self::$logger->debug('>>setEnumOptions()');
1035:
1036: if(method_exists($this, 'before_setEnumOptions_callback'))
1037: $this->before_setEnumOptions_callback();
1038:
1039: global $config;
1040:
1041: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1042: try {
1043: $provider->setEnumOptions();
1044: }catch (NotImplementedException $e) {
1045: self::$logger->info($e->getMessage());
1046: }
1047:
1048: self::$logger->debug('<<setEnumOptions');
1049: }
1050:
1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062:
1063: public function get($prop, $noChildMethods = false) {
1064: if(self::$logger == null)
1065: self::$logger = new Logger('AlphaDAO');
1066:
1067: self::$logger->debug('>>get(prop=['.$prop.'], noChildMethods=['.$noChildMethods.'])');
1068:
1069: if(method_exists($this, 'before_get_callback'))
1070: $this->before_get_callback();
1071:
1072: if(empty($prop))
1073: throw new IllegalArguementException('Cannot call get with empty $prop arguement!');
1074:
1075:
1076: if(!$noChildMethods && method_exists($this, 'get'.ucfirst($prop))) {
1077: if(method_exists($this, 'after_get_callback'))
1078: $this->after_get_callback();
1079:
1080: self::$logger->debug('<<get ['.eval('return print_r($this->get'.ucfirst($prop).'(), true);').'])');
1081: return eval('return $this->get'.ucfirst($prop).'();');
1082: }else{
1083:
1084: if(isset($this->$prop) && is_object($this->$prop) && method_exists($this->$prop, 'getValue')) {
1085: if(method_exists($this, 'after_get_callback'))
1086: $this->after_get_callback();
1087:
1088:
1089: self::$logger->debug('<<get ['.$this->$prop->getValue().'])');
1090: return $this->$prop->getValue();
1091: }elseif(isset($this->$prop)) {
1092: if(method_exists($this, 'after_get_callback'))
1093: $this->after_get_callback();
1094:
1095:
1096: self::$logger->debug('<<get ['.print_r($this->$prop, true).'])');
1097: return $this->$prop;
1098: }else{
1099: throw new AlphaException('Could not access the property ['.$prop.'] on the object of class ['.get_class($this).']');
1100: self::$logger->debug('<<get [false])');
1101: return false;
1102: }
1103: }
1104: }
1105:
1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117:
1118: public function set($prop, $value, $noChildMethods = false) {
1119: self::$logger->debug('>>set(prop=['.$prop.'], $value=['.print_r($value, true).'], noChildMethods=['.$noChildMethods.'])');
1120:
1121: if(method_exists($this, 'before_set_callback'))
1122: $this->before_set_callback();
1123:
1124:
1125: if(!$noChildMethods && method_exists($this, 'set'.ucfirst($prop))) {
1126: if(method_exists($this, 'after_set_callback'))
1127: $this->after_set_callback();
1128:
1129: eval('$this->set'.ucfirst($prop).'($value);');
1130: }else{
1131:
1132: if(isset($this->$prop)) {
1133: if(method_exists($this, 'after_set_callback'))
1134: $this->after_set_callback();
1135:
1136:
1137: if (is_object($this->$prop) && get_class($this->$prop) != false) {
1138: if (strtoupper(get_class($this->$prop)) != 'DATE' && strtoupper(get_class($this->$prop)) != 'TIMESTAMP') {
1139: $this->$prop->setValue($value);
1140: }else{
1141:
1142: $this->$prop->populateFromString($value);
1143: }
1144: }else{
1145:
1146: $this->$prop = $value;
1147: }
1148: }else{
1149: throw new AlphaException('Could not set the property ['.$prop.'] on the object of the class ['.get_class($this).']. Property may not exist, or else does not have a setValue() method and is private or protected.');
1150: }
1151: }
1152: self::$logger->debug('<<set');
1153: }
1154:
1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163:
1164: public function getPropObject($prop) {
1165: self::$logger->debug('>>getPropObject(prop=['.$prop.'])');
1166:
1167: if(method_exists($this, 'before_getPropObject_callback'))
1168: $this->before_getPropObject_callback();
1169:
1170:
1171: $reflection = new ReflectionClass(get_class($this));
1172: $properties = $reflection->getProperties();
1173:
1174:
1175: $attribute = new ReflectionProperty(get_class($this), $prop);
1176:
1177: if($attribute->isPrivate()) {
1178: if(method_exists($this, 'after_getPropObject_callback'))
1179: $this->after_getPropObject_callback();
1180:
1181: self::$logger->debug('<<getPropObject [false]');
1182: return false;
1183: }
1184:
1185: foreach($properties as $propObj) {
1186: $propName = $propObj->name;
1187:
1188: if($prop == $propName) {
1189: if(method_exists($this, 'after_getPropObject_callback'))
1190: $this->after_getPropObject_callback();
1191:
1192: self::$logger->debug('<<getPropObject ['.var_export($this->$prop, true).']');
1193: return $this->$prop;
1194: }
1195: }
1196: throw new IllegalArguementException('Could not access the property object ['.$prop.'] on the object of class ['.get_class($this).']');
1197: self::$logger->debug('<<getPropObject [false]');
1198: return false;
1199: }
1200:
1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208:
1209: public function checkTableExists($checkHistoryTable = false) {
1210: self::$logger->debug('>>checkTableExists()');
1211:
1212: if(method_exists($this, 'before_checkTableExists_callback'))
1213: $this->before_checkTableExists_callback();
1214:
1215: global $config;
1216:
1217: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1218: $tableExists = $provider->checkTableExists($checkHistoryTable);
1219:
1220: if(method_exists($this, 'after_checkTableExists_callback'))
1221: $this->after_checkTableExists_callback();
1222:
1223: self::$logger->debug('<<checkTableExists ['.$tableExists.']');
1224: return $tableExists;
1225: }
1226:
1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236:
1237: public static function checkBOTableExists($BOClassName, $checkHistoryTable = false) {
1238: if(self::$logger == null)
1239: self::$logger = new Logger('AlphaDAO');
1240: self::$logger->debug('>>checkBOTableExists(BOClassName=['.$BOClassName.'])');
1241:
1242: global $config;
1243:
1244: require_once $config->get('app.root').'alpha/model/'.$config->get('db.provider.name').'.inc';
1245: eval('$tableExists = '.$config->get('db.provider.name').'::checkBOTableExists($BOClassName, $checkHistoryTable);');
1246:
1247: self::$logger->debug('<<checkBOTableExists ['.($tableExists ? 'true' : 'false').']');
1248: return $tableExists;
1249: }
1250:
1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258:
1259: public function checkTableNeedsUpdate() {
1260: self::$logger->debug('>>checkTableNeedsUpdate()');
1261:
1262: global $config;
1263:
1264: if(method_exists($this, 'before_checkTableNeedsUpdate_callback'))
1265: $this->before_checkTableNeedsUpdate_callback();
1266:
1267: $tableExists = $this->checkTableExists();
1268:
1269: if (!$tableExists) {
1270: self::$logger->debug('<<checkTableNeedsUpdate [true]');
1271: return true;
1272: }else{
1273:
1274: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1275: $updateRequired = $provider->checkTableNeedsUpdate();
1276:
1277: if(method_exists($this, 'after_checkTableNeedsUpdate_callback'))
1278: $this->after_checkTableNeedsUpdate_callback();
1279:
1280: self::$logger->debug('<<checkTableNeedsUpdate ['.$updateRequired.']');
1281: return $updateRequired;
1282: }
1283: }
1284:
1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292:
1293: public function findMissingFields() {
1294: self::$logger->debug('>>findMissingFields()');
1295:
1296: global $config;
1297:
1298: if(method_exists($this, 'before_findMissingFields_callback'))
1299: $this->before_findMissingFields_callback();
1300:
1301: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1302: $missingFields = $provider->findMissingFields();
1303:
1304: if(method_exists($this, 'after_findMissingFields_callback'))
1305: $this->after_findMissingFields_callback();
1306:
1307: self::$logger->debug('<<findMissingFields ['.var_export($missingFields, true).']');
1308: return $missingFields;
1309: }
1310:
1311: 1312: 1313: 1314: 1315: 1316: 1317:
1318: public function getTableName() {
1319: self::$logger->debug('>>getTableName()');
1320:
1321: eval('$TABLE_NAME = '.get_class($this).'::TABLE_NAME;');
1322:
1323: if(!empty($TABLE_NAME)) {
1324: self::$logger->debug('<<getTableName ['.$TABLE_NAME.']');
1325: return $TABLE_NAME;
1326: }else{
1327: throw new AlphaException('Error: no TABLE_NAME constant set for the class '.get_class($this));
1328: self::$logger->debug('<<getTableName []');
1329: return '';
1330: }
1331: }
1332:
1333: 1334: 1335: 1336: 1337: 1338:
1339: public function getCreatorId() {
1340: self::$logger->debug('>>getCreatorId()');
1341: self::$logger->debug('<<getCreatorId ['.$this->created_by.']');
1342: return $this->created_by;
1343: }
1344:
1345: 1346: 1347: 1348: 1349: 1350:
1351: public function getUpdatorId() {
1352: self::$logger->debug('>>getUpdatorId()');
1353: self::$logger->debug('<<getUpdatorId ['.$this->updated_by.']');
1354: return $this->updated_by;
1355: }
1356:
1357: 1358: 1359: 1360: 1361: 1362:
1363: public function getCreateTS() {
1364: self::$logger->debug('>>getCreateTS()');
1365: self::$logger->debug('<<getCreateTS ['.$this->created_ts.']');
1366: return $this->created_ts;
1367: }
1368:
1369: 1370: 1371: 1372: 1373: 1374:
1375: public function getUpdateTS() {
1376: self::$logger->debug('>>getUpdateTS()');
1377: self::$logger->debug('<<getUpdateTS ['.$this->updated_ts.']');
1378: return $this->updated_ts;
1379: }
1380:
1381: 1382: 1383: 1384: 1385: 1386:
1387: public function markTransient($attributeName) {
1388: self::$logger->debug('>>markTransient(attributeName=['.$attributeName.'])');
1389: self::$logger->debug('<<markTransient');
1390: array_push($this->transientAttributes, $attributeName);
1391: }
1392:
1393: 1394: 1395: 1396: 1397: 1398: 1399:
1400: public function markPersistent($attributeName) {
1401: self::$logger->debug('>>markPersistent(attributeName=['.$attributeName.'])');
1402: self::$logger->debug('<<markPersistent');
1403: $this->transientAttributes = array_diff($this->transientAttributes, array($attributeName));
1404: }
1405:
1406: 1407: 1408: 1409: 1410: 1411: 1412: 1413:
1414: protected function markUnique($attribute1Name, $attribute2Name='', $attribute3Name='') {
1415: self::$logger->debug('>>markUnique(attribute1Name=['.$attribute1Name.'], attribute2Name=['.$attribute2Name.'], attribute3Name=['.$attribute3Name.'])');
1416:
1417: if(empty($attribute2Name)) {
1418: array_push($this->uniqueAttributes, $attribute1Name);
1419: }else{
1420:
1421: if($attribute3Name == '')
1422: $attributes = $attribute1Name.'+'.$attribute2Name;
1423: else
1424: $attributes = $attribute1Name.'+'.$attribute2Name.'+'.$attribute3Name;
1425:
1426: array_push($this->uniqueAttributes, $attributes);
1427: }
1428:
1429: self::$logger->debug('<<markUnique');
1430: }
1431:
1432: 1433: 1434: 1435: 1436: 1437:
1438: public function getUniqueAttributes() {
1439: self::$logger->debug('>>getUniqueAttributes()');
1440: self::$logger->debug('<<getUniqueAttributes: ['.print_r($this->uniqueAttributes, true).']');
1441: return $this->uniqueAttributes;
1442: }
1443:
1444: 1445: 1446: 1447: 1448: 1449: 1450:
1451: public function getIndexes() {
1452: self::$logger->debug('>>getIndexes()');
1453:
1454: global $config;
1455:
1456: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1457: $indexNames = $provider->getIndexes();
1458:
1459: self::$logger->debug('<<getIndexes ['.print_r($indexNames, true).']');
1460: return $indexNames;
1461: }
1462:
1463: 1464: 1465: 1466: 1467: 1468: 1469: 1470: 1471: 1472:
1473: public function createForeignIndex($attributeName, $relatedClass, $relatedClassAttribute) {
1474: self::$logger->debug('>>createForeignIndex(attributeName=['.$attributeName.'], relatedClass=['.$relatedClass.'], relatedClassAttribute=['.$relatedClassAttribute.']');
1475:
1476: global $config;
1477:
1478: if(method_exists($this, 'before_createForeignIndex_callback'))
1479: $this->before_createForeignIndex_callback();
1480:
1481: AlphaDAO::loadClassDef($relatedClass);
1482: $relatedBO = new $relatedClass;
1483: $tableName = $relatedBO->getTableName();
1484:
1485:
1486: if($this->getTableName() == $tableName) {
1487: self::$logger->debug('<<createForeignIndex');
1488: return;
1489: }
1490:
1491: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1492: $provider->createForeignIndex($attributeName, $relatedClass, $relatedClassAttribute);
1493:
1494: if(method_exists($this, 'after_createForeignIndex_callback'))
1495: $this->after_createForeignIndex_callback();
1496:
1497: self::$logger->debug('<<createForeignIndex');
1498: }
1499:
1500: 1501: 1502: 1503: 1504: 1505: 1506: 1507: 1508:
1509: public function createUniqueIndex($attribute1Name, $attribute2Name = '', $attribute3Name = '') {
1510: self::$logger->debug('>>createUniqueIndex(attribute1Name=['.$attribute1Name.'], attribute2Name=['.$attribute2Name.'], attribute3Name=['.$attribute3Name.'])');
1511:
1512: if(method_exists($this, 'before_createUniqueIndex_callback'))
1513: $this->before_createUniqueIndex_callback();
1514:
1515: global $config;
1516:
1517: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1518: $provider->createUniqueIndex($attribute1Name, $attribute2Name, $attribute3Name);
1519:
1520: if(method_exists($this, 'after_createUniqueIndex_callback'))
1521: $this->before_createUniqueIndex_callback();
1522:
1523: self::$logger->debug('<<createUniqueIndex');
1524: }
1525:
1526: 1527: 1528: 1529: 1530: 1531:
1532: public function getDataLabels() {
1533: self::$logger->debug('>>getDataLabels()');
1534: self::$logger->debug('<<getDataLabels() ['.var_export($this->dataLabels, true).'])');
1535: return $this->dataLabels;
1536: }
1537:
1538: 1539: 1540: 1541: 1542: 1543: 1544:
1545: public function setDataLabels($labels) {
1546: self::$logger->debug('>>setDataLabels(labels=['.print_r($labels, true).'])');
1547:
1548: if(is_array($labels))
1549: $this->dataLabels = $labels;
1550: else
1551: throw new IllegalArguementException('The value ['.print_r($labels, true).'] provided to setDataLabels() is not a valid array!');
1552:
1553: self::$logger->debug('<<setDataLabels()');
1554: }
1555:
1556: 1557: 1558: 1559: 1560: 1561: 1562: 1563:
1564: public function getDataLabel($att) {
1565: self::$logger->debug('>>getDataLabel(att=['.$att.'])');
1566:
1567: if(in_array($att, array_keys($this->dataLabels))) {
1568: self::$logger->debug('<<getDataLabel ['.$this->dataLabels[$att].'])');
1569: return $this->dataLabels[$att];
1570: }else{
1571: throw new IllegalArguementException('No data label found on the class ['.get_class($this).'] for the attribute ['.$att.']');
1572: self::$logger->debug('<<getDataLabel [])');
1573: return '';
1574: }
1575: }
1576:
1577: 1578: 1579: 1580: 1581: 1582:
1583: public static function getBOClassNames() {
1584: if(self::$logger == null)
1585: self::$logger = new Logger('AlphaDAO');
1586: self::$logger->debug('>>getBOClassNames()');
1587:
1588: global $config;
1589:
1590: $classNameArray = array();
1591:
1592:
1593: if(file_exists($config->get('app.root').'model')) {
1594:
1595: $handle = opendir($config->get('app.root').'model');
1596:
1597:
1598: while (false !== ($file = readdir($handle))) {
1599: if (preg_match("/Object.inc/", $file)) {
1600: $classname = substr($file, 0, -4);
1601:
1602: array_push($classNameArray, $classname);
1603: }
1604: }
1605: }
1606:
1607:
1608:
1609: $handle = opendir($config->get('app.root').'alpha/model');
1610:
1611:
1612: while (false !== ($file = readdir($handle))) {
1613: if (preg_match("/Object.inc/", $file)) {
1614: $classname = substr($file, 0, -4);
1615:
1616: array_push($classNameArray, $classname);
1617: }
1618: }
1619:
1620: asort($classNameArray);
1621: self::$logger->debug('<<getBOClassNames ['.var_export($classNameArray, true).']');
1622: return $classNameArray;
1623: }
1624:
1625: 1626: 1627: 1628: 1629: 1630:
1631: public function getDefaultAttributes() {
1632: self::$logger->debug('>>getDefaultAttributes()');
1633: self::$logger->debug('<<getDefaultAttributes ['.var_export($this->defaultAttributes, true).']');
1634: return $this->defaultAttributes;
1635: }
1636:
1637: 1638: 1639: 1640: 1641: 1642:
1643: public function getTransientAttributes() {
1644: self::$logger->debug('>>getTransientAttributes()');
1645: self::$logger->debug('<<getTransientAttributes ['.var_export($this->transientAttributes, true).']');
1646: return $this->transientAttributes;
1647: }
1648:
1649: 1650: 1651: 1652: 1653: 1654:
1655: public function getPersistentAttributes() {
1656: self::$logger->debug('>>getPersistentAttributes()');
1657:
1658: $attributes = array();
1659:
1660:
1661: $reflection = new ReflectionClass(get_class($this));
1662: $properties = $reflection->getProperties();
1663:
1664: foreach($properties as $propObj) {
1665: $propName = $propObj->name;
1666:
1667:
1668: if(!in_array($propName, $this->transientAttributes)) {
1669: array_push($attributes, $propName);
1670: }
1671: }
1672:
1673: self::$logger->debug('<<getPersistentAttributes ['.var_export($attributes, true).']');
1674: return $attributes;
1675: }
1676:
1677: 1678: 1679: 1680: 1681: 1682:
1683: public function setOID($OID) {
1684: self::$logger->debug('>>setOID(OID=['.$OID.'])');
1685: self::$logger->debug('<<setOID');
1686: $this->OID = $OID;
1687: }
1688:
1689: 1690: 1691: 1692: 1693: 1694:
1695: public function isTransient() {
1696: self::$logger->debug('>>isTransient()');
1697:
1698: if(empty($this->OID) || !isset($this->OID) || $this->OID == '00000000000') {
1699: self::$logger->debug('<<isTransient [true]');
1700: return true;
1701: }else{
1702: self::$logger->debug('<<isTransient [false]');
1703: return false;
1704: }
1705: }
1706:
1707: 1708: 1709: 1710: 1711: 1712:
1713: public function getLastQuery() {
1714: self::$logger->debug('>>getLastQuery()');
1715: self::$logger->debug('<<getLastQuery ['.$this->lastQuery.']');
1716: return $this->lastQuery;
1717: }
1718:
1719: 1720: 1721: 1722: 1723:
1724: private function clear() {
1725: self::$logger->debug('>>clear()');
1726:
1727:
1728: $reflection = new ReflectionClass(get_class($this));
1729: $properties = $reflection->getProperties();
1730:
1731: foreach($properties as $propObj) {
1732: $propName = $propObj->name;
1733: if(!$propObj->isPrivate())
1734: unset($this->$propName);
1735: }
1736:
1737: self::$logger->debug('<<clear');
1738: }
1739:
1740: 1741: 1742: 1743: 1744: 1745:
1746: public function reload() {
1747: self::$logger->debug('>>reload()');
1748:
1749: if(!$this->isTransient()) {
1750: $this->load($this->getOID());
1751: }else{
1752: throw new AlphaException('Cannot reload transient object from database!');
1753: }
1754: self::$logger->debug('<<reload');
1755: }
1756:
1757: 1758: 1759: 1760: 1761: 1762: 1763:
1764: public static function loadClassDef($classname) {
1765: if(self::$logger == null)
1766: self::$logger = new Logger('AlphaDAO');
1767: self::$logger->debug('>>loadClassDef(classname=['.$classname.'])');
1768:
1769: global $config;
1770:
1771: if(file_exists($config->get('app.root').'model/'.$classname.'.inc'))
1772: require_once $config->get('app.root').'model/'.$classname.'.inc';
1773: elseif(file_exists($config->get('app.root').'alpha/model/'.$classname.'.inc'))
1774: require_once $config->get('app.root').'alpha/model/'.$classname.'.inc';
1775: elseif(file_exists($config->get('app.root').'alpha/model/types/'.$classname.'.inc'))
1776: require_once $config->get('app.root').'alpha/model/types/'.$classname.'.inc';
1777: else
1778: throw new IllegalArguementException('The class ['.$classname.'] is not defined anywhere!');
1779:
1780: self::$logger->debug('<<loadClassDef');
1781: }
1782:
1783: 1784: 1785: 1786: 1787: 1788: 1789:
1790: public static function checkClassDefExists($classname) {
1791: if(self::$logger == null)
1792: self::$logger = new Logger('AlphaDAO');
1793: self::$logger->debug('>>checkClassDefExists(classname=['.$classname.'])');
1794:
1795: global $config;
1796:
1797: $exists = false;
1798:
1799: if(file_exists($config->get('app.root').'model/'.$classname.'.inc'))
1800: $exists = true;
1801: if(file_exists($config->get('app.root').'alpha/model/'.$classname.'.inc'))
1802: $exists = true;
1803: if(file_exists($config->get('app.root').'alpha/model/types/'.$classname.'.inc'))
1804: $exists = true;
1805:
1806: self::$logger->debug('<<checkClassDefExists ['.$exists.']');
1807: return $exists;
1808: }
1809:
1810: 1811: 1812: 1813: 1814: 1815: 1816: 1817:
1818: public function checkRecordExists($OID) {
1819: self::$logger->debug('>>checkRecordExists(OID=['.$OID.'])');
1820:
1821: if(method_exists($this, 'before_checkRecordExists_callback'))
1822: $this->before_checkRecordExists_callback();
1823:
1824: global $config;
1825:
1826: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1827: $recordExists = $provider->checkRecordExists($OID);
1828:
1829: if(method_exists($this, 'after_checkRecordExists_callback'))
1830: $this->after_checkRecordExists_callback();
1831:
1832: self::$logger->debug('<<checkRecordExists ['.$recordExists.']');
1833: return $recordExists;
1834: }
1835:
1836: 1837: 1838: 1839: 1840: 1841: 1842: 1843: 1844:
1845: public function isTableOverloaded() {
1846: self::$logger->debug('>>isTableOverloaded()');
1847:
1848: global $config;
1849:
1850: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $this);
1851: $isOverloaded = $provider->isTableOverloaded();
1852:
1853: self::$logger->debug('<<isTableOverloaded ['.$isOverloaded.']');
1854: return $isOverloaded;
1855: }
1856:
1857: 1858: 1859: 1860: 1861: 1862: 1863:
1864: public static function begin($BO = null) {
1865: if(self::$logger == null)
1866: self::$logger = new Logger('AlphaDAO');
1867: self::$logger->debug('>>begin()');
1868:
1869: global $config;
1870:
1871: if(isset($BO))
1872: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $BO);
1873: else
1874: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), new PersonObject());
1875:
1876: try{
1877: $provider->begin();
1878: }catch (Exception $e) {
1879: throw new AlphaException('Error beginning a new transaction, error is ['.$e->getMessage().']');
1880: }
1881:
1882: self::$logger->debug('<<begin');
1883: }
1884:
1885: 1886: 1887: 1888: 1889: 1890: 1891:
1892: public static function commit($BO = null) {
1893: if(self::$logger == null)
1894: self::$logger = new Logger('AlphaDAO');
1895: self::$logger->debug('>>commit()');
1896:
1897: global $config;
1898:
1899: if(isset($BO))
1900: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $BO);
1901: else
1902: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), new PersonObject());
1903:
1904: try{
1905: $provider->commit();
1906: }catch (Exception $e) {
1907: throw new FailedSaveException('Error commiting a transaction, error is ['.$e->getMessage().']');
1908: }
1909:
1910: self::$logger->debug('<<commit');
1911: }
1912:
1913: 1914: 1915: 1916: 1917: 1918: 1919:
1920: public static function rollback($BO = null) {
1921: if(self::$logger == null)
1922: self::$logger = new Logger('AlphaDAO');
1923: self::$logger->debug('>>rollback()');
1924:
1925: global $config;
1926:
1927: if(isset($BO))
1928: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), $BO);
1929: else
1930: $provider = AlphaDAOProviderFactory::getInstance($config->get('db.provider.name'), new PersonObject());
1931:
1932: try{
1933: $provider->rollback();
1934: }catch (Exception $e) {
1935: throw new FailedSaveException('Error aborting a transaction, error is ['.$e->getMessage().']');
1936: }
1937:
1938: self::$logger->debug('<<rollback');
1939: }
1940:
1941: 1942: 1943: 1944: 1945: 1946:
1947: public static function isInstalled() {
1948: if(self::$logger == null)
1949: self::$logger = new Logger('AlphaDAO');
1950: self::$logger->debug('>>isInstalled()');
1951:
1952: global $config;
1953:
1954: 1955: 1956: 1957: 1958: 1959:
1960: if(AlphaDAO::checkBOTableExists('PersonObject') && AlphaDAO::checkBOTableExists('RightsObject')) {
1961: self::$logger->debug('<<isInstalled [true]');
1962: return true;
1963: }else{
1964: self::$logger->debug('<<isInstalled [false]');
1965: return false;
1966: }
1967: }
1968:
1969: 1970: 1971: 1972: 1973: 1974:
1975: public function isTagged() {
1976: if(isset($this->taggedAttributes) && isset($this->tags) && $this->tags instanceof Relation)
1977: return true;
1978: else
1979: return false;
1980: }
1981:
1982: 1983: 1984: 1985: 1986: 1987:
1988: private function setVersion($versionNumber) {
1989: $this->version_num->setValue($versionNumber);
1990: }
1991:
1992: 1993: 1994: 1995: 1996: 1997: 1998: 1999: 2000: 2001:
2002: public function cast($targetClassName, $originalBO) {
2003: AlphaDAO::loadClassDef($targetClassName);
2004:
2005: $BO = new $targetClassName;
2006: $BO->setOID($originalBO->getOID());
2007: $BO->setVersion($originalBO->getVersion());
2008:
2009:
2010: $originalBOreflection = new ReflectionClass(get_class($originalBO));
2011: $originalBOproperties = $originalBOreflection->getProperties();
2012: $newBOreflection = new ReflectionClass($targetClassName);
2013: $newBOproperties = $newBOreflection->getProperties();
2014:
2015:
2016:
2017: if(count($originalBOproperties) < count($newBOproperties)) {
2018:
2019: foreach($originalBOproperties as $propObj) {
2020: $propName = $propObj->name;
2021: if(!in_array($propName, $this->transientAttributes))
2022: $BO->set($propName, $originalBO->get($propName));
2023: }
2024: }else{
2025:
2026: foreach($newBOproperties as $propObj) {
2027: $propName = $propObj->name;
2028: if(!in_array($propName, $this->transientAttributes))
2029: $BO->set($propName, $originalBO->get($propName));
2030: }
2031: }
2032:
2033: return $BO;
2034: }
2035:
2036: 2037: 2038: 2039: 2040: 2041:
2042: public function getFriendlyClassName() {
2043: $name = substr(get_class($this), 0, -6);
2044:
2045: return $name;
2046: }
2047:
2048: 2049: 2050: 2051: 2052: 2053: 2054:
2055: public function hasAttribute($attribute) {
2056: try{
2057: $exists = $this->$attribute;
2058: return true;
2059: }catch(Exception $e) {
2060: return false;
2061: }
2062: }
2063:
2064: 2065: 2066: 2067: 2068:
2069: public function addToCache() {
2070: self::$logger->debug('>>addToCache()');
2071: global $config;
2072:
2073: try {
2074: $cache = AlphaCacheProviderFactory::getInstance($config->get('cache.provider.name'));
2075: $cache->set(get_class($this).'-'.$this->getOID(), $this, 3600);
2076:
2077: }catch(Exception $e) {
2078: self::$logger->error('Error while attempting to store a business object to the ['.$config->get('cache.provider.name').']
2079: instance: ['.$e->getMessage().']');
2080: }
2081:
2082: self::$logger->debug('<<addToCache');
2083: }
2084:
2085: 2086: 2087: 2088: 2089:
2090: public function removeFromCache() {
2091: self::$logger->debug('>>removeFromCache()');
2092: global $config;
2093:
2094: try {
2095: $cache = AlphaCacheProviderFactory::getInstance($config->get('cache.provider.name'));
2096: $cache->delete(get_class($this).'-'.$this->getOID());
2097: }catch(Exception $e) {
2098: self::$logger->error('Error while attempting to remove a business object from ['.$config->get('cache.provider.name').']
2099: instance: ['.$e->getMessage().']');
2100: }
2101:
2102: self::$logger->debug('<<removeFromCache');
2103: }
2104:
2105: 2106: 2107: 2108: 2109: 2110:
2111: public function loadFromCache() {
2112: self::$logger->debug('>>loadFromCache()');
2113: global $config;
2114:
2115: try {
2116: $cache = AlphaCacheProviderFactory::getInstance($config->get('cache.provider.name'));
2117: $BO = $cache->get(get_class($this).'-'.$this->getOID());
2118:
2119: if(!$BO) {
2120: self::$logger->debug('Cache miss on key ['.get_class($this).'-'.$this->getOID().']');
2121: self::$logger->debug('<<loadFromCache: [false]');
2122: return false;
2123: }else{
2124:
2125: $reflection = new ReflectionClass(get_class($this));
2126: $properties = $reflection->getProperties();
2127:
2128: foreach($properties as $propObj) {
2129: $propName = $propObj->name;
2130:
2131:
2132: if(!in_array($propName, $this->transientAttributes)) {
2133: $this->set($propName, $BO->get($propName));
2134: }elseif(!$propObj->isPrivate() && isset($this->$propName) && $this->$propName instanceof Relation) {
2135: $prop = $this->getPropObject($propName);
2136:
2137:
2138: if($prop->getRelationType() == 'ONE-TO-MANY') {
2139: $this->set($propObj->name, $this->getOID());
2140: }
2141: }
2142: }
2143:
2144: self::$logger->debug('<<loadFromCache: [true]');
2145: return true;
2146: }
2147: }catch(Exception $e) {
2148: self::$logger->error('Error while attempting to load a business object from ['.$config->get('cache.provider.name').']
2149: instance: ['.$e->getMessage().']');
2150:
2151: self::$logger->debug('<<loadFromCache: [false]');
2152: return false;
2153: }
2154: }
2155:
2156: 2157: 2158: 2159: 2160: 2161:
2162: public function setLastQuery($query) {
2163: self::$logger->sql($query);
2164: $this->lastQuery = $query;
2165: }
2166:
2167: 2168: 2169: 2170: 2171: 2172:
2173: public function __wakeup() {
2174: if(self::$logger == null)
2175: self::$logger = new Logger(get_class($this));
2176: }
2177:
2178: 2179: 2180: 2181: 2182: 2183: 2184:
2185: public function setMaintainHistory($maintainHistory) {
2186: if(!is_bool($maintainHistory))
2187: throw new IllegalArguementException('Non-boolean value ['.$maintainHistory.'] passed to setMaintainHistory method!');
2188:
2189: $this->maintainHistory = $maintainHistory;
2190: }
2191:
2192: 2193: 2194: 2195: 2196: 2197:
2198: public function getMaintainHistory() {
2199: return $this->maintainHistory;
2200: }
2201: }
2202:
2203: ?>