0011984: printing events with tags is broken for daysview
[tine20] / tine20 / Tinebase / Lock.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @copyright   Copyright (c) 2015-2015 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Paul Mehrer <p.mehrer@metaways.de>
9  */
10
11 /**
12  * Locking utility class
13  *
14  * @package     Tinebase
15  */
16 class Tinebase_Lock
17 {
18     /**
19      * @param string $id
20      * @return bool|null bool on success / failure, null if not supported
21      */
22     public static function aquireDBSessionLock($id)
23     {
24         $id = 'tine20_' . $id;
25         $db = Tinebase_Core::getDb();
26
27         if ($db instanceof Zend_Db_Adapter_Pdo_Mysql) {
28             if (    ($stmt = $db->query('SELECT IS_FREE_LOCK("' . $id . '")')) &&
29                     $stmt->setFetchMode(Zend_Db::FETCH_NUM) &&
30                     ($row = $stmt->fetch()) &&
31                     $row[0] == 1) {
32                 $stmt->closeCursor();
33                 if (    ($stmt = $db->query('SELECT GET_LOCK("' . $id . '", 1)')) &&
34                         $stmt->setFetchMode(Zend_Db::FETCH_NUM) &&
35                         ($row = $stmt->fetch()) &&
36                         $row[0] == 1) {
37                     return true;
38                 }
39             }
40             return false;
41
42         } elseif($db instanceof Zend_Db_Adapter_Pdo_Pgsql) {
43             $id = sha1($id, true);
44             $intId = unpack('N', $id);
45             if (    ($stmt = $db->query('SELECT pg_try_advisory_lock(' . current($intId) . ')')) &&
46                     $stmt->setFetchMode(Zend_Db::FETCH_NUM) &&
47                     ($row = $stmt->fetch()) &&
48                     $row[0] == 1) {
49                 return true;
50             }
51             return false;
52
53         } else {
54             // not implemented / supported
55             return null;
56         }
57     }
58
59     /**
60      * @param string $id
61      * @return bool|null bool on success / failure, null if not supported
62      */
63     public static function releaseDBSessionLock($id)
64     {
65         $id = 'tine20_' . $id;
66         $db = Tinebase_Core::getDb();
67
68         if ($db instanceof Zend_Db_Adapter_Pdo_Mysql) {
69             if (    ($stmt = $db->query('SELECT RELEASE_LOCK("' . $id . '")')) &&
70                     $stmt->setFetchMode(Zend_Db::FETCH_NUM) &&
71                     ($row = $stmt->fetch()) &&
72                     $row[0] == 1) {
73                 return true;
74             }
75             return false;
76
77         } elseif($db instanceof Zend_Db_Adapter_Pdo_Pgsql) {
78             $id = sha1($id, true);
79             $intId = unpack('N', $id);
80             if (    ($stmt = $db->query('SELECT pg_advisory_unlock(' . current($intId) . ')')) &&
81                 $stmt->setFetchMode(Zend_Db::FETCH_NUM) &&
82                 ($row = $stmt->fetch()) &&
83                 $row[0] == 1) {
84                 return true;
85             }
86             return false;
87
88         } else {
89             // not implemented / supported
90             return null;
91         }
92     }
93 }