fixes #329: query the database in chunks of 200

This commit is contained in:
Thomas Mueller 2012-11-05 22:42:03 +01:00
parent 972243d564
commit 415ec58422
1 changed files with 12 additions and 10 deletions

View File

@ -116,7 +116,6 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
* @return Sabre_DAV_INode[] * @return Sabre_DAV_INode[]
*/ */
public function getChildren() { public function getChildren() {
$folder_content = OC_Files::getDirectoryContent($this->path); $folder_content = OC_Files::getDirectoryContent($this->path);
$paths = array(); $paths = array();
foreach($folder_content as $info) { foreach($folder_content as $info) {
@ -124,15 +123,18 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
} }
$properties = array_fill_keys($paths, array()); $properties = array_fill_keys($paths, array());
if(count($paths)>0) { if(count($paths)>0) {
$placeholders = join(',', array_fill(0, count($paths), '?')); $chunks = array_chunk($paths, 200, false);
$query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ?' . ' AND `propertypath` IN ('.$placeholders.')' ); foreach ($chunks as $pack) {
array_unshift($paths, OC_User::getUser()); // prepend userid $placeholders = join(',', array_fill(0, count($pack), '?'));
$result = $query->execute( $paths ); $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ?' . ' AND `propertypath` IN ('.$placeholders.')' );
while($row = $result->fetchRow()) { array_unshift($pack, OC_User::getUser()); // prepend userid
$propertypath = $row['propertypath']; $result = $query->execute( $pack );
$propertyname = $row['propertyname']; while($row = $result->fetchRow()) {
$propertyvalue = $row['propertyvalue']; $propertypath = $row['propertypath'];
$properties[$propertypath][$propertyname] = $propertyvalue; $propertyname = $row['propertyname'];
$propertyvalue = $row['propertyvalue'];
$properties[$propertypath][$propertyname] = $propertyvalue;
}
} }
} }