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.
Contents
- 1 Recipe (for Eprints 2.x)
- 2 Examples (for Eprints 2.x)
- 3 Recipe (for Eprints 3.x)
- 4 Examples (for Eprints 3.x)
Recipe (for Eprints 2.x)
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)
Now only do step 3a or 3b depending if this field is multiple or not
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 (for Eprints 2.x)
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;
Recipe (for Eprints 3.x)
This is much the same as for Eprints 2.x except that the names have been changed to protect the innocent.
- Define your new fields in archives/ARCHIVEID/cfg/cfg.d/eprint_fields.pl for EPrint-level metadata, .../document_fields.pl for document-level metadata (this file doesn't exist by default, but is honoured), .../user_fields.pl for user metadata, etc etc.
- Add the new columns to the appropriate tables. There are no longer four separate tables for eprints as there were in EP2 (archive, buffer etc), so it's simpler.
- For a field defined in eprint_fields.pl, the tables are eprint and eprint__ordervalues_en (replacing en with your language as required).
- For a field defined in document_fields.pl, you want document and document__ordervalues_en.
- And so on.
- The column types are the same as for EP2, ie in eprint you want a type appropriate to the type of your field exactly as described in the Recipe for EP2 above, while in eprint__ordervalues_en you want text irrespective of your field type.