/lib/LIB_Document.inc
PHP | 2492 lines | 2025 code | 346 blank | 121 comment | 378 complexity | 8ee92fa255a958374feddf7402e3a796 MD5 | raw file
- <?php
- require_once('UM_User.inc');
- require_once('LIB_Node.inc');
- require_once('AV_FaultTolerantFS.inc');
- define('HALF_SEARCH_LIMIT', 50000);
- //--Class: LIB_Document
- //--Desc: Library document class.
- class LIB_Document extends LIB_Node
- {
- //
- //--Private
- //
- protected $docMainTable; //--Desc: Document database main table
- protected $docTable; //--Desc: Document database table
- protected $docPath;
- protected $foderTables;
- //
- //--Public
- //
- //--Method: __constructor
- //--Desc: Constructor.
- function __construct(&$module)
- {
- parent::__construct($module);
- $this->docMainTable = new FORM_DynTable("LIB_Document", $this->module);
- $this->docTable = NULL;
- }
-
- function LoadFieldsDef($docId, $path)
- {
- if($docId != NULL)
- {
- $SQL = 'SELECT path FROM LIB_Folder,LIB_DocumentLink WHERE ';
- $SQL .= "docId = '$docId' AND ";
- $SQL .= 'LIB_DocumentLink.folderId=LIB_Folder.folderId ';
- $SQL .= 'LIMIT 1 LOCK IN SHARE MODE';
- $path = $this->dbDriver->GetOne($SQL);
- if($path == NULL)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'path'));
- $path = addslashes($path);
- $disableFileReq = true;
- }
- else
- $disableFileReq = false;
-
- $this->folderTables = $this->GetFolderTables($path);
-
- $fieldsDef=array_merge($this->docMainTable->LoadFieldsDef($disableFileReq),
- $this->nodeTable->LoadFieldsDef($disableFileReq));
- foreach($this->folderTables as $table)
- {
- require_once($table['dataModule'].'.inc');
- $this->docTable[$table['tableName']]=
- new $table['dataModule']($table['tableName'],$this->module);
- $fieldsDef =
- array_merge($fieldsDef,
- $this->docTable[$table['tableName']]->LoadFieldsDef($disableFileReq));
- }
- $fieldsDef[2080]['fieldName'] = 'keywords';
- $fieldsDef[2080]['required'] = false;
- $fieldsDef[2080]['allowNull'] = true;
- $fieldsDef[2080]['stripSlashes'] = false;
- ksort($fieldsDef);
- return $fieldsDef;
- }
- //--Method: Insert
- //--Desc: Inserts new document to the library
- function Insert($fields)
- {
- $folderData = parent::Insert($fields);
- // Retrieves docId to be returned
- $docId = $this->dbDriver->GetOne('SELECT LAST_INSERT_ID() FROM DUAL');
- if($docId === NULL)
- throw new AV_Exception(FAILED, $this->lang);
- $this->docMainTable->Insert($fields,array('docId'=>$docId));
- foreach($this->docTable as $table)
- $table->Insert($fields, array('docId'=>$docId));
-
- if($fields['keywords'] != NULL)
- $this->InsertKeywords($fields['keywords']);
-
- $this->CreateDocLink($folderData['folderId'],$docId,$fields['beforeDocId']);
- $fields['docId'] = $docId;
- $this->InsHistory($fields);
-
- $this->NotifyAdmin('adminInsDocLogTag',$fields);
- return $docId;
- }
- //--Method: Set
- //--Desc: Sets document data
- function Set($fields)
- {
- // sets node
- $fields['nodeId'] = $fields['docId'];
- parent::Set($fields);
- $this->docMainTable->Set($fields);
- $oldValues = array();
- foreach($this->docTable as $table)
- {
- $_oldValues = $table->Set($fields);
- if($this->module->pageBuilder->siteConfig->getVar('admin','history'))
- $oldValues = array_merge($oldValues,$_oldValues);
- }
- // delete keywords
- if($fields['keywords'] !== NULL)
- {
- $SQL = "DELETE FROM LIB_Keyword WHERE docId = '".$fields['docId']."'";
- $this->dbDriver->ExecSQL($SQL);
- if($fields['keywords'] != NULL)
- $this->InsertKeywords($fields['keywords'],$fields['docId']);
- }
- $this->InsHistory($fields,$oldValues);
- $this->NotifyAdmin('adminSetDocLogTag',$fields);
- }
- function Duplicate($path, $docId, $beforeDocId)
- {
- $folderData = parent::Duplicate($path,$docId);
- // Retrieves docId to be returned
- $targetId = $this->dbDriver->GetOne('SELECT LAST_INSERT_ID()');
- if($targetId === NULL)
- throw new AV_Exception(FAILED, $this->lang);
- $fields['docId'] = $targetId;
- $sourceKey['fieldName'] = 'docId';
- $sourceKey['fieldValue'] = $docId;
- $this->docMainTable->Duplicate($sourceKey,$fields);
- foreach($this->docTable as $table)
- $table->Duplicate($sourceKey,$fields);
- $this->DuplicateKeywords($docId,$targetId);
-
- $this->CreateDocLink($folderData['folderId'],$targetId,$beforeDocId);
-
- $fields['path'] = $path;
- $this->NotifyAdmin('adminDupDocLogTag',$fields);
- return $targetId;
- }
- function InsDocLink($path, $docId, $beforeDocId)
- {
- if($this->dbDriver->type=='oracle')
- {
- $LOCK = 'LOCK TABLE LIB_FolderTables,LIB_Folder,LIB_DocumentLink ';
- $LOCK .= 'IN SHARE MODE';
- $this->dbDriver->ExecSQL($LOCK);
- }
- // check if path is compatible with the docId table
- $SQL = 'SELECT DISTINCT id, tableName ';
- $SQL .= 'FROM LIB_FolderTables,LIB_Folder,LIB_DocumentLink WHERE ';
- $SQL .= "docId = '$docId' AND ";
- $SQL .= 'LIB_DocumentLink.folderId=LIB_Folder.folderId AND ';
- $SQL .= 'folderTables = id ';
- $SQL .= 'ORDER BY printOrder LIMIT 2,10 LOCK IN SHARE MODE';
- $docTables = $this->dbDriver->GetAll($SQL);
- if(count($docTables) == 0)
- throw new AV_Exception(NOT_FOUND, $this->lang);
-
- $folderTables = $this->GetFolderTables($path);
- if($docTables !== $folderTables)
- throw new AV_Exception(INVALID_PATH, $this->lang,
- array('fieldName','path'));
- // checks out for write permission
- $folderData = $this->GetFolderData($path,'share');
- $this->CheckNodePermission($folderData, true);
- $docData = $this->GetDocData($docId, 'share');
- // checks out for read permission
- $this->CheckNodePermission($docData, false);
- $this->CreateDocLink($folderData['folderId'], $docId, $beforeDocId);
- $fields = $this->GetDocFields($docId, $path);
- $fields['path'] = $path;
- $this->NotifyAdmin('adminCopyDocLogTag',$fields);
- }
- //--Method: DelDocLink
- //--Desc: Deletes document link in the library.
- function DelDocLink($path, $docId)
- {
- $folderData = $this->GetFolderData($path, 'share');
- // checks out for write permission
- $data = $this->CheckNodePermission($folderData, true);
- // checks restricted deletion flag
- $this->CheckRestrictedDeletion($folderData, $data['memberData'], $docId);
- // lock link (table row) that will be deleted
- $SQL = 'SELECT * FROM LIB_DocumentLink ';
- $SQL .= "WHERE docId = '$docId' ";
- $SQL .= "AND folderId='".$folderData['folderId']."' ";
- $SQL .= 'FOR UPDATE ';
- $row = $this->dbDriver->GetRow($SQL);
- if(count($row)==NULL)
- throw new AV_Exception(NOT_FOUND, $this->lang);
- $SQL = 'SELECT COUNT(*) as numLinks ';
- $SQL .= 'FROM LIB_DocumentLink dl ';
- $SQL .= "WHERE dl.docId = '$docId' ";
- $SQL .= 'LOCK IN SHARE MODE ';
- $numLinks = $this->dbDriver->GetOne($SQL);
-
- $returnFields = $this->GetReturnFields($path);
- if(count($returnFields)>0)
- {
- $tables = array();
- foreach($returnFields as $key=>$field)
- {
- if(!isset($tables[$field['tableName']]))
- {
- if($key>0)
- $FROM .= ',';
- $FROM .= $field['tableName']." t$key";
- if($key>0)
- $WHERE .= "AND ";
- if($field['tableName']=='LIB_Node')
- $WHERE .= "t$key.nodeId='$docId' ";
- else
- $WHERE .= "t$key.docId='$docId' ";
- $tables[$field['tableName']] = "t$key";
- }
- if($key>0)
- $SELECT .= ',';
- $SELECT .= $tables[$field['tableName']].'.'.$field['fieldName'];
- }
- $SQL = "SELECT $SELECT FROM $FROM WHERE $WHERE ";
- $row = $this->dbDriver->GetRow($SQL);
- if(count($row) === NULL)
- throw new AV_Exception(FAILED, $this->lang);
- }
- // if it's the last document link, deletes full node and file
- if($numLinks == 1)
- $this->Del(array('nodeId'=>$docId));
- else
- {
- // not the last link, deletes only the link
- $SQL = 'DELETE FROM LIB_DocumentLink ';
- $SQL .= 'WHERE ';
- $SQL .= "folderId = '".$folderData['folderId']."' AND ";
- $SQL .= "docId = '$docId' ";
- $this->dbDriver->ExecSQL($SQL);
- }
- $row['path'] = $path;
- $this->NotifyAdmin('adminDelDocLogTag',$row);
- }
- function &GetForm($keyFields, $path, $fieldName, $sourceId, & $templates,
- & $formObject, $defValues = array(),$dateFormat = NULL,
- $numberFormat = true, $short = false)
- {
- if($keyFields != NULL)
- $this->LoadFieldsDef($keyFields['docId']);
- else
- $this->LoadFieldsDef(NULL,$path);
- $formObject->attrs['folderTables'] = $this->folderTables[0]['id'];
- foreach($this->docTable as $table)
- $table->GetForm($keyFields,$fieldName,$sourceId,$templates,
- $formObject,$defValues,$dateFormat,$numberFormat,$short);
- $this->docMainTable->GetForm($keyFields,$fieldName,$sourceId,$templates,
- $formObject,$defValues,$dateFormat,
- $numberFormat,$short);
- if($keyFields != NULL)
- $keyFields['nodeId'] = $keyFields['docId'];
- else
- {
- $folderData = $this->GetFolderData($path, 'share');
- if(!isset($defValues['userRight']) && isset($folderData['defUserRight']))
- $defValues['userRight'] = $folderData['defUserRight'];
- if(!isset($defValues['groupRight']) && isset($folderData['defGroupRight']))
- $defValues['groupRight'] = $folderData['defGroupRight'];
- if(!isset($defValues['otherRight']) && isset($folderData['defOtherRight']))
- $defValues['otherRight'] = $folderData['defOtherRight'];
- }
- parent::GetForm($keyFields,$fieldName,$sourceId,$templates,
- $formObject,$defValues,$dateFormat,$numberFormat,$short);
- // keywords field
- if($fieldName==NULL || $fieldName=='keywords')
- {
- $SQL = "SELECT keyword FROM LIB_Keyword WHERE docId = '";
- $SQL .= $keyFields['docId']."'";
- $keywords = $this->dbDriver->GetCol($SQL);
- $keywordsField = new AV_ModObject('field', $this->module->pageBuilder);
- $keywordsField->attrs['fieldName'] = 'keywords';
- $keywordsField->attrs['value'] = implode(', ', $keywords);
- $keywordsField->attrs['type'] = 'text';
- $keywordsField->attrs['size'] = '255';
- $keywordsField->attrs['attributes'] = "size='50'";
- $keywordsField->attrs['label'] =
- $this->label->GetLabel('LIB_Document_keywords', $this->lang);
- $formObject->children[2080] = & $keywordsField;
- $formObject->attrs['keywords'] = $keywordsField->attrs['value'];
- }
- if($fieldName==NULL || $fieldName=='langTab')
- {
- // language tab
- $langList = $this->label->GetLangList();
- $langTab = new FORM_Object('field', $this->module->pageBuilder,
- $templates, 'langTabItem');
- $langTab->attrs['fieldName'] = 'langTab';
- $langTab->attrs['type'] = 'langTab';
- $langTab->attrs['adminLangTitle']=$this->label->GetLabel('adminLangTitle',
- $this->lang);
- // creates tab items
- foreach($langList as $key => $lang)
- {
- $field = new AV_ModObject('tab', $this->module->pageBuilder);
- $field->attrs['type'] = 'langTabItem';
- $field->attrs['lang'] = $lang['lang'];
- $field->attrs['label'] = mb_substr($lang['lang'],0,2);
- $langTab->children[] = $field;
- }
- $formObject->children[500] = & $langTab;
- }
- ksort($formObject->children);
- return $formObject;
- }
- function GetHistory($docId)
- {
- $SQL = '(SELECT dh.id, u.login, u.name, dh.histDate, dh.fieldName, ';
- $SQL .= 'dh.value, NULL as parentField ';
- $SQL .= 'FROM LIB_DocHistory dh, UM_User u ';
- $SQL .= "WHERE dh.docId='$docId' ";
- $SQL .= 'AND dh.userId = u.userId) ';
- $SQL .= 'UNION ';
- $SQL .= '(SELECT dh.id, u.login, u.name, dh.histDate, dh.fieldName, ';
- $SQL .= 'dh.value, dhor.fieldName as parentField ';
- $SQL .= 'FROM LIB_DocHistory dh, LIB_DocHistoryObjRef dhor, UM_User u ';
- $SQL .= "WHERE dh.docId=dhor.refId AND dhor.docId='$docId' ";
- $SQL .= 'AND dh.userId = u.userId) ';
- $SQL .= 'ORDER BY id ';
- $historyList = $this->dbDriver->GetAll($SQL);
- foreach($historyList as &$history)
- if($history['value']!=NULL)
- $history['value'] = json_decode($history['value'],true);
- return $historyList;
- }
- function DocList($params)
- {
- $path = $this->PreparePath($params['path']);
-
- // checks for returnFields
- $aux['recursiveSearch'] = false; // prevents recursive search
- $aux['path'][] = $path;
- $this->LoadReturnFields($aux);
- $folderTables = $this->GetFolderTables($path);
- foreach($folderTables as $key=>$folder)
- {
- $tableObj = new FORM_DynTable($folder['tableName'], $this->module);
- $fieldsDef = $tableObj->LoadFieldsDef();
- foreach($fieldsDef as $def)
- {
- if(in_array($def['fieldName'],$aux['returnFields']))
- {
- if($def['type']!='objectList' &&
- $def['type']!='fileList')
- $returnFields[] = "t$key.".$def['fieldName'];
- }
- }
- if(!in_array($folder['tableName'],$tables))
- {
- $tables[$folder['tableName']] = $folder['tableName'] . " t$key";
- $tablesWhere[] .= "t$key.docId ";
- }
- }
- $returnFields = implode(',', $returnFields);
- if(count($returnFields)==0)
- throw new AV_Exception(FAILED, $this->lang);
- $SQL .= 'SELECT doc.docId, docLink.folderId, folderTables, path,';
- $SQL .= "docLink.fixedOrder,$returnFields ";
- $SQL .= 'FROM LIB_DocumentLink docLink,LIB_Folder folder,';
- $SQL .= 'LIB_Node docNode, LIB_Document doc, LIB_Node folderNode,';
- $SQL .= implode(',',$tables);
- $SQL .= " WHERE path = '$path' ";
- $SQL .= 'AND docLink.folderId=folder.folderId ';
- $SQL .= 'AND docLink.docId=docNode.nodeId ';
- $SQL .= 'AND docLink.docId=doc.docId ';
- $SQL .= 'AND docLink.folderId=folderNode.nodeId ';
- $SQL .= 'AND docLink.docId='.implode(' AND docLink.docId=',$tablesWhere);
- // loads user member data and groups
- $sessionH = & $this->module->pageBuilder->sessionH;
- // checks if user is not logged and also public access right
- if(!$sessionH->isGuest())
- {
- $userMan = new UM_User($this->module);
- $params['memberData'] = $userMan->GetMemberData('share', false, false);
- $params['memberGroups'] = $userMan->GetMemberGroupsIds('share');
- }
- $SQL .= " AND ";
- if(isset($params['memberData']['userId']))
- {
- if(count($params['memberGroups'])==0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'memberGroups'));
- $groups = implode(',',$params['memberGroups']);
- # check folder permission
- $SQL .= 'IF(folderNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(folderNode.userRight,'r'),";
- $SQL .= "IF(folderNode.groupId IN ($groups),";
- $SQL .= "INSTR(folderNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=folderNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(folderNode.otherRight,'r'))))<>0 ";
- # check node permission
- $SQL .= ' AND ';
- $SQL .= 'IF(docNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(docNode.userRight,'r'),";
- $SQL .= "IF(docNode.groupId IN ($groups),";
- $SQL .= "INSTR(docNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=docNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(docNode.otherRight,'r'))))<>0 ";
- }
- else
- {
- $SQL .= "INSTR(folderNode.otherRight,'r')<>0 ";
- $SQL .= "AND INSTR(docNode.otherRight,'r')<>0 ";
- }
- $SQL .= $this->GetExclusionFiltersSQL($params['exclusionFilters']);
- $SQL .= ' LIMIT ' . HALF_SEARCH_LIMIT;
-
- return $this->dbDriver->GetAll($SQL);
- }
- //--Method: Search
- //--Desc: Searches library documents
- function &Search(& $params)
- {
- if(!isset($params['tempTable']))
- $params['tempTable'] = true;
- // prepare filter
- $params['filter'] = $this->PrepareFilter($params['filter']);
- // search allows more then one path
- $params['path'] = explode(',',$params['path']);
- foreach($params['path'] as &$path)
- // prepare path
- $path = $this->PreparePath($path);
- // if should search keywords
- $key = array_search('keywords',$params['searchCriteria']);
- $params['searchKeywords'] = ($key !== false && $key !== NULL ||
- $params['searchCriteria'] == '*');
- if($params['searchKeywords'])
- {
- if($params['searchCriteria'] != '*')
- unset($params['searchCriteria'][$key]);
- // if no filter is specified, does not search keywords
- if($params['filter'] === NULL)
- $params['searchKeywords'] = false;
- }
- // checks for returnFields
- if($params['returnFields']==NULL)
- $this->LoadReturnFields($params);
- // saves default values for later use when deciding which search object
- // should be searched just bellow
- $exclusionFilters = $params['exclusionFilters'];
- $searchCriteria = $params['searchCriteria'];
- // load search fields and create result table with them
- $this->LoadSearchDefs($params);
- // loads user member data and groups
- $sessionH = & $this->module->pageBuilder->sessionH;
- // checks if user is not logged and also public access right
- if(!$sessionH->isGuest())
- {
- $userMan = new UM_User($this->module);
- $params['memberData'] = $userMan->GetMemberData('share', false, false);
- $params['memberGroups'] = $userMan->GetMemberGroupsIds('share');
- }
- try
- {
- foreach($params['searchObjs'] as $key=>$obj)
- {
- // search object if:
- // - returnFields has any field from the object tables and
- // - exclusionFilters are not given or all fields exists on the object
- // tables and
- // - searchCriteria are not given or any field exists on the object
- // tables
- if(count($obj['returnFields'])>0 &&
- ($exclusionFilters==NULL ||
- count($exclusionFilters)==count($obj['exclusionFilters'])) &&
- ($params['searchKeywords'] ||
- $searchCriteria==NULL ||
- count($obj['searchCriteria'])>0) &&
- ($params['orderBy'] == 'matches' ||
- $params['orderBy'] == 'fixedOrder' ||
- $obj['foundOrderBy']))
- {
- if(!$params['searchKeywords'] &&
- $searchCriteria==NULL ||
- count($obj['searchCriteria'])>0)
- $this->SearchObject($params,$obj);
- if($params['searchKeywords'])
- $this->SearchKeywords($params,$obj);
- }
- }
-
- $result = $this->GetSearchResult($params);
- if($params['tempTable'])
- $this->dbDriver->ExecSQL("DROP TABLE ".$params['tableName']);
- return $result;
- }
- catch(Exception $e)
- {
- if($params['tempTable'])
- $this->dbDriver->ExecSQL("DROP TABLE ".$params['tableName']);
- throw $e;
- }
- }
- //--Method: SetOrder
- function SetOrder($docId, $path, $offset)
- {
- $folderData = $this->GetFolderData($path, 'share');
- // checks out for write permission
- $data = $this->CheckNodePermission($folderData, true);
- $folderId = $folderData['folderId'];
- // locks selected document
- if($this->dbDriver->type=='oracle')
- {
- // for oracle, lock all folder files
- $SQL = 'SELECT fixedOrder FROM LIB_DocumentLink ';
- $SQL .= "WHERE folderId=$folderId FOR UPDATE";
- $this->dbDriver->ExecSQL($SQL);
- }
- $SQL = 'SELECT fixedOrder FROM LIB_DocumentLink ';
- $SQL .= "WHERE folderId=$folderId AND docId=$docId ";
- if($this->dbDriver->type!='oracle')
- $SQL .= "FOR UPDATE";
- $currPos = $this->dbDriver->GetOne($SQL);
- if($currPos == NULL)
- throw new AV_Exception(FAILED, $this->lang);
- // finds and locks next doc by position
- $SQL = 'SELECT docId, fixedOrder FROM LIB_DocumentLink ';
- $WHERE = "WHERE folderId=$folderId AND ";
- if($offset < 0)
- {
- $WHERE .= "fixedOrder<$currPos ";
- $WHERE .= "ORDER BY fixedOrder DESC ";
- }
- else
- {
- $WHERE .= "fixedOrder>$currPos ";
- $WHERE .= "ORDER BY fixedOrder ASC ";
- }
- $WHERE .= 'LIMIT '.abs($offset).' ';
- $SQL .= $WHERE;
- if($this->dbDriver->type!='oracle')
- $SQL .= "FOR UPDATE";
- $next = $this->dbDriver->GetAll($SQL);
- if(count($next) == 0)
- return;
- $SQL = "UPDATE LIB_DocumentLink SET ";
- if($offset < 0)
- $SQL .= "fixedOrder=fixedOrder+1 ";
- else
- $SQL .= "fixedOrder=fixedOrder-1 ";
- $SQL .= $WHERE;
- $this->dbDriver->ExecSQL($SQL);
- $SQL = "UPDATE LIB_DocumentLink SET fixedOrder='".end($next)['fixedOrder']."' WHERE ";
- $SQL .= "folderId=$folderId AND docId=$docId";
- $this->dbDriver->ExecSQL($SQL);
- $fields = $this->GetDocFields($docId, $path);
- $fields['path'] = $path;
- $this->NotifyAdmin('adminSetOrderLogTag',$fields);
- }
- function TakeDocOwnership($docId,$path)
- {
- $fields = $this->GetDocFields($docId, $path);
- if(count($fields)==NULL)
- throw new AV_Exception(NOT_FOUND,$this->lang);
- $login = $this->TakeOwnership($docId);
- $this->NotifyAdmin('adminTakeDocOwnershipLogTag',$fields);
- return $login;
- }
- function GetDocLinks($docId)
- {
- if($docId == NULL)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName','docId'));
- $SQL = 'SELECT f.folderId, path ';
- $SQL .= 'FROM LIB_DocumentLink l, LIB_Folder f ';
- $SQL .= "WHERE docId=$docId AND l.folderId=f.folderId ";
- return $this->dbDriver->GetAll($SQL);
- }
- function GetFileContent($fieldName,$docId,$size,$jpegQuality,
- $maxWidth=NULL,$maxHeight=NULL,$bgColor=NULL,
- $cropRatio=NULL)
- {
- $SQL = 'SELECT fld.tableName ';
- $SQL .= 'FROM LIB_DocumentLink dl,LIB_Folder f,LIB_FolderTables ft,';
- $SQL .= 'FORM_Field fld ';
- $SQL .= "WHERE docId='$docId' AND dl.folderId=f.folderId ";
- $SQL .= 'AND folderTables=id AND ft.tableName=fld.tableName ';
- $SQL .= "AND fieldName='$fieldName' LIMIT 1";
- $tableName = $this->dbDriver->GetOne($SQL);
- if($tableName == NULL)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- Array('fieldName'=>'fieldName',
- 'addMsg'=>' (fieldName)'));
- if($size != NULL || $maxHeight != NULL && $maxWidth != NULL ||
- $bgColor != NULL)
- $docData = & $this->GetThumb($tableName,$fieldName,$docId,$size,
- $jpegQuality,$maxWidth,$maxHeight,
- $bgColor,$cropRatio);
- else
- {
- $SQL = 'SELECT nodeId,userId,groupId,userRight,groupRight,otherRight,';
- $SQL .= 'UNIX_TIMESTAMP(creationDate) as creationDate,';
- $SQL .= 'UNIX_TIMESTAMP(lastChanged) as lastChanged,';
- $SQL .= "lastChangedUserId,${fieldName},${fieldName}FileName,";
- $SQL .= "${fieldName}Type ";
- $SQL .= "FROM LIB_Node node,$tableName doc ";
- $SQL .= "WHERE nodeId=$docId AND nodeId=docId ";
- $docData = & $this->dbDriver->GetRow($SQL);
- if(count($docData) == 0)
- throw new AV_Exception(NOT_FOUND, $this->lang);
- if($this->module->pageBuilder->siteConfig->getVar('admin','blobToFS'))
- {
- $libPath = $this->module->pageBuilder->siteConfig->getVar("dirs",
- "library");
- $docData[$fieldName] = ft_file_get_contents($libPath . $docData[$fieldName]);
- if($docData[$fieldName] === false)
- throw new AV_Exception(FAILED, $this->lang,
- array('addMsg'=>' (unable to read file)',
- 'filePath'=>$libPath . $docData[$fieldName]));
- }
- }
- // checks out for read permission
- $this->CheckNodePermission($docData, false);
- return $docData;
- }
- function CheckDocPermission($docId,$write)
- {
- $docData = $this->GetDocData($docId, 'share');
- $this->CheckNodePermission($docData, $write);
- }
-
- function DelBlobFS()
- {
- $libPath = $this->module->pageBuilder->siteConfig->getVar("dirs",
- "library");
- $SQL = "SELECT id FROM LIB_BlobFS WHERE deleted='1' FOR UPDATE ";
- $unlinkList = $this->dbDriver->GetCol($SQL);
- foreach($unlinkList as $id)
- ft_unlink($libPath . $id);
- $SQL = "DELETE FROM LIB_BlobFS WHERE deleted='1' ";
- $this->dbDriver->ExecSQL($SQL);
- }
- protected function InsHistory($values,$oldValues=NULL)
- {
- if(!$this->module->pageBuilder->siteConfig->getVar('admin','history'))
- return;
-
- $userMan = new UM_User($this->module);
- $memberData = $userMan->GetMemberData('share', false, false);
- foreach($this->docTable as $tableName=>& $table)
- {
- $fieldsDef = $table->LoadFieldsDef();
- foreach($fieldsDef as & $field)
- {
- $value = NULL;
- switch($field['type'])
- {
- case 'text': case 'integer': case "date": case "datetime": case "cpf":
- case "cnpj": case "cep": case 'float': case 'currency': case 'percent':
- case "select": case "radio": case "selectMult": case 'legalEntityRef':
- case 'naturalPersonRef': case 'leOrNpEntityRef': case 'folder':
- case 'formula': case 'boolean': case "selectMultiple":
- if(strpos($field['accessMode'],'w') !== false &&
- $values[$field['fieldName']]!== NULL &&
- ($oldValues==NULL ||
- $values[$field['fieldName']]!=$oldValues[$field['fieldName']]))
- $value = "'".addslashes(json_encode($values[$field['fieldName']]))."'";
- break;
- case 'objectList':
- if($values[$field['fieldName']]!== NULL && $oldValues != NULL && count($oldValues[$field['fieldName']])>0)
- {
- if(count($oldValues[$field['fieldName']])>50)
- $oldValues[$field['fieldName']] = array_slice($oldValues[$field['fieldName']],0,50);
- $value = "'".addslashes(json_encode($oldValues[$field['fieldName']]))."'";
- }
- break;
- case 'fileList':
- if($values[$field['fieldName']]!== NULL && $oldValues != NULL)
- {
- $diff = false;
- if(count($values[$field['fieldName']])!=
- count($oldValues[$field['fieldName']]))
- $diff = true;
- else
- {
- foreach($values[$field['fieldName']] as $key=>$val)
- {
- if($val['docId']!=$oldValues[$field['fieldName']][$key])
- {
- $diff = true;
- break;
- }
- }
- }
- }
- if($diff)
- $value = 'NULL';
- break;
-
- case 'schedule': case 'file': case 'textArea': case "langLabel":
- case "langTextArea": case "langHtmlArea": case 'htmlArea':
- case 'usageTerms':
- default:
- break;
- }
- if($value!=NULL)
- {
- $SQL = 'INSERT INTO LIB_DocHistory ';
- $SQL .= '(docId,userId,histDate,tableName,fieldName,value) VALUES ';
- $SQL .= "('".$values['docId']."','".$memberData['userId']."',NOW(),";
- $SQL .= "'$tableName','".$field['fieldName']."',".$value.")";
- $this->dbDriver->ExecSQL($SQL);
- }
- }
- }
- }
- protected function GetFolderTables($path)
- {
- $path = $this->PreparePath($path);
- // loads path rights
- $SQL = 'SELECT ft.id, ft.tableName, ftp.dataModule ';
- $SQL .= 'FROM LIB_Folder f, LIB_FolderTables ft, LIB_FolderType ftp WHERE ';
- $SQL .= "path = '$path' AND ";
- $SQL .= 'folderTables = ft.id AND ';
- $SQL .= 'ft.id=ftp.id ';
- $SQL .= 'ORDER BY printOrder LIMIT 12 LOCK IN SHARE MODE ';
- $folderTables = $this->dbDriver->GetAll($SQL);
- if(count($folderTables) == 0)
- throw new AV_Exception(INVALID_PATH, $this->lang,
- array('addMsg'=>" ($path)"));
- array_splice($folderTables,0,2);
- return $folderTables;
- }
- //--Method: GetSearchResult
- //--Desc: Returns results from SearchKeywords and SearchAll methods
- //--Desc: checking permissions.
- protected function GetSearchResult(& $params)
- {
- if(!$params['tempTable'])
- $params['query'] = '(('.implode(') UNION (',$params['query']).'))';
- if($params['totalResults'])
- {
- if($params['tempTable'])
- {
- $SQL = 'SELECT COUNT(DISTINCT docId) FROM '. $params['tableName'];
- $params['totalResults'] = $this->dbDriver->GetOne($SQL);
- }
- else
- {
- $SQL = 'SELECT COUNT(DISTINCT docId) FROM '.$params['query']. ' res';
- $params['totalResults'] = $this->dbDriver->GetOne($SQL);
- }
- }
- $SQL = 'SELECT res.docId,path,folderTables,fixedOrder,';
- $SQL .= implode(',', $params['returnFieldsFound']);
- if($this->dbDriver->type=='oracle')
- // ORACLE
- $SQL .= ', maxMatches, sumMatches';
- else
- {
- // MYSQL
- $SQL .= ', MAX(matches) as maxMatches';
- $SQL .= ', SUM(matches) as sumMatches';
- }
- $SQL .= ' FROM ';
- if($this->dbDriver->type=='oracle')
- {
- // ORACLE
- $SQL .= '(SELECT r.*,';
- $SQL .= 'ROW_NUMBER() OVER (PARTITION BY docId ORDER BY docId) as rank ';
- $SQL .= 'FROM ';
- if($params['tempTable'])
- $SQL .= $params['tableName'];
- else
- $SQL .= $params['query'];
- $SQL .= ' r) res,';
-
- $SQL .= '(SELECT docId,MAX(matches) as maxMatches,';
- $SQL .= 'SUM(matches) as sumMatches ';
- $SQL .= 'FROM ';
- if($params['tempTable'])
- $SQL .= $params['tableName'];
- else
- $SQL .= $params['query'];
- $SQL .= ' GROUP BY docId ';
- $SQL .= ') groupRes ';
- $SQL .= 'WHERE res.docId=groupRes.docId AND res.rank=1';
- }
- else
- {
- // MYSQL
- if($params['tempTable'])
- $SQL .= $params['tableName'];
- else
- $SQL .= $params['query'];
- $SQL .= ' res ';
- $SQL .= 'GROUP BY docId';
- }
- $SQL .= " ORDER BY ";
- if($params['orderBy'] == 'matches')
- {
- $SQL .= ' maxMatches ' . ($params['order'] ? 'DESC' : 'ASC');
- $SQL .= ', sumMatches ' . ($params['order'] ? 'DESC' : 'ASC');
- }
- else
- {
- $SQL .= ' '.$params['orderBy'];
- $SQL .= ($params['order'] ? ' ASC' : ' DESC');
- }
- $SQL .= ', res.docId ';
- if($params['limit'] != NULL)
- {
- $SQL .= ' LIMIT ';
- if(isset($params['offset']))
- $SQL .= $params['offset'] . ',';
- $SQL .= $params['limit'];
- }
- $results = $this->dbDriver->GetAll($SQL);
-
- // for oracle table, clob fields must be loaded before dropping temporary table
- if($this->dbDriver->type=='oracle')
- {
- foreach($results as & $row)
- {
- foreach($params['clobFields'] as $clobField)
- $x = $row[$clobField];
- }
- }
- // format date fields and retrieves object list fields
- if(count($params['dateFields'])>0 ||
- count($params['floatFields'])>0 ||
- count($params['objectListFields'])>0 ||
- count($params['fileListFields'])>0 ||
- count($params['selectMultFields'])>0)
- {
- $locale = localeconv();
- foreach($results as & $res)
- {
- if($params['dateFormat']!=NULL)
- {
- foreach($params['dateFields'] as $dateField)
- {
- $res[$dateField.'_timestamp'] = strtotime($res[$dateField]);
- if($res[$dateField]!=NULL)
- $res[$dateField]=strftime($params['dateFormat'],
- (int)$res[$dateField.'_timestamp']);
- }
- }
- if($params['numberFormat'])
- {
- foreach($params['floatFields'] as &$floatField)
- {
- $res[$floatField.'Value']=$res[$floatField];
- $res[$floatField]=number_format($res[$floatField],
- $locale['frac_digits'],
- $locale['mon_decimal_point'],
- $locale['mon_thousands_sep']);
- }
- }
- foreach($params['objectListFields'] as &$objectListField)
- {
- $SQL = 'SELECT path, parentIdField FROM FORM_ObjectListField ol, LIB_Folder f ';
- $SQL .= "WHERE tableName='".$objectListField['tableName']."' ";
- $SQL .= "AND fieldName='".$objectListField['fieldName']."' ";
- $SQL .= 'AND ol.folderId=f.folderId ';
- $objectList = $this->dbDriver->GetRow($SQL);
- if(count($objectList)==0)
- throw new AV_Exception(FAILED, $this->lang);
- $subsearch = array();
- $subsearch['path'] = $objectList['path'];
- $exlusionFilter['fieldName'] = $objectList['parentIdField'];
- $exlusionFilter['value'] = $res['docId'];
- $exlusionFilter['operator'] = '=';
- $subsearch['exclusionFilters'][$objectList['parentIdField']][]= $exlusionFilter;
- $subsearch['orderBy'] = 'matches';
- $subsearch['dateFormat'] = $params['dateFormat'];
- $subsearch['tempTable'] = $params['tempTable'];
- $res[$objectListField['fieldName']] = $this->Search($subsearch);
- }
- foreach($params['fileListFields'] as &$fileListField)
- {
- $SQL = 'SELECT fd.docId,fd.contentFileName,fd.contentSize,';
- $SQL .= 'l_title.value as title,fd.authors,l_descr.value as descr,';
- $SQL .= 'fd.contentType ';
- $SQL .= 'FROM LIB_ContentFile ci, LIB_FileDocument fd, ';
- $SQL .= 'LANG_Label l_title, LANG_Text l_descr ';
- $SQL .= "WHERE ci.tableName='".$fileListField['tableName']."' ";
- $SQL .= "AND ci.fieldName='".$fileListField['fieldName']."' ";
- $SQL .= "AND ci.nodeId='".$res['docId']."' ";
- $SQL .= 'AND ci.fileId=fd.docId ';
- $SQL .= 'AND fd.title = l_title.labelId ';
- $SQL .= 'AND fd.descr = l_descr.labelId ';
- $SQL .= "AND l_title.lang='".$this->lang."' ";
- $SQL .= 'AND l_title.lang=l_descr.lang ';
- $res[$fileListField['fieldName']] = $this->dbDriver->GetAll($SQL);
- }
- foreach($params['selectMultFields'] as &$selectMultField)
- {
- $selectFieldInfo = $selectMultField['selectFieldInfo'];
- $SQL = 'SELECT ';
- $SQL .= 'o.'.$selectFieldInfo['optionTableKey'].',';
- $SQL .= 'o.'.$selectFieldInfo['optionTableValue'].' ';
- $SQL .= 'FROM ';
- $SQL .= $selectFieldInfo['optionTable'] . ' o,';
- $SQL .= $selectFieldInfo['selectedTable'] . ' s ';
- $SQL .= 'WHERE ';
- $SQL .= 'o.'.$selectFieldInfo['optionTableKey'].'=';
- $SQL .= 's.'.$selectFieldInfo['optionTableKey'].' ';
- $SQL .= "AND s.docId='".$res['docId']."' ";
- $res[$selectMultField['fieldName']] = $this->dbDriver->GetAll($SQL);
- }
- }
- }
- return $results;
- }
- //--Method: GetDocData
- //--Desc: Returns document attributes
- private function GetDocData($docId, $lockMode, & $status)
- {
- // loads path rights
- $SQL = 'SELECT * ';
- $SQL .= 'FROM LIB_Node node, LIB_Document doc ';
- $SQL .= 'WHERE ';
- $SQL .= "nodeId = $docId AND ";
- $SQL .= 'nodeId = docId ';
- switch($lockMode)
- {
- case 'share':
- $SQL .= ' LOCK IN SHARE MODE';
- break;
- case 'update':
- $SQL .= ' FOR UPDATE';
- break;
- }
- $doc = $this->dbDriver->GetRow($SQL);
- if(count($doc) == 0)
- throw new AV_Exception(NOT_FOUND, $this->lang);
- return $doc;
- }
- private function LoadReturnFields(& $params)
- {
- $SQL = 'SELECT DISTINCT fieldName FROM LIB_Folder, LIB_DocReturnFields ';
- $SQL .= 'WHERE (';
- foreach($params['path'] as $key=>&$path)
- {
- if($key>0)
- $SQL .= ' OR ';
- if($params['recursiveSearch'])
- $SQL .= "path LIKE '".$path."%' ";
- else
- $SQL .= "path = '".$path."' ";
- }
- $SQL .= ') AND folderTables=id ';
- $params['returnFields'] = $this->dbDriver->GetCol($SQL);
- }
- private function GetReturnFields($path)
- {
- $SQL = 'SELECT rf.tableName,rf.fieldName ';
- $SQL .= 'FROM LIB_Folder f, LIB_DocReturnFields rf, FORM_Field field ';
- $SQL .= "WHERE f.path = '$path' AND f.folderTables=rf.id ";
- $SQL .= 'AND rf.tableName=field.tableName AND rf.fieldName=field.fieldName ';
- $SQL .= "AND field.type NOT IN ('objectList','fileList','selectMultiple') ";
- $SQL .= 'ORDER BY printOrder ';
- return $this->dbDriver->GetAll($SQL);
- }
- private function GetDocFields($docId,$path)
- {
- $returnFields = $this->GetReturnFields($path);
- $SELECT = NULL;
- $FROM = NULL;
- $WHERE = NULL;
- foreach($returnFields as $key=>$field)
- {
- if($SELECT == NULL)
- $SELECT = "SELECT ";
- else
- $SELECT .= ',';
- $SELECT .= "t$key.".$field['fieldName'];
- if($FROM == NULL)
- $FROM = ' FROM ';
- else
- $FROM .= ',';
- $FROM .= $field['tableName']." t$key";
- if($WHERE == NULL)
- $WHERE = ' WHERE ';
- else
- $WHERE .= ' AND ';
- if($field['tableName']=='LIB_Node')
- $WHERE .= "t$key.nodeId='$docId'";
- else
- $WHERE .= "t$key.docId='$docId'";
- }
- $SQL = "$SELECT $FROM $WHERE";
- return $this->dbDriver->GetRow($SQL);
- }
- protected function LoadSearchDefs(& $params)
- {
- // each folder represents a search object, which has multiple tables
- // searches search object and the tables associated to each one
- // (folderTables)
- $SQL = 'SELECT DISTINCT (ft.id), ft.tableName, ft.printOrder ';
- $SQL .= 'FROM LIB_Folder f, LIB_FolderTables ft WHERE (';
- foreach($params['path'] as $key=>&$path)
- {
- if($key>0)
- $SQL .= ' OR ';
- if($params['recursiveSearch'])
- $SQL .= "path LIKE '".$path."%' ";
- else
- $SQL .= "path = '".$path."' ";
- }
- $SQL .= ') AND f.folderTables=ft.id ';
- $SQL .= 'ORDER BY ft.id, ft.printOrder ';
- $folderTables = $this->dbDriver->GetAll($SQL);
- if(count($folderTables)==0)
- throw new AV_Exception(INVALID_PATH, $this->lang);
- // creates temporary table for storing results
- if($params['tempTable'])
- {
- $params['tableName'] = uniqid('LIB_SearchResult_',false);
- $SQL = 'CREATE TEMPORARY TABLE ' . $params['tableName'];
- $SQL .= '(docId INTEGER UNSIGNED NOT NULL';
- $SQL .= ',folderId INTEGER UNSIGNED NOT NULL';
- $SQL .= ',folderTables INTEGER UNSIGNED NOT NULL';
- $SQL .= ',path VARCHAR(255) NOT NULL';
- $SQL .= ',matches INTEGER UNSIGNED NOT NULL';
- $SQL .= ',fixedOrder INTEGER UNSIGNED NOT NULL';
- }
- $params['foundOrderBy'] = false;
- $params['searchTables'] = array();
- $params['searchFields'] = array();
- // loads LIB_Node fields
- $fieldsDef = $this->nodeTable->LoadFieldsDef();
- $params['searchTables']['LIB_Node'] = array();
- $params['searchTables']['LIB_Node']['tableRef'] = 'docNode';
- foreach($fieldsDef as $def)
- $this->GetSearchField('LIB_Node',$this->nodeTable,$def,$params);
- // load LIB_Document fields
- $fieldsDef = $this->docMainTable->LoadFieldsDef();
- $params['searchTables']['LIB_Document'] = array();
- $params['searchTables']['LIB_Document']['tableRef'] = 'doc';
- foreach($fieldsDef as $def)
- $this->GetSearchField('LIB_Document',$this->docMainTable,$def,$params);
- $searchCriteria = $params['searchCriteria'];
- $exclusionFilters = $params['exclusionFilters'];
- $returnFields = $params['returnFields'];
- $searchCriteriaCtrl = $searchCriteria;
- $exclusionFiltersCtrl = $exclusionFilters;
- $returnFieldsCtrl = $returnFields;
- // load folderTables fields
- $tableNum = 0;
- $id = NULL;
- foreach($folderTables as $folder)
- {
- $tableName = $folder['tableName'];
- if($id != NULL && $id != $folder['id'])
- {
- if($params['searchCriteria'] != '*')
- $searchCriteriaCtrl = array_intersect($searchCriteriaCtrl,
- $params['searchCriteria']);
- $exclusionFiltersCtrl = array_intersect_assoc($exclusionFiltersCtrl,
- $params['exclusionFilters']);
- $returnFieldsCtrl = array_intersect($returnFieldsCtrl,
- $params['returnFields']);
- $params['searchCriteria'] = $searchCriteria;
- $params['exclusionFilters'] = $exclusionFilters;
- $params['returnFields'] = $returnFields;
- }
- $id = $folder['id'];
- // load table fields if not done yet
- if(!isset($params['searchTables'][$tableName]))
- {
- $tableObj = new FORM_DynTable($tableName, $this->module);
- $fieldsDef = $tableObj->LoadFieldsDef();
- $params['searchTables'][$tableName] = array();
- $params['searchTables'][$tableName]['tableRef'] = 't'.$tableNum++;
- foreach($fieldsDef as $def)
- $this->GetSearchField($tableName,$tableObj,$def,$params);
- }
- $params['searchObjs'][$id]['returnFields'] =
- array_merge((array)$params['searchObjs'][$id]['returnFields'],
- (array)$params['searchTables'][$tableName]['returnFields']);
- $params['searchObjs'][$id]['returnFieldsRefs'] =
- array_merge((array)$params['searchObjs'][$id]['returnFieldsRefs'],
- (array)$params['searchTables'][$tableName]['returnFieldsRefs']);
- $params['searchObjs'][$id]['exclusionFilters'] =
- array_merge((array)$params['searchObjs'][$id]['exclusionFilters'],
- (array)$params['searchTables'][$tableName]['exclusionFilters']);
- $params['searchObjs'][$id]['searchCriteria'] =
- array_merge((array)$params['searchObjs'][$id]['searchCriteria'],
- (array)$params['searchTables'][$tableName]['searchCriteria']);
- $tableRef = $tableName . ' ';
- $tableRef .= $params['searchTables'][$tableName]['tableRef'];
- $params['searchObjs'][$id]['tables'][] = $tableRef;
- $params['searchObjs'][$id]['tables'] =
- array_merge($params['searchObjs'][$id]['tables'],
- (array)$params['searchTables'][$tableName]['tables']);
-
- $tablesWhere = 'docLink.docId=';
- $tablesWhere .= $params['searchTables'][$tableName]['keyField'];
- $params['searchObjs'][$id]['tablesWhere'][] = $tablesWhere;
- $params['searchObjs'][$id]['tablesWhere'] =
- array_merge($params['searchObjs'][$id]['tablesWhere'],
- (array)$params['searchTables'][$tableName]['tablesWhere']);
- if($params['searchTables'][$tableName]['foundOrderBy'])
- {
- $params['searchObjs'][$id]['foundOrderBy'] = true;
- $params['searchObjs'][$id]['orderByRef'] = $params['orderByRef'];
- }
- }
- if($params['searchCriteria'] != '*')
- $searchCriteriaCtrl = array_intersect($searchCriteriaCtrl,
- $params['searchCriteria']);
- $exclusionFiltersCtrl = array_intersect_assoc($exclusionFiltersCtrl,
- $params['exclusionFilters']);
- $returnFieldsCtrl = array_intersect($returnFieldsCtrl,
- $params['returnFields']);
- if($params['tempTable'])
- {
- if(count($params['searchFields']>0))
- $SQL .= ','.implode(',',$params['searchFields']);
- $SQL .= ')';
- }
- // consist order by
- if(!$params['foundOrderBy'])
- {
- switch($params['orderBy'])
- {
- case 'matches':
- break;
- case 'fixedOrder':
- $params['orderByRef'] = 'docLink.fixedOrder';
- break;
- default:
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'orderBy',
- 'orderBy'=>$params['orderBy']));
- }
- }
- if(count($returnFieldsCtrl) > 0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'returnFields',
- 'returnFields'=>$returnFieldsCtrl,
- 'returnFieldsFound'=>$params['returnFieldsFound']));
- if($params['searchCriteria'] != '*' &&
- count($searchCriteriaCtrl) > 0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'searchCriteria',
- 'value'=>$params['searchCriteria']));
- if(count($exclusionFiltersCtrl) > 0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'exclusionFilters',
- 'value'=>$params['exclusionFilters']));
- if($params['tempTable'])
- $this->dbDriver->ExecSQL($SQL);
- }
- private function GetSearchField($tableName,$tableObj,$def,&$params)
- {
- $tableRef = $params['searchTables'][$tableName]['tableRef'];
- $fieldRef = $tableRef . '.' . $def['fieldName'];
- if($def['keyField'] == '1')
- $params['searchTables'][$tableName]['keyField'] = $fieldRef;
- if(//strpos($def['accessMode'],'r') === false ||
- ($def['type'] != 'dummy' &&
- $def['type'] != 'hidden' &&
- $def['type'] != 'text' &&
- $def['type'] != 'textArea' &&
- $def['type'] != 'htmlArea' &&
- $def['type'] != 'langLabel' &&
- $def['type'] != 'langTextArea' &&
- $def['type'] != 'langHtmlArea' &&
- $def['type'] != 'select' &&
- $def['type'] != 'selectMult' &&
- $def['type'] != 'selectMultiple' &&
- $def['type'] != 'radio' &&
- $def['type'] != 'readOnlySelect' &&
- $def['type'] != 'date' &&
- $def['type'] != 'datetime' &&
- $def['type'] != 'boolean' &&
- $def['type'] != 'accessRight' &&
- $def['type'] != 'integer' &&
- $def['type'] != 'float' &&
- $def['type'] != 'currency' &&
- $def['type'] != 'percent' &&
- $def['type'] != 'fileList' &&
- $def['type'] != 'cnpj' &&
- $def['type'] != 'cpf' &&
- $def['type'] != 'cep' &&
- $def['type'] != 'objectList' ))
- return;
- if($params['orderBy'] == $def['fieldName'])
- {
- $params['orderByRef'] = $tableRef . '.' .$def['fieldName'];
- $params['foundOrderBy'] = true;
- $params['searchTables'][$tableName]['foundOrderBy'] = true;
- }
- $optFieldRef = NULL;
- // sets searchCriteria
- $key = array_search($def['fieldName'],$params['searchCriteria']);
- if($key !== false && $key !== NULL || $params['searchCriteria']=='*')
- {
- switch($def['type'])
- {
- default:
- $params['searchTables'][$tableName]['searchCriteria'][] = $fieldRef;
- break;
- case 'select':
- case 'readOnlySelect':
- case 'radio':
- $this->GetSelectField($tableName, $tableObj, $def, $tableRef,
- $fieldRef, $params, $optFieldRef);
- $params['searchTables'][$tableName]['searchCriteria'][] = $optFieldRef;
- break;
- case 'langLabel':
- case 'langTextArea':
- case 'langHtmlArea':
- $this->GetLangField($tableName, $def, $fieldRef, $params,$optFieldRef,
- $def['type']!='langLabel');
- $params['searchTables'][$tableName]['searchCriteria'][] = $optFieldRef;
- break;
- case 'fileList':
- case 'objectList':
- break;
- }
- if($params['searchCriteria']!='*')
- unset($params['searchCriteria'][$key]);
- }
- // sets exclusionFilters
- if(isset($params['exclusionFilters'][$def['fieldName']]))
- {
- switch($def['type'])
- {
- default:
- $params['searchTables'][$tableName]['exclusionFilters'][$fieldRef]=
- $params['exclusionFilters'][$def['fieldName']];
- break;
- case 'langLabel':
- if($optFieldRef == NULL)
- $this->GetLangField($tableName,$def,$fieldRef,$params,$optFieldRef,
- $def['type']!='langLabel');
- $params['searchTables'][$tableName]['exclusionFilters'][$optFieldRef]=
- $params['exclusionFilters'][$def['fieldName']];
- break;
- }
- unset($params['exclusionFilters'][$def['fieldName']]);
- }
- // sets returnFields
- // result table needs only fields on returnFields or orderBy
- $key = array_search($def['fieldName'],$params['returnFields']);
- if($key !== false && $key !== NULL ||
- $params['orderBy'] == $def['fieldName'])
- {
- switch($def['type'])
- {
- case 'integer':
- case 'text':
- case 'hidden':
- case 'dummy':
- if(!isset($params['searchFields'][$def['fieldName']]))
- if($def['consistType']=='integer')
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' INTEGER UNSIGNED';
- else
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' VARCHAR('.$def['size'].')';
-
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'htmlArea': case 'textArea':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' TEXT';
-
- if($this->dbDriver->type=='oracle')
- $params['clobFields'][] = $def['fieldName'];
- $params['searchTables'][$tableName]['returnFields'][] = $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'select':
- case 'readOnlySelect':
- case 'radio':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' '.$this->GetDBFieldType($tableName,$def['fieldName']);
- if(!isset($params['searchFields'][$def['fieldName'].'Text']))
- $params['searchFields'][$def['fieldName'].'Text'] =
- $def['fieldName'].'Text VARCHAR(255)';
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- if($optFieldRef == NULL)
- $this->GetSelectField($tableName, $tableObj, $def, $tableRef,
- $fieldRef, $params, $optFieldRef);
- $returnField = $optFieldRef . ' as ' . $def['fieldName'].'Text';
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'].'Text';
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName'].'Text'] =
- $returnField;
- break;
- case 'selectMult':
- case 'selectMultiple':
- break;
- case 'date':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName']." DATE";
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'datetime':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName']." DATETIME";
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'langLabel':
- case 'langTextArea':
- case 'langHtmlArea':
- if(!isset($params['searchFields'][$def['fieldName']]))
- if($def['type'] == 'langLabel')
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' VARCHAR(255)';
- else
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' TEXT';
- if($optFieldRef == NULL)
- $this->GetLangField($tableName, $def, $fieldRef, $params,
- $optFieldRef, $def['type']!='langLabel');
- $returnField = $optFieldRef .' as ' . $def['fieldName'];
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] =
- $returnField;
- break;
- case 'boolean':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' CHAR(1)';
-
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'accessRight':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' CHAR(2)';
-
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
-
- case 'currency':
- case 'float':
- case 'percent':
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' DOUBLE';
-
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'fileList':
- if($params['detailedFileList'])
- break;
- if(!isset($params['searchFields'][$def['fieldName']]))
- $params['searchFields'][$def['fieldName']] =
- $def['fieldName'].' VARCHAR(255)';
- $params['searchTables'][$tableName]['returnFields'][] =
- $def['fieldName'];
- $fieldRef = "(SELECT GROUP_CONCAT(fileId ORDER BY idx) ";
- $fieldRef .= 'FROM LIB_ContentFile ci ';
- $fieldRef .= "WHERE tableName='$tableName' ";
- $fieldRef .= "AND fieldName='".$def['fieldName']."' ";
- $fieldRef .= 'AND ci.nodeId=doc.docId GROUP BY tableName, fieldName, nodeId) as ';
- $fieldRef .= $def['fieldName'];
- $params['searchTables'][$tableName]['returnFieldsRefs'][$def['fieldName']] = $fieldRef;
- break;
- case 'objectList':
- break;
- default:
- $field = ($params['orderBy'] == $def['fieldName'])?
- 'orderBy':'returnFields';
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>$field,
- 'addMsg'=>" ($field)",
- 'field'=>$def));
- }
- if(($key !== false && $key !== NULL ||
- $params['orderBy'] == $def['fieldName']) &&
- !in_array($def['fieldName'],$params['dateFields']) &&
- !in_array($def['fieldName'],$params['returnFieldsFound']))
- {
- if($def['type'] == 'date' || $def['type'] == 'datetime')
- {
- $params['returnFieldsFound'][$def['fieldName']] = $def['fieldName'];
- $params['dateFields'][] = $def['fieldName'];
- $params['resultGroupByFields'][] = $def['fieldName'];
- }
- elseif($def['type'] == 'objectList')
- {
- $objectListField = array();
- $objectListField['fieldName'] = $def['fieldName'];
- $objectListField['tableName'] = $tableName;
- $params['objectListFields'][] = $objectListField;
- }
- elseif($def['type']=='fileList' && $params['detailedFileList'])
- {
- $fileListFields = array();
- $fileListFields['fieldName'] = $def['fieldName'];
- $fileListFields['tableName'] = $tableName;
- $params['fileListFields'][] = $fileListFields;
- }
- elseif($def['type']=='selectMult' || $def['type']=='selectMultiple')
- {
- $selectMultField = array();
- $selectMultField['fieldName'] = $def['fieldName'];
- $selectMultField['tableName'] = $tableName;
- $selectMultField['selectFieldInfo'] = $tableObj->GetSelectFieldInfo($def['fieldName']);
- $params['selectMultFields'][] = $selectMultField;
- }
- else
- {
- if($def['type'] == 'select' || $def['type'] == 'readOnlySelect' ||
- $def['type'] == 'radio')
- {
- $params['returnFieldsFound'][$def['fieldName'].'Text'] = $def['fieldName'].'Text';
- $params['resultGroupByFields'][] = $def['fieldName'].'Text';
- }
- elseif($def['type'] == 'float' || $def['type'] == 'percent' || $def['type'] == 'currency')
- $params['floatFields'][] = $def['fieldName'];
-
- $params['returnFieldsFound'][$def['fieldName']] = $def['fieldName'];
- $params['resultGroupByFields'][] = $def['fieldName'];
- }
- $params['returnFieldsLabels'][] = $def['labelId'];
- if($key !== false && $key !== NULL)
- unset($params['returnFields'][$key]);
- }
- }
- }
- private function GetDBFieldType($tableName,$fieldName)
- {
- $field = $this->dbDriver->GetRow("DESC $tableName $fieldName");
- return $field['Type'];
- }
- private function GetLangField($tableName, $def, $fieldRef, &$params,
- &$optFieldRef,$textLabel = false)
- {
- $langTableRef = $def['fieldName']."_label";
- $langTable = ($textLabel ? 'LANG_Text ':'LANG_Label '). $langTableRef;
- $params['searchTables'][$tableName]['tables'][] = $langTable;
- $tablesWhere = "$fieldRef=$langTableRef.labelId";
- $params['searchTables'][$tableName]['tablesWhere'][] = $tablesWhere;
- $tablesWhere = "$langTableRef.lang='".$this->lang."'";
- $params['searchTables'][$tableName]['tablesWhere'][] = $tablesWhere;
- $optFieldRef = "$langTableRef.value";
- }
- private function GetSelectField($tableName, &$tableObj, $def, $tableRef,
- $fieldRef, &$params, &$optFieldRef)
- {
- // get select field info
- $selectFieldInfo = $tableObj->GetSelectFieldInfo($def['fieldName']);
- // sub-select to return optFieldRef for select text value
- $optFieldRef = '(SELECT ';
- if($selectFieldInfo['optionTableValue'] == NULL)
- $optFieldRef .= 'label.value';
- else
- $optFieldRef .= 'opt.'.$selectFieldInfo['optionTableValue'];
- $optFieldRef .= ' FROM '.$selectFieldInfo['optionTable'] . ' opt';
- if($selectFieldInfo['optionTableValue'] == NULL)
- $optFieldRef .= ', LANG_Label label';
- $optFieldRef .= " WHERE $fieldRef=opt.";
- $optFieldRef .= $selectFieldInfo['optionTableKey'];
- if($selectFieldInfo['optionTableValue'] == NULL)
- $optFieldRef .= " AND opt.name=label.labelId";
- $optFieldRef .= ')';
- return $optFieldRef;
- }
- //--Method: SearchTable
- //--Desc: Search table
- private function SearchObject(& $params, $obj)
- {
- $tables = ','.implode(',',$obj['tables']);
- $tablesWhere = ' AND '.implode(' AND ',$obj['tablesWhere']);
- $WHERE = NULL;
- $MATCH = NULL;
- // torna busca case insensitive para oracle
- $preLike = '';
- $posLike = '';
- if($this->dbDriver->type=='oracle')
- {
- $preLike = 'LOWER(';
- $posLike = ')';
- }
- foreach($params['filter'] as $key => $fulltext)
- {
- foreach($obj['searchCriteria'] as $criteria)
- {
- $criteria = $preLike.$criteria.$posLike;
- if($WHERE !== NULL)
- $WHERE .= ' OR ';
- $WHERE .= "$criteria LIKE '".$fulltext."%' OR ";
- $WHERE .= "$criteria LIKE '%".$fulltext."' OR ";
- $WHERE .= "$criteria LIKE '%".$fulltext."%' OR ";
- $WHERE .= "$criteria LIKE '".$fulltext."' ";
- if($MATCH !== NULL)
- $MATCH .= ' + ';
- $MATCH .= "IF($criteria LIKE '".$fulltext." %' OR ";
- $MATCH .= "$criteria LIKE '% ".$fulltext."' OR ";
- $MATCH .= "$criteria LIKE '% ".$fulltext." %' OR ";
- $MATCH .= "$criteria LIKE '".$fulltext."',1,0)";
- $MATCH .= "+IF($criteria LIKE '".$fulltext."%' OR ";
- $MATCH .= "$criteria LIKE '%".$fulltext."' OR ";
- $MATCH .= "$criteria LIKE '%".$fulltext."%',1,0)";
- $MATCH .= "+IF($criteria LIKE '".$fulltext."',1,0)";
- }
- }
- if($MATCH !== NULL)
- $MATCH = "($MATCH) as matches";
- $PATH = '(';
- foreach($params['path'] as $key=>&$path)
- {
- if($key>0)
- $PATH .= ' OR ';
- if($params['recursiveSearch'])
- $PATH .= "path LIKE '".$path."%' ";
- else
- $PATH .= "path = '".$path."' ";
- }
- $PATH .= ')';
- $returnFields = "";
- $returnFieldsRefs = "";
- if($params['tempTable'])
- {
- $returnFields = implode(',', $obj['returnFields']);
- $returnFieldsRefs = implode(',',$obj['returnFieldsRefs']);
- $SQL = 'INSERT INTO '.$params['tableName'];
- $SQL .= '(docId,folderId,folderTables,';
- $SQL .= "path,matches,fixedOrder,$returnFields) ";
- }
- else
- {
- foreach($params['returnFieldsFound'] as $fieldName=>$fieldsRef)
- {
- if($returnFieldsRefs!="")
- $returnFieldsRefs .= ',';
- if(isset($obj['returnFieldsRefs'][$fieldName]))
- $returnFieldsRefs .= $obj['returnFieldsRefs'][$fieldName];
- else
- $returnFieldsRefs .= 'NULL as '.$fieldName;
- }
- }
-
- $SQL .= 'SELECT doc.docId,docLink.folderId,folderTables,path,';
- if($MATCH != NULL)
- $SQL .= $MATCH;
- else
- $SQL .= '0 as matches';
- $SQL .= ",docLink.fixedOrder,$returnFieldsRefs";
- $SQL .= ' FROM ';
- if($this->dbDriver->type=='oracle')
- {
- $SQL .= '(SELECT * FROM ';
- $SQL .= '(SELECT dl.docId,dl.folderId,dl.fixedOrder,path,folderTables,';
- $SQL .= 'ROW_NUMBER() OVER (PARTITION BY docId ORDER BY docId) as rn ';
- $SQL .= 'FROM LIB_DocumentLink dl, LIB_Folder f ';
- $SQL .= 'WHERE dl.folderId = f.folderId ';
- $SQL .= 'AND '.$PATH;
- $SQL .= ') WHERE rn=1 ';
- $SQL .= ') docLink,';
- }
- else
- $SQL .= 'LIB_DocumentLink docLink,LIB_Folder p_folder,';
- $SQL .= 'LIB_Node folderNode'.$tables;
- $SQL .= ' WHERE folderNode.nodeId = docLink.folderId ';
- if($this->dbDriver->type!='oracle')
- $SQL .= 'AND '.$PATH.' AND p_folder.folderId = docLink.folderId ';
- $SQL .= $tablesWhere;
- $SQL .= " AND ";
- if(isset($params['memberData']['userId']))
- {
- if(count($params['memberGroups'])==0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'memberGroups'));
- $groups = implode(',',$params['memberGroups']);
- # check folder permission
- $SQL .= 'IF(folderNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(folderNode.userRight,'r'),";
- $SQL .= "IF(folderNode.groupId IN ($groups),";
- $SQL .= "INSTR(folderNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=folderNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(folderNode.otherRight,'r'))))<>0 ";
- # check node permission
- $SQL .= ' AND ';
- $SQL .= 'IF(docNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(docNode.userRight,'r'),";
- $SQL .= "IF(docNode.groupId IN ($groups),";
- $SQL .= "INSTR(docNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=docNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(docNode.otherRight,'r'))))<>0 ";
- }
- else
- {
- $SQL .= "INSTR(folderNode.otherRight,'r')<>0 ";
- $SQL .= "AND INSTR(docNode.otherRight,'r')<>0 ";
- }
- if($WHERE !== NULL)
- $SQL .= "AND ($WHERE) ";
- $SQL .= $this->GetExclusionFiltersSQL($obj['exclusionFilters']);
- if($this->dbDriver->type!='oracle')
- $SQL .= 'GROUP BY doc.docId ';
- $SQL .= 'ORDER BY ' . (isset($obj['orderByRef'])?$obj['orderByRef']:$params['orderBy']);
- if($params['orderBy'] == 'matches')
- $SQL .= ($params['order'] ? ' DESC' : ' ASC');
- else
- $SQL .= ($params['order'] ? ' ASC' : ' DESC');
- if($params['tempTable'])
- {
- $SQL .= ',docId LIMIT ' . HALF_SEARCH_LIMIT;
- $this->dbDriver->ExecSQL($SQL);
- }
- else
- $params['query'][] = $SQL;
- }
- //--Method: SearchKeywords
- //--Desc: Search keywords
- protected function SearchKeywords(& $params, $obj)
- {
- $tables = ','.implode(',',$obj['tables']);
- $tablesWhere = ' AND '.implode(' AND ',$obj['tablesWhere']);
- $PATH = '(';
- foreach($params['path'] as $key=>&$path)
- {
- if($key>0)
- $PATH .= ' OR ';
- if($params['recursiveSearch'])
- $PATH .= "path LIKE '".$path."%' ";
- else
- $PATH .= "path = '".$path."' ";
- }
- $PATH .= ')';
- $WHERE = NULL;
- foreach($params['filter'] as $key => $keyword)
- {
- if($WHERE !== NULL)
- $WHERE .= ' OR ';
- $WHERE .= "keyword = '$keyword' ";
- }
- if($params['tempTable'])
- {
- $returnFields = implode(',',$obj['returnFields']);
- $returnFieldsRefs = implode(',',$obj['returnFieldsRefs']);
- $SQL = 'INSERT INTO '.$params['tableName'];
- $SQL .= '(docId,folderId,folderTables,';
- $SQL .= "path,matches,fixedOrder,$returnFields) ";
- }
- else
- {
- foreach($params['returnFieldsFound'] as $fieldName=>$fieldsRef)
- {
- if($returnFieldsRefs!="")
- $returnFieldsRefs .= ',';
- if(isset($obj['returnFieldsRefs'][$fieldName]))
- $returnFieldsRefs .= $obj['returnFieldsRefs'][$fieldName];
- else
- $returnFieldsRefs .= 'NULL as '.$fieldName;
- }
- }
-
- $SQL .= 'SELECT docLink.docId,docLink.folderId,folderTables,path,';
- if($this->dbDriver->type=='oracle')
- $SQL .= 'matches, ';
- else
- {
- $SQL .= 'COUNT(DISTINCT m.docId, m.keyword)*3 ';
- $SQL .= 'as matches, ';
- }
- $SQL .= "docLink.fixedOrder,$returnFieldsRefs ";
- $SQL .= 'FROM ';
- if($this->dbDriver->type=='oracle')
- {
- $SQL .= '(SELECT * FROM ';
- $SQL .= '(SELECT dl.docId,dl.folderId,dl.fixedOrder,path,folderTables,';
- $SQL .= 'ROW_NUMBER() OVER (PARTITION BY docId ORDER BY docId) as rn ';
- $SQL .= 'FROM LIB_DocumentLink dl, LIB_Folder f ';
- $SQL .= 'WHERE dl.folderId = f.folderId ';
- $SQL .= 'AND '.$PATH;
- $SQL .= ') WHERE rn=1 ';
- $SQL .= ') docLink,';
- $SQL .= '(SELECT COUNT(*)*3 as matches, docId FROM ';
- $SQL .= '(SELECT DISTINCT docId,keyword FROM LIB_Keyword k ';
- $SQL .= 'WHERE '.$WHERE;
- $SQL .= ')dk GROUP BY docId) m, ';
- }
- else
- $SQL .= 'LIB_DocumentLink docLink,LIB_Folder folder,LIB_Keyword m,';
- $SQL .= 'LIB_Node folderNode ' . $tables;
- $SQL .= ' WHERE folderNode.nodeId = docLink.folderId ';
- $SQL .= 'AND docLink.docId = m.docId ';
- if($this->dbDriver->type!='oracle')
- {
- $SQL .= 'AND '.$PATH.' AND folder.folderId = docLink.folderId ';
- }
- $SQL .= $tablesWhere;
- $SQL .= " AND ";
- if(isset($params['memberData']['userId']))
- {
- if(count($params['memberGroups'])==0)
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'memberGroups'));
- $groups = implode(',',$params['memberGroups']);
- # check folder permission
- $SQL .= 'IF(folderNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(folderNode.userRight,'r'),";
- $SQL .= "IF(folderNode.groupId IN ($groups),";
- $SQL .= "INSTR(folderNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=folderNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(folderNode.otherRight,'r'))))<>0 ";
- # check node permission
- $SQL .= ' AND ';
- $SQL .= 'IF(docNode.userId='.$params['memberData']['userId'].',';
- $SQL .= "INSTR(docNode.userRight,'r'),";
- $SQL .= "IF(docNode.groupId IN ($groups),";
- $SQL .= "INSTR(docNode.groupRight,'r'),";
- $SQL .= "IF((SELECT SUM(IF(ngr.groupId IN ($groups),";
- $SQL .= "INSTR(ngr.groupRight,'r'),0)) FROM LIB_NodeGroupRights ngr ";
- $SQL .= "WHERE ngr.nodeId=docNode.nodeId)<>0,1, ";
- $SQL .= "INSTR(docNode.otherRight,'r'))))<>0 ";
- }
- else
- {
- $SQL .= "INSTR(folderNode.otherRight,'r')<>0 ";
- $SQL .= "AND INSTR(docNode.otherRight,'r')<>0 ";
- }
-
- if($this->dbDriver->type!='oracle' && $WHERE !== NULL)
- $SQL .= "AND ($WHERE) ";
- $SQL .= $this->GetExclusionFiltersSQL($obj['exclusionFilters']);
- if($this->dbDriver->type!='oracle')
- $SQL .= 'GROUP BY doc.docId ';
- $SQL .= 'ORDER BY ' . (isset($obj['orderByRef'])?$obj['orderByRef']:$params['orderBy']);
- if($params['orderBy'] == 'matches')
- $SQL .= ($params['order'] ? ' DESC' : ' ASC');
- else
- $SQL .= ($params['order'] ? ' ASC' : ' DESC');
- if($params['tempTable'])
- {
- $SQL .= ',docId LIMIT ' . HALF_SEARCH_LIMIT;
- $this->dbDriver->ExecSQL($SQL);
- }
- else
- $params['query'][] = $SQL;
- }
- //--Method: PrepareFilters
- //--Desc: Separetes filter in an array and replaces * to %
- private function PrepareFilter($filter)
- {
- if($filter === NULL || $filter === '')
- return NULL;
- // to lower case
- $filter = mb_strtolower($filter);
- // isolates full written filter, without quotes and double spaces
- $fullFilter = str_replace("\"", '', $filter);
- $fullFilter = addslashes($fullFilter);
- while(mb_strpos($fullFilter, ' ') !== false)
- $fullFilter = str_replace(' ', ' ', $fullFilter);
-
- // separates phrases
- $filter = explode("\"", $filter);
- foreach($filter as $pos => $chunk)
- {
- $chunk = addslashes($chunk);
-
- if(($pos % 2 == 1) && ($pos<(count($filter)-1)))
- {
- // phrase
- if($chunk != "")
- $ret[] = $chunk;
- }
- else
- {
- // single words
- // eliminate double spaces
- while(mb_strpos($chunk, ' ') !== false)
- $chunk = str_replace(' ', ' ', $chunk);
- $chunk = trim($chunk);
- if($chunk != "")
- // prepare filters
- $ret = array_merge((array)$ret, (array)explode(' ', $chunk));
- }
- }
- $ret[] = $fullFilter;
- return $ret;
- }
- protected function GetExclusionFiltersSQL($exclusionFilters)
- {
- if(count($exclusionFilters)<=0)
- return NULL;
- foreach($exclusionFilters as $fieldName => $field)
- {
- $SQL .= 'AND (';
- foreach($field as $key=>$exFilter)
- {
- if($key > 0)
- $SQL .= ' OR ';
-
- if($exFilter['value']===NULL)
- {
- switch($exFilter['operator'])
- {
- case '=':
- $SQL .= "$fieldName IS NULL";
- break;
- case '<>':
- $SQL .= "$fieldName IS NOT NULL";
- break;
- default:
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'exclusionFilters'));
- }
- }
- else
- {
- switch($exFilter['operator'])
- {
- case '=': case '<>': case '>': case '>=': case '<': case '<=': case 'LIKE':
- break;
- default:
- throw new AV_Exception(INVALID_FIELD, $this->lang,
- array('fieldName'=>'exclusionFilters',
- 'exclusionFilter'=>$exFilter));
- }
- $SQL .= "$fieldName ".$exFilter['operator'];
- $SQL .= " '".$exFilter['value']."'";
- }
- }
- $SQL .= ') ';
- }
- return $SQL;
- }
- //--Method: CreateDocLink
- //--Desc: Performs SQL to create document link not considering table locks.
- private function CreateDocLink($folderId, $docId, $beforeDocId = NULL)
- {
- if($this->dbDriver->type=='oracle')
- {
- $fixedOrder = 'LIB_DocumentLinkFixedOrder.NEXTVAL';
- }
- else
- {
- if($beforeDocId == NULL)
- {
- //get fixedOrder
- $SQL = 'SELECT MAX(fixedOrder) as fixedOrder FROM LIB_DocumentLink';
- $SQL .= " WHERE folderId = $folderId FOR UPDATE";
- $fixedOrder = $this->dbDriver->GetOne($SQL);
- $fixedOrder = $fixedOrder + 1;
- }
- else
- {
- $SQL = 'SELECT fixedOrder FROM LIB_DocumentLink ';
- $SQL .= "WHERE folderId='$folderId' ";
- $SQL .= 'AND fixedOrder >= (SELECT fixedOrder FROM LIB_DocumentLink ';
- $SQL .= "WHERE folderId='$folderId' AND docId='$beforeDocId') ";
- $SQL .= 'ORDER BY fixedOrder ASC ';
- $SQL .= 'FOR UPDATE ';
- $fixedOrderAfter = $this->dbDriver->GetCol($SQL);
- if(count($fixedOrderAfter)==0)
- throw new AV_Exception(NOT_FOUND, $this->lang,
- array('fieldName'=>'beforeDocId'));
- $fixedOrder = $fixedOrderAfter[0];
- $SQL = "UPDATE LIB_DocumentLink SET fixedOrder=fixedOrder+1 ";
- $SQL .= "WHERE folderId='$folderId' ";
- $SQL .= "AND fixedOrder >= '$fixedOrder' ";
- $this->dbDriver->ExecSQL($SQL);
- }
- }
- // inserts document link
- $SQL = 'INSERT INTO LIB_DocumentLink ';
- $SQL .= '(folderId, docId,fixedOrder) VALUES ';
- $SQL .= "($folderId, $docId, $fixedOrder)";
- $this->dbDriver->ExecSQL($SQL);
- }
- private function &GetThumb($tableName,$fieldName,$docId,$size,$jpegQuality,
- $maxWidth=NULL,$maxHeight=NULL,$bgColor=NULL,
- $cropRatio=NULL)
- {
- if($size!=NULL)
- {
- if($maxHeight==NULL)
- $maxHeight=$size;
- if($maxWidth==NULL)
- $maxWidth=$size;
- }
- if ($bgColor != NULL)
- {
- $bgColor = preg_replace('/[^0-9a-fA-F]/', '', (string)$bgColor);
- if($bgColor[0] == '#')
- $bgColor = substr($bgColor, 1);
- }
- $blobToFS = $this->module->pageBuilder->siteConfig->getVar('admin',
- 'blobToFS');
- $libPath = $this->module->pageBuilder->siteConfig->getVar("dirs",
- "library");
- // first, try cache
- $SQL = 'SELECT nodeId,userId,groupId,userRight,groupRight,otherRight,';
- $SQL .= 'UNIX_TIMESTAMP(creationDate) as creationDate,';
- $SQL .= 'UNIX_TIMESTAMP(node.lastChanged) as lastChanged,';
- $SQL .= "lastChangedUserId,${fieldName}FileName,${fieldName}Type,";
- $SQL .= "img.thumb as ${fieldName} ";
- $SQL .= "FROM LIB_Node node,$tableName doc,LIB_ImageThumbCache img ";
- $SQL .= "WHERE nodeId=$docId AND nodeId=doc.docId ";
- $SQL .= "AND tableName='$tableName' AND fieldName='$fieldName' ";
- $SQL .= "AND doc.docId=img.docId AND jpegQuality=$jpegQuality ";
- if($maxWidth != NULL && $maxHeight != NULL)
- $SQL .= "AND maxWidth=$maxWidth AND maxHeight=$maxHeight ";
- if($bgColor)
- $SQL .= "AND bgColor='$bgColor' ";
- if($cropRatio)
- $SQL .= "AND cropRatio='$cropRatio' ";
- $SQL .= 'AND node.lastChanged=img.lastChanged ';
- $docData = $this->dbDriver->GetRow($SQL);
- if(count($docData) > 0)
- {
- if($blobToFS)
- {
- $docData[$fieldName] = ft_file_get_contents($libPath . $docData[$fieldName]);
- if($docData[$fieldName] === false)
- throw new AV_Exception(FAILED, $this->lang,
- array('addMsg'=>' (unable to read file)',
- 'filePath'=>$libPath . $docData[$fieldName]));
- }
- return $docData;
- }
- // reads file content
- $SQL = 'SELECT nodeId,userId,groupId,userRight,groupRight,otherRight,';
- $SQL .= 'UNIX_TIMESTAMP(creationDate) as creationDate,';
- $SQL .= 'UNIX_TIMESTAMP(lastChanged) as lastChanged,';
- $SQL .= "lastChangedUserId,${fieldName},${fieldName}FileName,";
- $SQL .= "${fieldName}Type ";
- $SQL .= "FROM LIB_Node node,$tableName ";
- $SQL .= "WHERE nodeId=$docId AND nodeId=docId ";
- $SQL .= "AND ${fieldName}Type LIKE 'image/%' ";
- $SQL .= 'LOCK IN SHARE MODE ';
- $docData = $this->dbDriver->GetRow($SQL);
- if(count($docData) == 0)
- throw new AV_Exception(NOT_FOUND, $this->lang);
- $blobToFS = $this->module->pageBuilder->siteConfig->getVar('admin','blobToFS');
- $libPath = $this->module->pageBuilder->siteConfig->getVar("dirs",
- "library");
- if($blobToFS)
- {
- $docData[$fieldName] = ft_file_get_contents($libPath . $docData[$fieldName]);
- if($docData[$fieldName] === false)
- throw new AV_Exception(FAILED, $this->lang,
- array('addMsg'=>' (unable to read file)',
- 'filePath'=>$libPath . $docData[$fieldName]));
- }
- // erases old files
- $SQL = 'DELETE FROM LIB_ImageThumbCache ';
- $SQL .= "WHERE tableName='$tableName' AND fieldName='$fieldName' ";
- $SQL .= "AND docId=$docId AND jpegQuality=$jpegQuality ";
- if($maxWidth != NULL && $maxHeight != NULL)
- $SQL .= "AND maxWidth=$maxWidth AND maxHeight=$maxHeight ";
- if($bgColor)
- $SQL .= "AND bgColor='$bgColor' ";
- if($cropRatio)
- $SQL .= "AND cropRatio='$cropRatio' ";
- $this->dbDriver->ExecSQL($SQL);
- $srcImg = imagecreatefromstring($docData[$fieldName]);
- if($srcImg===FALSE)
- {
- $adminInvalidImage = $this->label->GetLabel('adminInvalidImageTag',
- $this->lang);
-
- throw new AV_Exception(FAILED, $this->lang,
- Array('addMsg'=>" ($adminInvalidImage)"));
- }
- $srcX = ImageSX($srcImg);
- $srcY = ImageSY($srcImg);
- // Ratio cropping
- $offsetX = 0;
- $offsetY = 0;
- if($cropRatio)
- {
- $cropRatioArr = explode(':', (string)$cropRatio);
- if(count($cropRatioArr) == 2)
- {
- $ratioComputed = $srcX / $srcY;
- $cropRatioComputed = (float) $cropRatioArr[0] / (float) $cropRatioArr[1];
-
- if ($ratioComputed < $cropRatioComputed)
- { // Image is too tall so we will crop the top and bottom
- $origHeight = $srcY;
- $srcY = $srcX / $cropRatioComputed;
- $offsetY = ($origHeight - $srcY) / 2;
- }
- else if ($ratioComputed > $cropRatioComputed)
- { // Image is too wide so we will crop off the left and right sides
- $origWidth = $srcX;
- $srcX = $srcY * $cropRatioComputed;
- $offsetX = ($origWidth - $srcX) / 2;
- }
- }
- }
- if($maxWidth==NULL && $maxHeight==NULL ||
- $srcX < $maxWidth && $srcY < $maxHeight)
- {
- $dstX = $srcX;
- $dstY = $srcY;
- }
- else
- {
- $dstY = $maxHeight;
- $dstX = $srcX/($srcY/$maxHeight);
- if ($dstX > $maxWidth)
- {
- $dstX = $maxWidth;
- $dstY = $srcY/($srcX/$maxWidth);
- }
- }
- //
- $dstImg = ImageCreateTrueColor($dstX,$dstY);
- switch($docData["${fieldName}Type"])
- {
- case 'image/gif':
- case 'image/x-png':
- case 'image/png':
- if (!$bgColor)
- {
- // If this is a GIF or a PNG, we need to set up transparency
- imagealphablending($dstImg, false);
- imagesavealpha($dstImg, true);
- }
- else
- {
- // Fill the background with the specified color for matting purposes
- $background = false;
- if(strlen($bgColor) == 6)
- $background = imagecolorallocate($dstImg,
- hexdec($bgColor[0].$bgColor[1]),
- hexdec($bgColor[2].$bgColor[3]),
- hexdec($bgColor[4].$bgColor[5]));
- else if (strlen($bgColor) == 3)
- $background = imagecolorallocate($dstImg,
- hexdec($bgColor[0].$bgColor[0]),
- hexdec($bgColor[1].$bgColor[1]),
- hexdec($bgColor[2].$bgColor[2]));
- if ($background)
- imagefill($dstImg, 0, 0, $background);
- }
- }
- ImageCopyResampled($dstImg,$srcImg,0,0,$offsetX,$offsetY,$dstX,$dstY,$srcX,$srcY);
- ob_start();
- switch($docData["${fieldName}Type"])
- {
- case 'image/jpeg':
- case 'image/pjpeg':
- ImageJpeg($dstImg, NULL, $jpegQuality);
- break;
- case 'image/gif':
- ImageGif($dstImg);
- break;
- case 'image/x-png':
- case 'image/png':
- ImagePng($dstImg);
- break;
- }
- $docData[$fieldName] = ob_get_contents();
- ob_end_clean();
- ImageDestroy($srcImg);
- ImageDestroy($dstImg);
- $SQL = 'INSERT INTO LIB_ImageThumbCache ';
- $SQL .= '(tableName,fieldName,docId,jpegQuality';
- if($maxWidth != NULL && $maxHeight != NULL)
- $SQL .= ',maxWidth,maxHeight';
- if($bgColor)
- $SQL .= ',bgColor';
- if($cropRatio)
- $SQL .= ',cropRatio';
- $SQL .= ",lastChanged,thumb) VALUES ";
- $SQL .= "('$tableName','$fieldName','$docId','$jpegQuality'";
- if($maxWidth != NULL && $maxHeight != NULL)
- $SQL .= ",'$maxWidth','$maxHeight'";
- if($bgColor)
- $SQL .= ",'$bgColor'";
- if($cropRatio)
- $SQL .= ",'$cropRatio'";
- $SQL .= ",FROM_UNIXTIME(".$docData['lastChanged']."),";
- if(!$blobToFS)
- {
- switch($this->dbDriver->type)
- {
- case 'mysql':
- $SQL .= "'".addslashes($docData[$fieldName])."'";
- break;
- case 'oracle':
- $SQL .= 'EMPTY_BLOB()';
- }
- $SQL .= ") ";
-
- if($this->dbDriver->type=='oracle')
- {
- $this->dbDriver->BindBlob('thumb',$docData[$fieldName]);
- $SQL .= 'RETURNING thumb INTO :thumb';
- }
- }
- else
- {
- $this->dbDriver->ExecSQL('INSERT INTO LIB_BlobFS VALUES ()');
- $blobId = $this->dbDriver->GetOne('SELECT LAST_INSERT_ID() FROM DUAL');
- if(!ft_file_put_contents($libPath . $blobId,$docData[$fieldName]))
- throw new AV_Exception(FAILED, $this->lang,
- array('addMsg'=>' (unable to save image cache)'));
- $SQL .= "'$blobId')";
- }
- $i = 0;
- do
- {
- $status = SUCCESS;
- try
- {
- $this->dbDriver->ExecSQL($SQL);
- }
- catch(Exception $e)
- {
- $status = FAILED;
- $i++;
- }
- } while($status != SUCCESS && $i < 10);
- if($status != SUCCESS)
- $this->module->PrintLog('Unable to save image cache');
- return $docData;
- }
- private function InsertKeywords($keywords, $docId = NULL)
- {
- // eliminate spaces before and after commas
- while(mb_strpos($keywords, ', ') !== false)
- $keywords = str_replace(', ', ',', $keywords);
- while(mb_strpos($keywords, ' ,') !== false)
- $keywords = str_replace(' ,', ',', $keywords);
- // correct keywords containing commas at the start and end positions
- if(mb_substr($keywords,0,1) == ',')
- $keywords = mb_substr($keywords, 1);
- if(mb_substr($keywords,- 1) == ',')
- $keywords = mb_substr($keywords, 0, mb_strlen($keywords - 1));
- $keywords = explode(',', mb_strtolower($keywords));
- // insert keywords
- $SQL = 'INSERT INTO LIB_Keyword (keyword, docId) VALUES ';
- foreach($keywords as $num => $word)
- {
- if($num != 0)
- $SQL .= ', ';
- if($docId == NULL)
- $SQL .= "('$word', LAST_INSERT_ID())";
- else
- $SQL .= "('$word', '$docId')";
- }
- $this->dbDriver->ExecSQL($SQL);
- }
- private function DuplicateKeywords($sourceId, $targetId)
- {
- // insert keywords
- $SQL = 'INSERT INTO LIB_Keyword (keyword, docId) ';
- $SQL .= "SELECT keyword, '$targetId' FROM LIB_Keyword ";
- $SQL .= "WHERE docId='$sourceId'";
- $this->dbDriver->ExecSQL($SQL);
- }
- }
- ?>