WebdavCache.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Webdav file system cache.
  4. *
  5. * $_SESSION['WebdavCache'] => array(
  6. * $type => array(
  7. * $id => array(
  8. * 'name' => '',
  9. * 'realpath' => '',
  10. * 'size' => '',
  11. * 'mimetype' => '',
  12. * 'K_TYP_KORESP' => ''
  13. * )
  14. * ),
  15. * $special_type = array(
  16. * $id => $type
  17. * ),
  18. * '_pisma_all' => array(
  19. * $pismoID => array(
  20. * $ind => array(
  21. * 'name' => '',
  22. * 'K_TYP_KORESP' => ''
  23. * )
  24. * )
  25. * )
  26. * )
  27. *
  28. * $type:
  29. * real: PISMO - (IN7_DZIENNIK_KORESP_COLUMN)
  30. * real: PROJEKT - (IN7_MK_BAZA_DYSTRYBUCJI_COLUMN)
  31. * real: DRUK - (CRM_LISTA_ZASOBOW_COLUMN)
  32. * virtual: PROJEKT_PISMA_{$id} - pisma związane w projektem
  33. * virtual: PROJEKTY_OSTATNIE
  34. *
  35. * usage:
  36. * array get('PISMO', 123, 'realpath') - returns file realpath if exists in cache
  37. * array get('PISMO', 123) - returns file params
  38. * array get('PISMO', null, 'getIds') - returns array of ids in cache
  39. * array get('PROJEKT_PISMA_{$id}', null, 'getIds') - returns array of ids in cache
  40. * array get('PROJEKT_PISMA_{$id}', null, 'getFileNames') - returns array of file names in cache
  41. * set('PROJEKT', 123, 'realpath', 'proj_dir_name') -
  42. */
  43. class WebdavCache {
  44. /**
  45. * @param $type - PROJEKT, PISMO, DRUK, PROJEKT_PISMA
  46. */
  47. function get($type, $id = null, $task = '') {
  48. if (false !== strpos($type, 'PISM')) {
  49. self::_cacheFileInitPisma();
  50. }
  51. if ($task == 'getIds') {
  52. if (isset($_SESSION['WebdavCache'][$type])) {
  53. return array_keys($_SESSION['WebdavCache'][$type]);
  54. }
  55. }
  56. else if ($task == 'getFileNames') {
  57. $fileNames = array();
  58. if (isset($_SESSION['WebdavCache'][$type])) {
  59. foreach ($_SESSION['WebdavCache'][$type] as $kFileID => $v) {
  60. if (is_array($v)) {
  61. if (isset($v['name'])) {
  62. $fileNames[] = $v['name'];
  63. }
  64. else {
  65. foreach ($v as $vFile) {
  66. if (isset($vFile['name'])) {
  67. $fileNames[] = $vFile['name'];
  68. }
  69. }
  70. }
  71. }
  72. else if (array_key_exists($v, $_SESSION['WebdavCache'])) {
  73. if (isset($_SESSION['WebdavCache'][$v][$kFileID])) {
  74. if (is_array($_SESSION['WebdavCache'][$v][$kFileID])) {
  75. if (isset($_SESSION['WebdavCache'][$v][$kFileID]['name'])) {
  76. $fileNames[] = $_SESSION['WebdavCache'][$v][$kFileID]['name'];
  77. }
  78. else {
  79. foreach ($_SESSION['WebdavCache'][$v][$kFileID] as $vFile) {
  80. if (isset($vFile['name'])) {
  81. $fileNames[] = $vFile['name'];
  82. }
  83. }
  84. }
  85. }
  86. }
  87. }
  88. else {
  89. }
  90. }
  91. return $fileNames;
  92. }
  93. }
  94. else {
  95. if (isset($_SESSION['WebdavCache'][$type][$id])) {
  96. switch ($task) {
  97. case '':
  98. return $_SESSION['WebdavCache'][$type][$id];
  99. break;
  100. case 'name':
  101. case 'realpath':
  102. case 'size':
  103. case 'mimetype':
  104. case 'K_TYP_KORESP':
  105. if (isset($_SESSION['WebdavCache'][$type][$id])) {
  106. if (isset($_SESSION['WebdavCache'][$type][$id][$task])) {
  107. return $_SESSION['WebdavCache'][$type][$id][$task];
  108. }
  109. else if (is_array($_SESSION['WebdavCache'][$type][$id])) {
  110. $ret = array();
  111. foreach ($_SESSION['WebdavCache'][$type][$id] as $v) {
  112. $val = V::get($task, null, $v);
  113. if (!empty($val)) {
  114. $ret[] = $val;
  115. }
  116. }
  117. return $ret;
  118. }
  119. }
  120. break;
  121. default:
  122. }
  123. }
  124. }
  125. return null;
  126. }
  127. function set($type, $id, $task = '', $value = null) {
  128. if (!isset($_SESSION['WebdavCache'])) $_SESSION['WebdavCache'] = array();
  129. if (!isset($_SESSION['WebdavCache'][$type])) $_SESSION['WebdavCache'][$type] = array();
  130. if (!isset($_SESSION['WebdavCache'][$type][$id])) $_SESSION['WebdavCache'][$type][$id] = array();
  131. switch ($task) {
  132. case 'name':
  133. $_SESSION['WebdavCache'][$type][$id]['name'] = $value;
  134. break;
  135. case 'realpath':
  136. $_SESSION['WebdavCache'][$type][$id]['realpath'] = $value;
  137. break;
  138. case 'size':
  139. $_SESSION['WebdavCache'][$type][$id]['size'] = $value;
  140. break;
  141. case 'mimetype':
  142. $_SESSION['WebdavCache'][$type][$id]['mimetype'] = $value;
  143. break;
  144. case 'K_TYP_KORESP':
  145. $_SESSION['WebdavCache'][$type][$id]['K_TYP_KORESP'] = $value;
  146. break;
  147. default:
  148. if ($type == 'PROJEKTY_OSTATNIE') {
  149. $_SESSION['WebdavCache']['PROJEKTY_OSTATNIE'][$id] = 'PROJEKT';
  150. }
  151. }
  152. }
  153. /**
  154. * Fetch all files PISMA in cache array.
  155. *
  156. * use $_SESSION['WebdavCache']['_pisma_all']
  157. */
  158. function _cacheFileInitPisma() {
  159. if (!empty($_SESSION['WebdavCache']['_pisma_all'])) {
  160. //myLog(__CLASS__, __FUNCTION__, __LINE__, " glob cache time (".(time() - $_SESSION['WebdavCache']['_pisma_all']['_ts']).") ...");
  161. if (time() - $_SESSION['WebdavCache']['_pisma_all']['_ts'] < 300) {
  162. return;
  163. }
  164. }
  165. $_SESSION['WebdavCache']['_pisma_all'] = array();
  166. $_SESSION['WebdavCache']['_pisma_all']['_ts'] = time();
  167. $basePath = WebdavHelper::getBaseDir('IN7_DZIENNIK_KORESP_COLUMN');
  168. myLog(__CLASS__, __FUNCTION__, __LINE__, " glob start ...");
  169. $files = glob("{$basePath}/*/*.*", GLOB_NOSORT);
  170. for ($i = 0, $cnt = count($files); $i < $cnt; $i++) {
  171. $fileID = 0;
  172. $file = $files[$i];
  173. $file = str_replace($basePath . '/', '', $file);
  174. $fileParts = explode('/', $file);
  175. if (count($fileParts) == 2) {
  176. list($fileID, $tmp) = explode('.', $fileParts[1], 2);
  177. }
  178. if ($fileID > 0) {
  179. $_SESSION['WebdavCache']['_pisma_all'][$fileID][] = array('name'=>$fileParts[1], 'realpath'=>$file,'K_TYP_KORESP'=>$fileParts[0]);
  180. }
  181. }
  182. myLog(__CLASS__, __FUNCTION__, __LINE__, " glob end count(".count($files).") _pisma_all(".count($_SESSION['WebdavCache']['_pisma_all']).") ");
  183. }
  184. function setPismaByIds($projektID, $pismaIds) {
  185. self::_cacheFileInitPisma();
  186. //$_SESSION['WebdavCache']['_pisma_all'][$fileID][] = array('realpath'=>$file, 'K_TYP_KORESP'=>$fileParts[0]);
  187. if (empty($pismaIds)) {
  188. return;
  189. }
  190. foreach ($pismaIds as $pismoID) {
  191. if (!empty($_SESSION['WebdavCache']['_pisma_all'][$pismoID])) {
  192. foreach ($_SESSION['WebdavCache']['_pisma_all'][$pismoID] as $kInd => $vPismo) {
  193. $_SESSION['WebdavCache']['PISMO'][$pismoID][] = $vPismo;
  194. $_SESSION['WebdavCache']['PROJEKT_PISMA_' . $projektID][$pismoID] = 'PISMO';
  195. }
  196. }
  197. }
  198. }
  199. }