<?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;
}
?>