Annotation of FreeBSD/tinderbox/webui/core/TinderboxDS.php, revision 1.1.1.1
1.1 as 1: <?php
2: #-
3: # Copyright (c) 2004-2005 FreeBSD GNOME Team <freebsd-gnome@FreeBSD.org>
4: # All rights reserved.
5: #
6: # Redistribution and use in source and binary forms, with or without
7: # modification, are permitted provided that the following conditions
8: # are met:
9: # 1. Redistributions of source code must retain the above copyright
10: # notice, this list of conditions and the following disclaimer.
11: # 2. Redistributions in binary form must reproduce the above copyright
12: # notice, this list of conditions and the following disclaimer in the
13: # documentation and/or other materials provided with the distribution.
14: #
15: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16: # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17: # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18: # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19: # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20: # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21: # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23: # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24: # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25: # SUCH DAMAGE.
26: #
27: # $MCom: portstools/tinderbox/webui/core/TinderboxDS.php,v 1.36 2007/10/13 02:28:47 ade Exp $
28: #
29:
30: require_once 'DB.php';
31: require_once 'Build.php';
32: require_once 'BuildPortsQueue.php';
33: require_once 'Config.php';
34: require_once 'Jail.php';
35: require_once 'Port.php';
36: require_once 'PortsTree.php';
37: require_once 'PortFailReason.php';
38: require_once 'User.php';
39: require_once 'inc_ds.php';
40: require_once 'inc_tinderbox.php';
41:
42: $objectMap = array(
43: "Build" => "builds",
44: "BuildPortsQueue" => "build_ports_queue",
45: "Config" => "config",
46: "Jail" => "jails",
47: "Port" => "ports",
48: "PortsTree" => "ports_trees",
49: "PortFailReason" => "port_fail_reasons",
50: "User" => "users",
51: );
52:
53: class TinderboxDS {
54: var $db;
55: var $error;
56: var $packageSuffixCache; /* in use by getPackageSuffix() */
57:
58: function TinderboxDS() {
59: global $DB_HOST, $DB_DRIVER, $DB_NAME, $DB_USER, $DB_PASS;
60:
61: # XXX: backwards compatibility
62: if ($DB_DRIVER == "")
63: $DB_DRIVER = "mysql";
64:
65: $dsn = "$DB_DRIVER://$DB_USER:$DB_PASS@$DB_HOST/$DB_NAME";
66:
67: $this->db = DB::connect($dsn);
68:
69: if (DB::isError($this->db)) {
70: die ("Tinderbox DS: Unable to initialize datastore: " . $this->db->getMessage() . "\n");
71: }
72:
73: $this->db->setFetchMode(DB_FETCHMODE_ASSOC);
74: $this->db->setOption('persistent', true);
75: }
76:
77: function start_transaction() {
78: $this->db->autoCommit( false );
79: }
80:
81: function commit_transaction() {
82: $this->db->commit();
83: $this->db->autoCommit( true );
84: }
85:
86: function rollback_transaction() {
87: $this->db->rollback();
88: $this->db->autoCommit( true );
89: }
90:
91: function getAllMaintainers() {
92: $query = "SELECT DISTINCT LOWER(port_maintainer) AS port_maintainer FROM ports where port_maintainer IS NOT NULL ORDER BY LOWER(port_maintainer)";
93: $rc = $this->_doQueryHashRef($query, $results, array());
94:
95: if (!$rc) {
96: return array();
97: }
98:
99: foreach($results as $result)
100: $data[]=$result['port_maintainer'];
101:
102: return $data;
103: }
104:
105: function getAllPortsByPortID($portid) {
106: $query = "SELECT p.*,
107: bp.build_id,
108: bp.last_built,
109: bp.last_status,
110: bp.last_successful_built,
111: bp.last_failed_dependency,
112: bp.last_run_duration,
113: bp.last_built_version,
114: CASE bp.last_fail_reason
115: WHEN '__nofail__' THEN ''
116: ELSE bp.last_fail_reason
117: END
118: AS last_fail_reason
119: FROM ports p,
120: build_ports bp
121: WHERE p.port_id = bp.port_id
122: AND bp.port_id=$portid";
123:
124: $rc = $this->_doQueryHashRef($query, $results, array());
125:
126: if (!$rc) {
127: return null;
128: }
129:
130: $ports = $this->_newFromArray("Port", $results);
131:
132: return $ports;
133: }
134:
135:
136: function addUser($user) {
137: $query = "INSERT INTO users
138: (user_name,user_email,user_password,user_www_enabled)
139: VALUES
140: (?,?,?,?)";
141:
142: $rc = $this->_doQuery($query, array($user->getName(),$user->getEmail(),$user->getPassword(),$user->getWwwEnabled()),$res);
143:
144: if (!$rc) {
145: return false;
146: }
147:
148: return true;
149: }
150:
151: function deleteUser($user) {
152: if( !$user->getId() || $this->deleteUserPermissions($user,'') ) {
153: if ($user->getId()) {
154: $this->deleteBuildPortsQueueByUserId($user);
155: }
156: $query = "DELETE FROM users
157: WHERE user_name=?";
158:
159: $rc = $this->_doQuery($query, array($user->getName()),$res);
160:
161: if (!$rc) {
162: return false;
163: }
164:
165: return true;
166: }
167: return false;
168: }
169:
170: function updateUser($user) {
171: $query = "UPDATE users
172: SET user_name=?,user_email=?,user_password=?,user_www_enabled=?
173: WHERE user_id=?";
174:
175: $rc = $this->_doQuery($query, array($user->getName(),$user->getEmail(),$user->getPassword(),$user->getWwwEnabled(),$user->getId()),$res);
176:
177: if (!$rc) {
178: return false;
179: }
180:
181: return true;
182: }
183:
184: function getUserByLogin($username,$password) {
185: $hashPass = md5($password);
186: $query = "SELECT user_id,user_name,user_email,user_password,user_www_enabled FROM users WHERE user_name=? AND user_password=?";
187: $rc = $this->_doQueryHashRef($query, $results, array($username,$hashPass));
188:
189: if (!$rc) {
190: return null;
191: }
192:
193: $user = $this->_newFromArray("User", $results);
194:
195: return $user[0];
196: }
197:
198: function getUserPermissions($user_id,$object_type,$object_id) {
199:
200: $query = "
201: SELECT
202: CASE user_permission
203: WHEN 1 THEN 'IS_WWW_ADMIN'
204: WHEN 2 THEN 'PERM_ADD_QUEUE'
205: WHEN 3 THEN 'PERM_MODIFY_OWN_QUEUE'
206: WHEN 4 THEN 'PERM_DELETE_OWN_QUEUE'
207: WHEN 5 THEN 'PERM_PRIO_LOWER_5'
208: WHEN 6 THEN 'PERM_MODIFY_OTHER_QUEUE'
209: WHEN 7 THEN 'PERM_DELETE_OTHER_QUEUE'
210: ELSE 'PERM_UNKNOWN'
211: END
212: AS user_permission
213: FROM user_permissions
214: WHERE user_id=?
215: AND user_permission_object_type=?
216: AND user_permission_object_id=?";
217:
218: $rc = $this->_doQueryHashRef($query, $results, array($user_id,$object_type,$object_id));
219:
220: if (!$rc) {
221: return null;
222: }
223:
224: return $results;
225: }
226:
227: function deleteUserPermissions($user, $object_type) {
228:
229: $query = "
230: DELETE FROM user_permissions
231: WHERE user_id=?";
232:
233: if( $object_type )
234: $query .= " AND user_permission_object_type='$object_type'";
235:
236: $rc = $this->_doQuery($query, array($user->getId()), $res);
237:
238: if (!$rc) {
239: return false;
240: }
241:
242: return true;
243: }
244:
245: function addUserPermission($user_id,$object_type,$object_id,$permission) {
246:
247: switch( $permission ) {
248: // case 'IS_WWW_ADMIN': $permission = 1; break; /* only configureable via shell */
249: case 'PERM_ADD_QUEUE': $permission = 2; break;
250: case 'PERM_MODIFY_OWN_QUEUE': $permission = 3; break;
251: case 'PERM_DELETE_OWN_QUEUE': $permission = 4; break;
252: case 'PERM_PRIO_LOWER_5': $permission = 5; break;
253: case 'PERM_MODIFY_OTHER_QUEUE': $permission = 6; break;
254: case 'PERM_DELETE_OTHER_QUEUE': $permission = 7; break;
255: default: return false;
256: }
257:
258: $query = "
259: INSERT INTO user_permissions
260: (user_id,user_permission_object_type,user_permission_object_id,user_permission)
261: VALUES
262: (?,?,?,?)";
263:
264: $rc = $this->_doQuery($query, array($user_id,$object_type,$object_id,$permission), $res);
265:
266: if (!$rc) {
267: return false;
268: }
269:
270: return true;
271: }
272:
273: function getBuildPortsQueueEntries($build_id) {
274: $query = "SELECT build_ports_queue.*, builds.build_name AS build_name, users.user_name AS user_name
275: FROM build_ports_queue, builds, users
276: WHERE build_ports_queue.build_id=?
277: AND builds.build_id = build_ports_queue.build_id
278: AND users.user_id = build_ports_queue.user_id
279: ORDER BY priority ASC, build_ports_queue_id ASC";
280: $rc = $this->_doQueryHashRef($query, $results, array($build_id));
281:
282: if (!$rc) {
283: return null;
284: }
285:
286: $build_ports_queue_entries = $this->_newFromArray("BuildPortsQueue", $results);
287:
288: return $build_ports_queue_entries;
289: }
290:
291: function deleteBuildPortsQueueEntry($entry_id) {
292: $query = "DELETE FROM build_ports_queue
293: WHERE build_ports_queue_id=?";
294:
295: $rc = $this->_doQuery($query, $entry_id, $res);
296:
297: if (!$rc) {
298: return false;
299: }
300:
301: return true;
302: }
303:
304: function deleteBuildPortsQueueByUserId($user) {
305: $query = "DELETE FROM build_ports_queue
306: WHERE user_id=?";
307:
308: $rc = $this->_doQuery($query, $user->getId(), $res);
309:
310: if (!$rc) {
311: return false;
312: }
313:
314: return true;
315: }
316:
317: function createBuildPortsQueueEntry($build_id,$priority,$port_directory,$user_id,$email_on_completion) {
318: switch( $email_on_completion ) {
319: case '1': $email_on_completion = 1; break;
320: default: $email_on_completion = 0; break;
321: }
322:
323: $entries[] = array('build_id' => $build_id,
324: 'priority' => $priority,
325: 'port_directory' => $port_directory,
326: 'user_id' => $user_id,
327: 'enqueue_date' => date("Y-m-d H:i:s", time()),
328: 'email_on_completion' => $email_on_completion,
329: 'status' => 'ENQUEUED');
330:
331: $results = $this->_newFromArray("BuildPortsQueue",$entries);
332:
333: return $results[0];
334: }
335:
336: function updateBuildPortsQueueEntry($entry) {
337:
338: $query = "UPDATE build_ports_queue
339: SET build_id=?, priority=?, email_on_completion=?, status=?
340: WHERE build_ports_queue_id=?";
341:
342: $rc = $this->_doQuery($query, array($entry->getBuildId(),$entry->getPriority(),$entry->getEmailOnCompletion(),$entry->getStatus(),$entry->getId()), $res);
343:
344: if (!$rc) {
345: return false;
346: }
347:
348: return true;
349: }
350:
351: function addBuildPortsQueueEntry($entry) {
352: $query = "INSERT INTO build_ports_queue
353: (enqueue_date,build_id,priority,port_directory,user_id,email_on_completion,status)
354: VALUES
355: (?,?,?,?,?,?,?)";
356:
357: $rc = $this->_doQuery($query, array($entry->getEnqueueDate(),$entry->getBuildId(),$entry->getPriority(),$entry->getPortDirectory(),$entry->getUserId(),$entry->getEmailOnCompletion(),$entry->getStatus()), $res);
358:
359: if (!$rc) {
360: return false;
361: }
362:
363: return true;
364: }
365:
366: function getBuildPortsQueueEntryById($id) {
367: $results = $this->getBuildPortsQueue(array( 'build_ports_queue_id' => $id ));
368:
369: if (is_null($results)) {
370: return null;
371: }
372:
373: return $results[0];
374: }
375:
376: function getPortsForBuild($build, $sortby = 'port_directory') {
377: $sortbytable = "bp";
378: if ($sortby == "") $sortby = "port_directory";
379: if ($sortby == "port_directory") $sortbytable = "p";
380: if ($sortby == "port_maintainer") $sortbytable = "p";
381: $query = "SELECT p.*,
382: bp.last_built,
383: bp.last_status,
384: bp.last_successful_built,
385: bp.last_built_version,
386: bp.last_failed_dependency,
387: bp.last_run_duration,
388: CASE bp.last_fail_reason
389: WHEN '__nofail__' THEN ''
390: ELSE bp.last_fail_reason
391: END
392: AS last_fail_reason
393: FROM ports p,
394: build_ports bp
395: WHERE p.port_id = bp.port_id
396: AND bp.build_id=?
397: ORDER BY $sortbytable.$sortby";
398:
399: $rc = $this->_doQueryHashRef($query, $results, $build->getId());
400:
401: if (!$rc) {
402: return null;
403: }
404:
405: $ports = $this->_newFromArray("Port", $results);
406:
407: return $ports;
408: }
409:
410: function getLatestPorts($build_id,$limit="") {
411: $query = "SELECT p.*,
412: bp.build_id,
413: bp.last_built,
414: bp.last_status,
415: bp.last_successful_built,
416: bp.last_built_version,
417: bp.last_failed_dependency,
418: bp.last_run_duration,
419: CASE bp.last_fail_reason
420: WHEN '__nofail__' THEN ''
421: ELSE bp.last_fail_reason
422: END
423: AS last_fail_reason
424: FROM ports p,
425: build_ports bp
426: WHERE p.port_id = bp.port_id
427: AND bp.last_built IS NOT NULL ";
428: if($build_id)
429: $query .= "AND bp.build_id=$build_id ";
430: $query .= " ORDER BY bp.last_built DESC ";
431: if($limit)
432: $query .= " LIMIT $limit";
433:
434: $rc = $this->_doQueryHashRef($query, $results, array());
435:
436: if (!$rc) {
437: return null;
438: }
439:
440: $ports = $this->_newFromArray("Port", $results);
441:
442: return $ports;
443: }
444:
445: function getBuildPorts($port_id,$build_id) {
446: $query = "SELECT p.*,
447: bp.last_built,
448: bp.last_status,
449: bp.last_successful_built,
450: bp.last_failed_dependency,
451: bp.last_run_duration,
452: CASE bp.last_fail_reason
453: WHEN '__nofail__' THEN ''
454: ELSE bp.last_fail_reason
455: END
456: AS last_fail_reason
457: FROM ports p,
458: build_ports bp
459: WHERE p.port_id = bp.port_id
460: AND bp.build_id=?
461: AND bp.port_id=?";
462:
463: $rc = $this->_doQueryHashRef($query, $results, array($build_id, $port_id));
464: if (!$rc) return null;
465:
466: $ports = $this->_newFromArray("Port", $results);
467:
468: return $ports[0];
469: }
470:
471:
472: function getPortsByStatus($build_id,$maintainer,$status,$notstatus) {
473: $query = "SELECT p.*,
474: bp.build_id,
475: bp.last_built,
476: bp.last_status,
477: bp.last_successful_built,
478: bp.last_built_version,
479: bp.last_failed_dependency,
480: bp.last_run_duration,
481: CASE bp.last_fail_reason
482: WHEN '__nofail__' THEN ''
483: ELSE bp.last_fail_reason
484: END
485: AS last_fail_reason
486: FROM ports p,
487: build_ports bp
488: WHERE p.port_id = bp.port_id ";
489:
490: if($build_id)
491: $query .= "AND bp.build_id=$build_id ";
492: if($status<>'')
493: $query .= "AND bp.last_status='$status' ";
494: if($notstatus<>'')
495: $query .= "AND bp.last_status<>'$notstatus' AND bp.last_status<>'UNKNOWN'";
496: if($maintainer)
497: $query .= "AND p.port_maintainer='$maintainer'";
498: $query .= " ORDER BY bp.last_built DESC ";
499:
500: $rc = $this->_doQueryHashRef($query, $results, array());
501:
502: if (!$rc) {
503: return null;
504: }
505:
506: $ports = $this->_newFromArray("Port", $results);
507:
508: return $ports;
509: }
510:
511: function getBuildStatsWithStatus($build_id) {
512: $query = 'SELECT last_status,COUNT(*) AS c FROM build_ports WHERE build_id = ? GROUP BY last_status';
513: $rc = $this->_doQueryHashRef($query, $results, $build_id);
514: if (!$rc) return null;
515: return $results;
516: }
517:
518:
519: function getBuildStats($build_id) {
520: $query = 'SELECT COUNT(*) AS fails FROM build_ports WHERE last_status = \'FAIL\' AND build_id = ?';
521: $rc = $this->_doQueryHashRef($query, $results, $build_id);
522: if (!$rc) return null;
523: return $results[0];
524: }
525:
526: function getPortById($id) {
527: $results = $this->getPorts(array( 'port_id' => $id ));
528:
529: if (is_null($results)) {
530: return null;
531: }
532:
533: return $results[0];
534: }
535:
536: function getPortByDirectory($dir) {
537: $results = $this->getPorts(array( 'port_directory' => $dir ));
538:
539: if (is_null($results)) {
540: return null;
541: }
542:
543: return $results[0];
544: }
545:
546: function getCurrentPortForBuild($build_id) {
547: $query = 'SELECT port_id AS id FROM build_ports WHERE build_id = ? AND currently_building = \'1\'';
548: $rc = $this->_doQueryHashRef($query, $results, array($build_id));
549: if (!$rc) return null;
550: $port = $this->getPortById($results[0]['id']);
551:
552: return $port;
553: }
554:
555: function getObjects($type, $params = array()) {
556: global $objectMap;
557:
558: if (!isset($objectMap[$type])) {
559: die("Unknown object type, $type\n");
560: }
561:
562: $table = $objectMap[$type];
563: $condition = "";
564:
565: $values = array();
566: $conds = array();
567: foreach ($params as $field => $param) {
568: # Each parameter makes up and OR portion of a query. Within
569: # each parameter can be a hash reference that make up the AND
570: # portion of the query.
571: if (is_array($param)) {
572: $ands = array();
573: foreach ($param as $andcond => $value) {
574: array_push($ands, "$andcond=?");
575: array_push($values, $value);
576: }
577: array_push($conds, "(" . (implode(" AND ", $ands)) . ")");
578: } else {
579: array_push($conds, "(" . $field . "=?)");
580: array_push($values, $param);
581: }
582: }
583:
584: $condition = implode(" OR ", $conds);
585:
586: if ($condition != "") {
587: $query = "SELECT * FROM $table WHERE $condition";
588: }
589: else {
590: $query = "SELECT * FROM $table";
591: }
592:
593: $results = array();
594: $rc = $this->_doQueryHashRef($query, $results, $values);
595:
596: if (!$rc) {
597: return null;
598: }
599:
600: return $this->_newFromArray($type, $results);
601: }
602:
603: function getBuildByName($name) {
604: $results = $this->getBuilds(array( 'build_name' => $name ));
605:
606: if (is_null($results)) {
607: return null;
608: }
609:
610: return $results[0];
611: }
612:
613: function getBuildById($id) {
614: $results = $this->getBuilds(array( 'build_id' => $id ));
615:
616: if (is_null($results)) {
617: return null;
618: }
619:
620: return $results[0];
621: }
622:
623: function getJailById($id) {
624: $results = $this->getJails(array( 'jail_id' => $id ));
625:
626: if (is_null($results)) {
627: return null;
628: }
629:
630: return $results[0];
631: }
632:
633: function getPortsTreeForBuild($build) {
634: $portstree = $this->getPortsTreeById($build->getPortsTreeId());
635:
636: return $portstree;
637: }
638:
639: function getPortsTreeByName($name) {
640: $results = $this->getPortsTrees(array( 'ports_tree_name' => $name ));
641: if (is_null($results)) {
642: return null;
643: }
644:
645: return $results[0];
646: }
647:
648: function getPortsTreeById($id) {
649: $results = $this->getPortsTrees(array( 'ports_tree_id' => $id ));
650:
651: if (is_null($results)) {
652: return null;
653: }
654:
655: return $results[0];
656: }
657:
658: function getUserById($id) {
659: $results = $this->getUsers(array( 'user_id' => $id ));
660:
661: if (is_null($results)) {
662: return null;
663: }
664:
665: return $results[0];
666: }
667:
668: function getUserByName($name) {
669: $results = $this->getUsers(array( 'user_name' => $name ));
670:
671: if (is_null($results)) {
672: return null;
673: }
674:
675: return $results[0];
676: }
677:
678: function getConfig($params = array()) {
679: return $this->getObjects("Config", $params);
680: }
681:
682: function getBuildPortsQueue($params = array()) {
683: return $this->getObjects("BuildPortsQueue", $params);
684: }
685:
686: function getBuilds($params = array()) {
687: return $this->getObjects("Build", $params);
688: }
689:
690: function getPorts($params = array()) {
691: return $this->getObjects("Port", $params);
692: }
693:
694: function getJails($params = array()) {
695: return $this->getObjects("Jail", $params);
696: }
697:
698: function getPortFailReasons($params = array()) {
699: return $this->getObjects("PortFailReason", $params);
700: }
701:
702: function getPortsTrees($params = array()) {
703: return $this->getObjects("PortsTree", $params);
704: }
705:
706: function getUsers($params = array()) {
707: return $this->getObjects("User", $params);
708: }
709:
710: function getAllConfig() {
711: $config = $this->getConfig();
712:
713: return $config;
714: }
715:
716: function getAllBuilds() {
717: $builds = $this->getBuilds();
718:
719: return $builds;
720: }
721:
722: function getAllJails() {
723: $jails = $this->getJails();
724:
725: return $jails;
726: }
727:
728: function getAllPortFailReasons() {
729: $results = $this->getPortFailReasons();
730:
731: return $results;
732: }
733:
734: function getAllPortsTrees() {
735: $ports_trees = $this->getPortsTrees();
736:
737: return $ports_trees;
738: }
739:
740: function getAllUsers() {
741: $users = $this->getUsers();
742:
743: return $users;
744: }
745:
746: function addError($error) {
747: return $this->error[] = $error;
748: }
749:
750: function getErrors() {
751: return $this->error;
752: }
753:
754: function _doQueryNumRows($query, $params = array()) {
755: $rows = 0;
756: $rc = $this->_doQuery($query, $params, $res);
757:
758: if (!$rc) {
759: return -1;
760: }
761:
762: if ($res->numRows() > -1) {
763: $rows = $res->numRows();
764: }
765: else {
766: while($res->fetchRow()) {
767: $rows++;
768: }
769: }
770:
771: $res->free();
772:
773: return $rows;
774: }
775:
776: function _doQueryHashRef($query, &$results, $params = array()) {
777: $rc = $this->_doQuery($query, $params, $res);
778:
779: if (!$rc) {
780: $results = null;
781: return 0;
782: }
783:
784: $results = array();
785: while ($row = $res->fetchRow()) {
786: array_push($results, $row);
787: }
788:
789: $res->free();
790:
791: return 1;
792: }
793:
794: function _doQuery($query, $params, &$res) {
795: $sth = $this->db->prepare($query);
796:
797: if (DB::isError($this->db)) {
798: $this->addError($this->db->getMessage());
799: return 0;
800: }
801:
802: if (count($params)) {
803: $_res = $this->db->execute($sth, $params);
804: }
805: else {
806: $_res = $this->db->execute($sth);
807: }
808:
809: if (DB::isError($_res)) {
810: $this->addError($_res->getMessage());
811: return 0;
812: }
813:
814: if (!is_null($_res)) {
815: $res = $_res;
816: }
817: else {
818: $res->free();
819: }
820:
821: return 1;
822: }
823:
824: function _newFromArray($type, $arr) {
825: $objects = array();
826:
827: foreach ($arr as $item) {
828: eval('$obj = new $type($item);');
829: if (!is_a($obj, $type)) {
830: return null;
831: }
832: array_push($objects, $obj);
833: }
834:
835: return $objects;
836: }
837:
838: function destroy() {
839: $this->db->disconnect();
840: $this->error = null;
841: }
842:
843: function getPackageSuffix($jail_id) {
844: if (empty($jail_id)) return "";
845: /* Use caching to avoid a lot of SQL queries */
846: if ( isset($this->packageSuffixCache[$jail_id])) {
847: return $this->packageSuffixCache[$jail_id];
848: } else {
849: $jail = $this->getJailById($jail_id);
850: if (substr($jail->getName(), 0, 1) <= "4") {
851: $this->packageSuffixCache[$jail_id] = ".tgz";
852: return ".tgz";
853: } else {
854: $this->packageSuffixCache[$jail_id] = ".tbz";
855: return ".tbz";
856: }
857:
858: }
859: }
860: }
861: ?>