ExecuteFunction('GetModuleInfo', 'dupe_resourceids'); foreach($table_info as $module_name => $module_info) { foreach($module_info as $module_sub_info) { $module_sub_info['Module']=$module_name; array_push($ret,$module_sub_info); } } // 2. build mega sql joining all tables in on and search resource id throught them $ado->Execute('DROP TABLE IF EXISTS '.GetTablePrefix().'DupeRIDs'); $sql = Array(); $sql_template = 'SELECT %1$s AS ID, \'%1$s\' AS IDField, ResourceId, \'%2$s\' AS TableName, \'%3$s\' AS Module FROM '.GetTablePrefix().'%2$s '; foreach($ret as $sql_part) { $sql[]=sprintf($sql_template,$sql_part['IDField'],$sql_part['Table'],$sql_part['Module']); } $module_table=GetTablePrefix().'DupeRIDs '; $sql='CREATE TABLE '.$module_table.' '.implode(' UNION ',$sql); $ado->Execute($sql); $sql='SELECT ResourceId FROM '.$module_table.' GROUP BY ResourceId HAVING COUNT(*)>1'; $duplicate_rids=$ado->GetCol($sql); if(!$duplicate_rids) return; $sql=' SELECT * FROM '.$module_table.' WHERE ResourceId IN ('.implode(',',$duplicate_rids).') ORDER BY CASE TableName WHEN \'Products\' THEN 1 WHEN \'Link\' THEN 2 WHEN \'News\' THEN 3 WHEN \'Topic\' THEN 4 WHEN \'Category\' THEN 5 WHEN \'PortalGroup\' THEN 6 WHEN \'PortalUser\' THEN 7 ELSE 99 END, TableName,ResourceId,ID'; $rs=$ado->Execute($sql); $originals=Array(); // this are originals $dupes=Array(); // this is dupes $update_tpl='UPDATE '.GetTablePrefix().'%s SET ResourceId=%s WHERE %s=%s'; $user_custom_fields = implode(',', $ado->GetCol('SELECT CustomFieldId FROM '.GetTablePrefix().'CustomField WHERE Type = 6')); $non_category_items = Array(); while(!$rs->EOF) { $rec=&$rs->fields; if( isset($originals[$rec['ResourceId']]) ) { // this is dupe $next_id = GetNextResourceId(); $update_sql = sprintf($update_tpl,$rec['TableName'],$next_id,$rec['IDField'],$rec['ID']); $ado->Execute($update_sql); $dupes[$next_id] = $rec['ID']; if($rec['Module'] == 'In-Portal') $non_category_items[$next_id] = $rec['ID']; if ($rec['TableName'] == 'PortalUser' && $user_custom_fields) { $update_custom = 'UPDATE '.GetTablePrefix().'CustomMetaData SET ResourceId = '.$next_id.' WHERE ResourceId = '.$rec['ResourceId'].' AND CustomFieldId IN ( '.$user_custom_fields.' )'; $ado->Execute($update_custom); } } else { // this is original $originals[ $rec['ResourceId'] ]=$rec['ID']; } $rs->MoveNext(); } if($dupes) { // find lost+found category global $objCatList; if( !(isset($objCatList) && is_object($objCatList)) ) $objCatList=new clsCatList(); $cat=$objCatList->GetItemByField('Name','Lost & Found'); if( !is_object($cat) ) { $cat=&$objCatList->Add(0,'Lost & Found','Lost & Found Items',adodb_mktime(),0,0,2,2,2,0,'',''); $cat->UpdateACL(); } $cat_id=$cat->UniqueId(); // move to lost + found category foreach($dupes as $dupe_rid => $dupe_id) { if( !isset($non_category_items[$dupe_rid]) ) { $ado->Execute('INSERT INTO '.GetTablePrefix().'CategoryItems VALUES ('.$cat_id.','.$dupe_rid.',1)'); } } } $ado->Execute('DROP TABLE IF EXISTS '.$module_table); } dupe_ResourceIDs_check(); $module_info = m_GetModuleInfo('filenames'); $sql = 'SELECT '.$module_info['title_field'].', '.$module_info['id_field'].' FROM '.$table_prefix.$module_info['table']; $items_rs = $inst_ado->Execute($sql); while(!$items_rs->EOF) { $module_info['item_id'] = $items_rs->fields[ $module_info['id_field'] ]; $filename = StripDisallowed($items_rs->fields[ $module_info['title_field'] ], $module_info); $sql = 'UPDATE '.$table_prefix.$module_info['table'].' SET AutomaticFilename = 1, Filename = '.$inst_ado->qstr($filename).' WHERE '.$module_info['id_field'].' = '.$module_info['item_id']; $inst_ado->Execute($sql); $items_rs->MoveNext(); } ?>