<?php if ( $argc != 1 ) { if ( $argc != 3 ) { print("Usage: php fix-titles.php [archivename eprintid]\n"); return; } else { $archive_name = $argv[1]; $eprint_id = $argv[2]; } } /* NJS 2007-07-24 The database structure changed between versions 2.x and 3.x of EPrints, so we now need to check the major version number and alter the queries appropriately. Use only the MAJOR version number (i.e., 2 or 3, don't include the release number). */ $eprints_version = ##EPRINTS_VERSION##; /* Apache log for ePrints uses this format: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined If the log format differs the regular expression matching would need to be adjusted. Parse: ip date YYYY MM DD archive ID */ // eprintstats db $sqlserver = 'localhost'; $sqluser = 'eprintstatspriv'; $sqlpass = 'AuldGrizzel'; $sqldatabase = 'eprintstats'; /* NJS 2006-05-26 SQL details of your ePrints installation(s). This has now been generalised to work with multiple archives. For each archive that you have, add an entry to this array in the following format: 'archive_name' => array( 'sqlserver' => 'db_host', 'dbname' => 'database_name', 'username' => 'archive_name', 'password' => 'password', ), NJS 2009-04-29: Added support for different database name. Usually, archive_name, database_name and user_name are the same, but they don't have to be. */ $eprintsdbs = array( 'otago_eprints' => array( 'sqlserver' => 'localhost', 'dbname' => 'otago_eprints_v3', 'username' => 'otago_eprints', 'password' => 'DrSyntaxRidesAgain', ), 'cardrona' => array( 'sqlserver' => 'localhost', 'dbname' => 'cardona_v3', 'username' => 'cardrona', 'password' => 'DrSyntaxRidesAgain', ), ); ########################################### ## ## No configuration required below here. ## ########################################### $connect = mysql_pconnect($sqlserver,$sqluser,$sqlpass); $db = mysql_select_db($sqldatabase,$connect) or die("Could not connect to $sqldatabase database.\n"); // NJS 2006-06-14: Generalised connection list for multiple archives. $eprints_connections = array(); foreach ($eprintsdbs as $archive => $details) { $eprints_connections[$archive] = mysql_connect($details['sqlserver'],$details['username'],$details['password']) or die( "Could not connect to EPrints database with user {$details['username']}.\n"); } /* Get list of all items in database. We only need the distinct archive name and eprint ID, because we'll be updating all duplicate instances with the same eprint title anyway. We could limit it to items with titles like "Unknown%", to make things faster, but that doesn't cover different titles for the same item (e.g., from corrected punctuation). */ if ( $argc == 1 ) { $query = " SELECT DISTINCT archive_name, archiveid FROM view ORDER BY archive_name, archiveid"; } else { $query = " SELECT DISTINCT archive_name, archiveid FROM view WHERE archive_name = '$archive_name' AND archiveid = $eprint_id ORDER BY archive_name, archiveid"; } $result = mysql_query( $query, $connect ); $total_rows = ( $result ) ? mysql_num_rows( $result ) : 0; $count = 0; while ( $row = mysql_fetch_assoc( $result ) ) { $archive_name = $row['archive_name']; $eprint_id = $row['archiveid']; printf( "Checking %s item %s (%d/%d): ", $archive_name, $eprint_id, ++$count, $total_rows ); $eprint_name = getePrintName( $eprints_connections[$archive_name], $eprintsdbs[$archive_name]['dbname'], $eprint_id, $eprints_version ); $update = sprintf(" UPDATE view SET eprint_name = '%s' WHERE archive_name = '%s' AND archiveid = %d", mysql_real_escape_string( $eprint_name ), $archive_name, $eprint_id ); if ( mysql_query($update, $connect) ) { $num_rows = mysql_affected_rows( $connect ); printf( "OK (%d row%s updated).\n", $num_rows, ( $num_rows != 1 ) ? "s" : "" ); } else { print( "failed!\n" ); } } foreach ($eprints_connections as $connection) { mysql_close($connection); } mysql_close($connect); // Look up the title corresponding to the specified eprint id. function getePrintName($connection,$dbname,$eprintid,$eprints_version) { // NJS 2006-06-14: DB connection now passed as an argument. $db = mysql_select_db($dbname,$connection); // NJS 2007-07-24: Added check for EPrints version, as the // database structure changed between versions 2 and 3. if ( $eprints_version > 2 ) { $query3 = " SELECT title FROM eprint WHERE eprintid = $eprintid AND eprint_status = 'archive' "; } else { $query3 = " SELECT title FROM archive WHERE eprintid = $eprintid "; } $result3 = mysql_query($query3,$connection); $title = ''; $suffix = ''; // NJS 2006-04-25 Added check for empty result, probably a deleted item. // Look in the deleted items for details. if (mysql_num_rows($result3) == 0) { // NJS 2007-07-24: Added check for EPrints version, as the // database structure changed between versions 2 and 3. if ( $eprints_version > 2 ) { $query3 = " SELECT title FROM eprint WHERE eprintid = $eprintid AND eprint_status = 'deletion' "; } else { $query3 = " SELECT title FROM deletion WHERE eprintid = $eprintid "; } $result3 = mysql_query($query3,$connection); // If it's not in deletion, then we have no clue what it is. if (mysql_num_rows($result3) == 0) { $title = "Unknown item [$eprintid]"; } else { $suffix = ' [deleted]'; } } if ($title == '') { $row = mysql_fetch_assoc($result3); $row["title"] = trim($row["title"]); $row["title"] = preg_replace("/\s+/"," ",$row["title"]); $title = $row["title"]; } return $title . $suffix; } ?>