/** * Delete iblock by its code. * * @param string $code * * @throws MigrationException * * @return void */ protected function deleteIblockByCode($code) { $id = $this->getIblockIdByCode($code); $this->db->startTransaction(); if (!CIBlock::Delete($id)) { $this->db->rollbackTransaction(); throw new MigrationException('Ошибка при удалении инфоблока'); } $this->db->commitTransaction(); }
/** * @param resource $result Database-specific query result. * @param Connection $dbConnection Connection object. * @param \Bitrix\Main\Diag\SqlTrackerQuery $trackerQuery Helps to collect debug information. */ public function __construct($result, Connection $dbConnection = null, \Bitrix\Main\Diag\SqlTrackerQuery $trackerQuery = null) { $this->resource = $result; $this->connection = $dbConnection; $this->trackerQuery = $trackerQuery; $resultFields = $this->getFields(); if ($resultFields && $this->connection) { $helper = $this->connection->getSqlHelper(); foreach ($resultFields as $key => $type) { $converter = $helper->getConverter($resultFields[$key]); if (is_callable($converter)) { $this->converters[$key] = $converter; } } } }
/** * Convert the info block to i18n. * * @param string $propCodePublicId * @param string $propCodeLang * @param string $defaultLang * * @throws InternationalizeException * @throws \Exception */ public function convert($propCodePublicId, $propCodeLang, $defaultLang) { $rsDefaultLang = LanguageTable::query()->setFilter(['LID' => $defaultLang])->exec(); if ($rsDefaultLang->getSelectedRowsCount() <= 0) { throw new InternationalizeException([Loc::getMessage('NOTAMEDIA_I18N_IMANAGER_NOT_FOUND_LANG')]); } foreach ($this->converters as $converter) { $this->connection->startTransaction(); try { $converter->internationalize($propCodePublicId, $propCodeLang, $defaultLang); $converter->fill($propCodePublicId, $propCodeLang, $defaultLang); } catch (\Exception $e) { $this->connection->rollbackTransaction(); throw $e; } $this->connection->commitTransaction(); } }
/** * Executes a query to the database. * * - query($sql) * - query($sql, $limit) * - query($sql, $offset, $limit) * - query($sql, $binds) * - query($sql, $binds, $limit) * - query($sql, $binds, $offset, $limit) * * @param string $sql Sql query. * @param array $binds,... Array of binds. * @param int $offset,... Offset of first row returned. * @param int $limit,... Limit rows count. * * @return Result * @throws \Bitrix\Main\Db\SqlQueryException */ public function query($sql) { list($sql, $binds, $offset, $limit) = self::parseQueryFunctionArgs(func_get_args()); if (!empty($binds)) { $binds1 = $binds2 = ""; foreach ($binds as $key => $value) { if (strlen($value) > 0) { if ($binds1 != "") { $binds1 .= ","; $binds2 .= ","; } $binds1 .= $key; $binds2 .= ":" . $key; } } if ($binds1 != "") { $sql .= " RETURNING " . $binds1 . " INTO " . $binds2; } } return parent::query($sql, $binds, $offset, $limit); }
/** * Create Schema * * @return AdapterInterface */ public function createSchema() { $this->db->createTable($this->tableName, array('version' => new StringField('version'), 'name' => new StringField('name'))); return $this; }
/** * $configuration may contain following keys: * <ul> * <li>host * <li>database * <li>login * <li>password * <li>initCommand * <li>options * <li>engine * </ul> * * @param array $configuration Array of Name => Value pairs. */ public function __construct(array $configuration) { parent::__construct($configuration); $this->engine = isset($configuration['engine']) ? $configuration['engine'] : ""; }
/** * Builds the string for the SQL assignment operation of the given column. * * @param string $tableName A table name. * @param string $columnName A column name. * @param string $value A value to assign. * * @return string */ public function prepareAssignment($tableName, $columnName, $value) { $tableField = $this->connection->getTableField($tableName, $columnName); return $this->quote($columnName) . ' = ' . $this->convertToDb($value, $tableField); }
private function moveCommonElements($storageId, $rootObjectId, $iblock) { $iblockId = $iblock['ID']; $sqlHelper = $this->connection->getSqlHelper(); if ($iblock['VERSION'] == 2) { $props = $this->connection->query("SELECT * FROM b_iblock_property WHERE VERSION = 2 AND IBLOCK_ID = {$iblockId} AND CODE IN ('WEBDAV_SIZE', 'FILE', 'WEBDAV_VERSION')")->fetchAll(); $joinTable = 'b_iblock_element_prop_s' . $iblockId; $columnForFileId = $columnForSize = 'null'; $columnForVersion = '1'; foreach ($props as $prop) { switch ($prop['CODE']) { case 'WEBDAV_SIZE': $columnForSize = 'PROPERTY_' . $prop['ID']; break; case 'FILE': $columnForFileId = 'PROPERTY_' . $prop['ID']; break; case 'WEBDAV_VERSION': $columnForVersion = 'PROPERTY_' . $prop['ID']; break; } } unset($prop); if ($this->isMysql) { $sql = "\n\t\t\t\t\t\tINSERT IGNORE INTO b_disk_object (FILE_ID, SIZE, GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\t\tSELECT {$columnForFileId}, {$columnForSize}, {$columnForVersion}, child.NAME, 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\t\tINNER JOIN {$joinTable} props ON props.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tWHERE child.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t"; } elseif ($this->isOracle || $this->isMssql) { $sql = "\n\t\t\t\t\t\tINSERT INTO b_disk_object (FILE_ID, " . $this->sqlHelper->quote('SIZE') . ", GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\t\tSELECT {$columnForFileId}, {$columnForSize}, {$columnForVersion}, child.NAME, 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\t\tINNER JOIN {$joinTable} props ON props.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tWHERE child.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t\t\tAND NOT EXISTS(SELECT 'x' FROM b_disk_object WHERE NAME = child.NAME AND PARENT_ID = child.IBLOCK_SECTION_ID AND child.IBLOCK_SECTION_ID IS NOT NULL)\n\t\t\t\t\t"; } $this->connection->queryExecute($sql); $this->connection->queryExecute("\n\t\t\t\t\tINSERT INTO b_disk_object (FILE_ID, " . $this->sqlHelper->quote('SIZE') . ", GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\tSELECT {$columnForFileId}, {$columnForSize}, {$columnForVersion}, " . $this->getConcatFunction('child.ID', 'child.NAME') . ", 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\tINNER JOIN {$joinTable} props ON props.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tchild.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t\tAND NOT EXISTS(SELECT 'x' FROM b_disk_object do WHERE do.WEBDAV_ELEMENT_ID=child.ID)\n\n\t\t\t\t"); } else { if ($this->isMysql) { $sql = "\n\t\t\t\t\t\tINSERT IGNORE INTO b_disk_object (FILE_ID, SIZE, GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\t\tSELECT PROP_FILE_EL.VALUE, PROP_SIZE_EL.VALUE, " . $sqlHelper->getIsNullFunction('PPROP_VERSION_G_EL.VALUE', 1) . ", child.NAME, 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\t\tINNER JOIN b_iblock_property PROP_SIZE ON PROP_SIZE.IBLOCK_ID = child.IBLOCK_ID AND PROP_SIZE.CODE = 'WEBDAV_SIZE'\n\t\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_SIZE_EL ON PROP_SIZE_EL.IBLOCK_PROPERTY_ID = PROP_SIZE.ID AND PROP_SIZE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tINNER JOIN b_iblock_property PROP_FILE ON PROP_FILE.IBLOCK_ID = child.IBLOCK_ID AND PROP_FILE.CODE = 'FILE'\n\t\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_FILE_EL ON PROP_FILE_EL.IBLOCK_PROPERTY_ID = PROP_FILE.ID AND PROP_FILE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tLEFT JOIN b_iblock_property PROP_VERSION_G ON PROP_VERSION_G.IBLOCK_ID = child.IBLOCK_ID AND PROP_VERSION_G.CODE = 'WEBDAV_VERSION'\n\t\t\t\t\t\tLEFT JOIN b_iblock_element_property PPROP_VERSION_G_EL ON PPROP_VERSION_G_EL.IBLOCK_PROPERTY_ID = PROP_VERSION_G.ID AND PPROP_VERSION_G_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tWHERE child.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t"; } elseif ($this->isOracle || $this->isMssql) { $sql = "\n\t\t\t\t\t\tINSERT INTO b_disk_object (FILE_ID, " . $this->sqlHelper->quote('SIZE') . ", GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\t\tSELECT PROP_FILE_EL.VALUE, PROP_SIZE_EL.VALUE, " . $sqlHelper->getIsNullFunction('PPROP_VERSION_G_EL.VALUE', 1) . ", child.NAME, 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\t\tINNER JOIN b_iblock_property PROP_SIZE ON PROP_SIZE.IBLOCK_ID = child.IBLOCK_ID AND PROP_SIZE.CODE = 'WEBDAV_SIZE'\n\t\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_SIZE_EL ON PROP_SIZE_EL.IBLOCK_PROPERTY_ID = PROP_SIZE.ID AND PROP_SIZE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tINNER JOIN b_iblock_property PROP_FILE ON PROP_FILE.IBLOCK_ID = child.IBLOCK_ID AND PROP_FILE.CODE = 'FILE'\n\t\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_FILE_EL ON PROP_FILE_EL.IBLOCK_PROPERTY_ID = PROP_FILE.ID AND PROP_FILE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tLEFT JOIN b_iblock_property PROP_VERSION_G ON PROP_VERSION_G.IBLOCK_ID = child.IBLOCK_ID AND PROP_VERSION_G.CODE = 'WEBDAV_VERSION'\n\t\t\t\t\t\tLEFT JOIN b_iblock_element_property PPROP_VERSION_G_EL ON PPROP_VERSION_G_EL.IBLOCK_PROPERTY_ID = PROP_VERSION_G.ID AND PPROP_VERSION_G_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\t\tWHERE child.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t\t\tAND NOT EXISTS(SELECT 'x' FROM b_disk_object WHERE NAME = child.NAME AND PARENT_ID = child.IBLOCK_SECTION_ID AND child.IBLOCK_SECTION_ID IS NOT NULL)\n\t\t\t\t\t"; } $this->connection->queryExecute($sql); $this->connection->queryExecute("\n\t\t\t\t\tINSERT INTO b_disk_object (FILE_ID, " . $this->sqlHelper->quote('SIZE') . ", GLOBAL_CONTENT_VERSION, NAME, TYPE, CODE, STORAGE_ID, PARENT_ID, CREATE_TIME, UPDATE_TIME, CREATED_BY, UPDATED_BY, XML_ID, WEBDAV_ELEMENT_ID, WEBDAV_IBLOCK_ID)\n\t\t\t\t\tSELECT PROP_FILE_EL.VALUE, PROP_SIZE_EL.VALUE, " . $sqlHelper->getIsNullFunction('PPROP_VERSION_G_EL.VALUE', 1) . ", " . $this->getConcatFunction('child.ID', 'child.NAME') . ", 3, null, {$storageId}, " . $sqlHelper->getIsNullFunction('child.IBLOCK_SECTION_ID', $rootObjectId) . ", child.DATE_CREATE, " . $this->sqlHelper->getIsNullFunction('child.TIMESTAMP_X', 'child.DATE_CREATE') . ", " . $this->sqlHelper->getIsNullFunction('child.CREATED_BY', 0) . ", child.MODIFIED_BY, child.ID, child.ID, child.IBLOCK_ID FROM b_iblock_element child\n\n\t\t\t\t\tINNER JOIN b_iblock_property PROP_SIZE ON PROP_SIZE.IBLOCK_ID = child.IBLOCK_ID AND PROP_SIZE.CODE = 'WEBDAV_SIZE'\n\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_SIZE_EL ON PROP_SIZE_EL.IBLOCK_PROPERTY_ID = PROP_SIZE.ID AND PROP_SIZE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\tINNER JOIN b_iblock_property PROP_FILE ON PROP_FILE.IBLOCK_ID = child.IBLOCK_ID AND PROP_FILE.CODE = 'FILE'\n\t\t\t\t\tINNER JOIN b_iblock_element_property PROP_FILE_EL ON PROP_FILE_EL.IBLOCK_PROPERTY_ID = PROP_FILE.ID AND PROP_FILE_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\tLEFT JOIN b_iblock_property PROP_VERSION_G ON PROP_VERSION_G.IBLOCK_ID = child.IBLOCK_ID AND PROP_VERSION_G.CODE = 'WEBDAV_VERSION'\n\t\t\t\t\tLEFT JOIN b_iblock_element_property PPROP_VERSION_G_EL ON PPROP_VERSION_G_EL.IBLOCK_PROPERTY_ID = PROP_VERSION_G.ID AND PPROP_VERSION_G_EL.IBLOCK_ELEMENT_ID = child.ID\n\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tchild.IBLOCK_ID = {$iblockId} AND child.IBLOCK_SECTION_ID IS NULL\n\t\t\t\t\t\tAND NOT EXISTS(SELECT 'x' FROM b_disk_object do WHERE do.WEBDAV_ELEMENT_ID=child.ID)\n\n\t\t\t\t"); } }
public function setAffectedRowsCount(Connection $connection) { $this->affectedRowsCount = $connection->getAffectedRowsCount(); }
/** * Fills subtree by simple rights. * Any positive rights, which contains operation OP_READ, will fill subtree. It's unnecessary has node negative rights * and not. * @return $this */ private function fillTree() { if ($this->hasAllTasksWithOperationRead()) { $this->connection->queryExecute("\n\t\t\t\tINSERT INTO b_disk_simple_right (OBJECT_ID, ACCESS_CODE)\n\t\t\t\tSELECT DISTINCT pathchild.OBJECT_ID, r.ACCESS_CODE FROM b_disk_object_path path\n\t\t\t\t INNER JOIN b_disk_right r ON r.OBJECT_ID = path.OBJECT_ID\n\t\t\t\t INNER JOIN b_disk_object_path pathchild ON pathchild.PARENT_ID = r.OBJECT_ID\n\t\t\t\tWHERE path.PARENT_ID = {$this->objectId} AND r.NEGATIVE = 0\n\t\t\t"); } else { $ids = array(); foreach ($this->getTasksWithOperationRead() as $task) { $ids[] = (int) $task['ID']; } unset($task); if (!$ids) { return $this; } $this->connection->queryExecute("\n\t\t\t\tINSERT INTO b_disk_simple_right (OBJECT_ID, ACCESS_CODE)\n\t\t\t\tSELECT DISTINCT pathchild.OBJECT_ID, r.ACCESS_CODE FROM b_disk_object_path path\n\t\t\t\t INNER JOIN b_disk_right r ON r.OBJECT_ID = path.OBJECT_ID\n\t\t\t\t INNER JOIN b_disk_object_path pathchild ON pathchild.PARENT_ID = r.OBJECT_ID\n\t\t\t\tWHERE path.PARENT_ID = {$this->objectId} AND r.NEGATIVE = 0 AND r.TASK_ID IN (" . implode(', ', $ids) . ")\n\t\t\t"); } return $this; }
private function appendOneNegative(array $right, $hadOppositeRight = false) { $isValidNegaviteRight = $this->validateNegaviteRight($right); if (!$isValidNegaviteRight && !$hadOppositeRight) { $this->errorCollection->addOne(new Error('Invalid negative right')); return false; } //we don't have to add negative right. We must only delete old simple rights. condition($hadOppositeRight && !$isValidNegaviteRight) if ($isValidNegaviteRight) { //May we have to add record to b_disk_right in final. $right['OBJECT_ID'] = $this->object->getId(); $result = RightTable::add($right); if (!$result->isSuccess()) { $this->errorCollection->addFromResult($result); return false; } } $rightsManager = Driver::getInstance()->getRightsManager(); if (!$rightsManager->containsOperationInTask($rightsManager::OP_READ, $right['TASK_ID'])) { return true; } if (!$this->hasAlreadySimpleRight($right['ACCESS_CODE'])) { //below we already have negative rights, which deleted simple rights. return true; } //need to delete simple rights from descendants $conflictRightsInSubTree = $this->getConflictRightsInSubTree($right['ACCESS_CODE'], $right['TASK_ID']); $accessCode = $this->sqlHelper->forSql($right['ACCESS_CODE']); if (empty($conflictRightsInSubTree)) { //we have to destroy simple right from all descendants and from current OBJECT_ID if ($this->connection instanceof OracleConnection) { $this->connection->queryExecute("\n\t\t\t\t\tDELETE FROM (SELECT simple.* FROM b_disk_simple_right simple\n\t\t\t\t\t\tINNER JOIN b_disk_object_path p ON p.OBJECT_ID = simple.OBJECT_ID\n\t\t\t\t\tWHERE p.PARENT_ID = {$this->object->getId()} AND simple.ACCESS_CODE = '{$accessCode}')\n\t\t\t\t"); } else { $this->connection->queryExecute("\n\t\t\t\t\tDELETE simple FROM b_disk_simple_right simple\n\t\t\t\t\t\tINNER JOIN b_disk_object_path p ON p.OBJECT_ID = simple.OBJECT_ID\n\t\t\t\t\tWHERE p.PARENT_ID = {$this->object->getId()} AND simple.ACCESS_CODE = '{$accessCode}'\n\t\t\t\t"); } } else { $objectIds = array(); foreach ($conflictRightsInSubTree as $conflictRight) { $objectIds[] = $conflictRight['OBJECT_ID']; } unset($conflictRight); //we have to destroy simple right from all descendants and from current OBJECT_ID without nodes with conflict rights in path. if ($this->connection instanceof OracleConnection) { $this->connection->queryExecute("\n\t\t\t\t\tDELETE FROM (SELECT simple.* FROM b_disk_simple_right simple\n\t\t\t\t\t\tINNER JOIN b_disk_object_path p ON p.OBJECT_ID = simple.OBJECT_ID\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tp.PARENT_ID = {$this->object->getId()} AND simple.ACCESS_CODE = '{$accessCode}' AND\n\t\t\t\t\t\tNOT EXISTS(\n\t\t\t\t\t\t\tSELECT 'x' FROM b_disk_object_path pp\n\t\t\t\t\t\t\t\tWHERE pp.OBJECT_ID = p.OBJECT_ID AND\n\t\t\t\t\t\t\t\tpp.PARENT_ID IN (" . implode(',', $objectIds) . ") ))\n\t\t\t\t"); } else { $this->connection->queryExecute("\n\t\t\t\t\tDELETE simple FROM b_disk_simple_right simple\n\t\t\t\t\t\tINNER JOIN b_disk_object_path p ON p.OBJECT_ID = simple.OBJECT_ID\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tp.PARENT_ID = {$this->object->getId()} AND simple.ACCESS_CODE = '{$accessCode}' AND\n\t\t\t\t\t\tNOT EXISTS(\n\t\t\t\t\t\t\tSELECT 'x' FROM b_disk_object_path pp\n\t\t\t\t\t\t\t\tWHERE pp.OBJECT_ID = p.OBJECT_ID AND\n\t\t\t\t\t\t\t\tpp.PARENT_ID IN (" . implode(',', $objectIds) . ") )\n\t\t\t\t"); } } return true; }