Adding a Field to a Live Repository
To add a field to a live eprints archive you have to modify the SQL tables.
Before you start this you may wish to BackupTheDatabase.
This assumes you are adding a field to the "eprint" fields, not the "user" fields. If you are changing "user" then anywhere we have 4 actions, one for each of buffer, deletion, archive and inbox, you instead need a single action for "users".
Adding fields of type "name" is beyond the scope of these instructions.
!Recipe
!!Step 1 - Shut down apache Shut down the web server. You don't want people using it while you make this change.
!!Step 2 - Add configuration Add the configuration for this field to MetadataFieldsConfig.pm - take note of which field you add this new field after. (from now on I'll refer to the previous field as prevfield.
!!Step 3 - Add fields to database
Find out the SQL type of the field you are adding.
boolean
- SET('TRUE','FALSE')
date
- DATE
year, int
- INTEGER
longtext
- TEXT
subject,set,url,email,pagerange,text
- VARCHAR(255)
Note that if the field is type multiple then this step is different.
For both steps the following replacements must be applied to the MySQL code given:
- Replace type with the SQL type appropriate to the field you are adding.
- Replace newfieldname with the name of the field you're adding
- Replace prevfield with the name of the (non-multiple) field proceeding the field you are adding. If prevfield is a multiple then use the first non-multiple field proceeding your new field. (not used for multiple fields)
!!!Step 3a - Adding a normal field
In the database (log into CommandLineMySQL) do the following:
If this is confusing see the example at the end of the page.
ALTER TABLE archive ADD newfieldname type default NULL AFTER prevfield; ALTER TABLE buffer ADD newfieldname type default NULL AFTER prevfield; ALTER TABLE inbox ADD newfieldname type default NULL AFTER prevfield; ALTER TABLE deletion ADD newfieldname type default NULL AFTER prevfield;
!!!Step 3b - Adding a "multiple" field
Multiple fields need their own table, so the syntax is different.
Please note that these commands have been split over multiple lines for readability.
CREATE TABLE archive_newfieldname ( eprintid INT NOT NULL, pos INT, newfieldname type default NULL, KEY eprintid (eprintid), KEY pos (pos) );
CREATE TABLE buffer_newfieldname ( eprintid INT NOT NULL, pos INT, newfieldname type default NULL, KEY eprintid (eprintid), KEY pos (pos) );
CREATE TABLE inbox_newfieldname ( eprintid INT NOT NULL, pos INT, newfieldname type default NULL, KEY eprintid (eprintid), KEY pos (pos) );
CREATE TABLE deletion_newfieldname ( eprintid INT NOT NULL, pos INT, newfieldname type default NULL, KEY eprintid (eprintid), KEY pos (pos) );
!!Step 4 - Modify the ordervalues tables
The ordervalues table is used to store a "dumbed down" version of the value in your field used for sorting, but never rendered.
The same replacement values apply as for step 3 with one difference. The prevfield is the previous field in ArchiveMetadataFieldsConfig.pm even if it is a multiple field.
Notes:
- there are two underline characters before "ordervalues".
- this assumes you are not running a multilanguage or non-english archive. If you are then repeat the 4 commands below and replace 'en' with each of your archive's languages in turn.
ALTER TABLE archive__ordervalues_en ADD fieldname TEXT AFTER prevfield; ALTER TABLE buffer__ordervalues_en ADD fieldname TEXT AFTER prevfield; ALTER TABLE inbox__ordervalues_en ADD fieldname TEXT AFTER prevfield; ALTER TABLE deletion__ordervalues_en ADD fieldname TEXT AFTER prevfield;
!!Step 5 - Checking it works...
It should all be OK at this point, but it's worth checking. I suggest running generate_views on the archive to make sure it all works OK.
!!Step 6 - Finishing up
Add the config to metadata-types.xml and phrases.xml - see AddingFields
!!Step 7 - Restart apache
Everything should now be OK. restart the webserver
!Examples
!! Normal set field example
To add a field of type 'set' to eprints. We add this to ArchveMetadataFieldsConfig.pm
{ name => "foo", type => "set", input_rows => 1, options => [ "yesod", "hod", "chesed" ] },
The previous field is a (non-multiple) text field called 'bar')
then run the following SQL statements:
ALTER TABLE archive ADD foo VARCHAR(255) default NULL AFTER bar; ALTER TABLE buffer ADD foo VARCHAR(255) default NULL AFTER bar; ALTER TABLE inbox ADD foo VARCHAR(255) default NULL AFTER bar; ALTER TABLE deletion ADD foo VARCHAR(255) default NULL AFTER bar;
ALTER TABLE archive__ordervalues_en ADD foo TEXT AFTER bar; ALTER TABLE buffer__ordervalues_en ADD foo TEXT AFTER bar; ALTER TABLE inbox__ordervalues_en ADD foo TEXT AFTER bar; ALTER TABLE deletion__ordervalues_en ADD foo TEXT AFTER bar;