### Eclipse Workspace Patch 1.0 #P moodle Index: auth/ldap/lib.php =================================================================== RCS file: /cvsroot/moodle/moodle/auth/ldap/lib.php,v retrieving revision 1.83.2.1 diff -u -r1.83.2.1 lib.php --- auth/ldap/lib.php 25 Oct 2006 09:02:30 -0000 1.83.2.1 +++ auth/ldap/lib.php 13 Nov 2006 18:26:48 -0000 @@ -398,15 +412,34 @@ // configure a temp table print "Configuring temp table\n"; - if(strtolower($CFG->dbtype) === 'mysql'){ - // help old mysql versions cope with large temp tables + switch (strtolower($CFG->dbtype)) { + case 'mysql': + $temptable = $CFG->prefix.'extuser'; + echo "Creating temp table $temptable\n"; + // help old mysql versions cope with large temp tables execute_sql('SET SQL_BIG_TABLES=1', false); - execute_sql('CREATE TEMPORARY TABLE ' . $CFG->prefix .'extuser (idnumber VARCHAR(64), PRIMARY KEY (idnumber)) TYPE=MyISAM',false); - } elseif (strtolower($CFG->dbtype) === 'postgres7'){ + execute_sql('CREATE TEMPORARY TABLE '.$temptable.' (idnumber VARCHAR(64), PRIMARY KEY (idnumber)) TYPE=MyISAM',false); + break; + case 'postgres7': + $temptable = $CFG->prefix.'extuser'; + echo "Creating temp table $temptable\n"; $bulk_insert_records = 1; // no support for multiple sets of values - execute_sql('CREATE TEMPORARY TABLE '.$CFG->prefix.'extuser (idnumber VARCHAR(64), PRIMARY KEY (idnumber))',false); - } - + execute_sql('CREATE TEMPORARY TABLE '.$temptable.' (idnumber VARCHAR(64), PRIMARY KEY (idnumber))',false); + break; + case 'mssql': + case 'mssql_n': + case 'odbc_mssql': + $temptable = '#'.$CFG->prefix.'extuser'; + echo "Creating temp table $temptable\n"; + $bulk_insert_records = 1; // no support for multiple sets of values + execute_sql('CREATE TABLE '.$temptable.' (idnumber VARCHAR(64), PRIMARY KEY (idnumber))',false); + break; + case 'oci8po': + $temptable = $CFG->prefix.'extuser'; + echo "Creating temp table $temptable\n"; + execute_sql('CREATE GLOBAL TEMPORARY TABLE '.$temptable.' (idnumber VARCHAR(64), PRIMARY KEY (idnumber)) ON COMMIT PRESERVE ROWS',false); + break; + } print "connecting to ldap\n"; $ldapconnection = auth_ldap_connect(); @@ -459,7 +492,7 @@ $count++; array_push($fresult, $value); if(count($fresult) >= $bulk_insert_records){ - auth_ldap_bulk_insert($fresult); + auth_ldap_bulk_insert($fresult, $temptable); //print var_dump($fresult); $fresult=array(); } @@ -469,7 +502,7 @@ // insert any remaining users and release mem if(count($fresult)){ - auth_ldap_bulk_insert($fresult); + auth_ldap_bulk_insert($fresult, $temptable); $fresult=array(); } commit_sql(); @@ -480,20 +513,23 @@ /// preserve our user database /// if the temp table is empty, it probably means that something went wrong, exit /// so as to avoid mass deletion of users; which is hard to undo - $count = get_record_sql('SELECT COUNT(idnumber) AS count, 1 FROM ' . $CFG->prefix .'extuser'); + $count = get_record_sql('SELECT COUNT(idnumber) AS count, 1 FROM ' .$temptable); $count = $count->{'count'}; if($count < 1){ print "Did not get any users from LDAP -- error? -- exiting\n"; exit; } - + else { + print "Got $count records from LDAP\n"; + } + //// //// User removal //// // find users in DB that aren't in ldap -- to be removed! // this is still not as scalable $sql = 'SELECT u.id, u.username - FROM ' . $CFG->prefix .'user u LEFT JOIN ' . $CFG->prefix .'extuser e + FROM ' . $CFG->prefix .'user u LEFT JOIN ' .$temptable.' e ON u.idnumber = e.idnumber WHERE u.auth=\'' . AUTH_LDAP_NAME . '\' AND u.deleted=\'0\' AND e.idnumber IS NULL'; //print($sql); @@ -525,6 +561,9 @@ } commit_sql(); } + else { + print "No user entries to be removed\n"; + } $remove_users = 0; // free mem! //// @@ -550,6 +589,9 @@ unset($all_keys); unset($key); } + else { + print "Updating of existing accounts disabled\n"; + } if ( $do_updates && !(empty($updatekeys)) ) { // run updates only if relevant $users = get_records_sql('SELECT u.username, u.id FROM ' . $CFG->prefix . 'user u WHERE u.deleted=0 and u.auth=\'' . AUTH_LDAP_NAME . '\'' ); if (!empty($users)) { @@ -589,7 +631,9 @@ } } } // end do updates - + else { + print "No updates to be done\n"; + } //// //// User Additions //// @@ -597,9 +641,10 @@ // note that get_records_sql wants at least 2 fields returned, // and gives me a nifty object I don't want. $sql = 'SELECT e.idnumber,1 - FROM ' . $CFG->prefix .'extuser e LEFT JOIN ' . $CFG->prefix .'user u + FROM ' .$temptable.' e LEFT JOIN ' . $CFG->prefix .'user u ON e.idnumber = u.idnumber WHERE u.id IS NULL OR (u.id IS NOT NULL AND u.deleted=1)'; $add_users = get_records_sql($sql); // get rid of the fat if(!empty($add_users)){ @@ -653,6 +701,11 @@ commit_sql(); unset($add_users); // free mem } + else { + print "No users to be added\n"; + } + print "Dropping temp table $temptable\n"; + execute_sql('DROP TABLE '.$temptable, false); return true; } @@ -705,13 +758,13 @@ return get_record_select("user", "username = '$username' AND deleted <> '1'"); } -function auth_ldap_bulk_insert($users){ +function auth_ldap_bulk_insert($users, $temptable){ // bulk insert in SQL's temp table // $users is an array of usernames - global $CFG; +// $temptable is the temporary database (whose name may vary depending on our SQL Server brand) // bulk insert -- superfast with $bulk_insert_records - $sql = 'INSERT INTO '.$CFG->prefix.'extuser (idnumber) VALUES '; + $sql = 'INSERT INTO '.$temptable.' (idnumber) VALUES '; // make those values safe array_map('addslashes', $users); // join and quote the whole lot