UNB/ CS/ David Bremner/ teaching/ java/ Database.java
import java.io.IOException;
import java.io.RandomAccessFile;

public class Database
{  public static void main(String[] args)
   {  ConsoleReader console = new ConsoleReader(System.in);
      System.out.println
         ("Please enter the data file name:");
      String filename = console.readLine();
      try
      {  RandomAccessFile file 
            = new RandomAccessFile(filename, "rw");
         long nrecord = file.length() / RECORD_SIZE;
         boolean done = false;
         while (!done)
         {  System.out.println
               ("Please enter the record to update (1 - "
               + nrecord + "), new record (0), quit (-1)");
            int pos = console.readInt();

            if (1 <= pos && pos <= nrecord) // update record
            {  file.seek((pos - 1) * RECORD_SIZE);
               Product p = readProduct(file);
               System.out.println("Found " + p.getName() 
                  + " " + p.getPrice() + " " + p.getScore());
               System.out.println
                  ("Enter the new price:");
               double newPrice = console.readDouble();
               p.setPrice(newPrice);
               file.seek((pos - 1) * RECORD_SIZE);
               writeProduct(file, p);
            }
            else if (pos == 0) // add record
            {  System.out.println("Enter new product:");
               String name = console.readLine();
               System.out.println("Enter price:");
               double price = console.readDouble();
               System.out.println("Enter score:");
               int score = console.readInt();
               Product p = new Product(name, price, score);
               file.seek(nrecord * RECORD_SIZE);
               writeProduct(file, p);
               nrecord++;
            }
            else if (pos == -1)
               done = true;
         }
         file.close();
      }
      catch(IOException e)
      {  System.out.println("Input/Output Exception " + e);
      }
   }

   /**
      Reads a fixed width string.
      @param f the file to read from
      @param size the number of characters to read
      @return the string with trailing spaces removed
   */
   public static String readFixedString(RandomAccessFile f, 
      int size) throws IOException
   {  String b = "";
      for (int i = 0; i < size; i++)
         b += f.readChar();
      return b.trim();
   }
   
   /**
      Writes a fixed width string.
      @param f the file to write to
      @param size the number of characters to write
   */
   public static void writeFixedString(RandomAccessFile f, 
      String s, int size) throws IOException
   {  if (s.length() <= size)
      {  f.writeChars(s);
         for (int i = s.length(); i < size; i++)
            f.writeChar(' ');
      }
      else
         f.writeChars(s.substring(0, size));
   }

   /**
      Reads a product record.
      @param f the file to read from
      @return the next product stored in the file.
   */
   public static Product readProduct(RandomAccessFile f)
      throws IOException
   {  String name = readFixedString(f, NAME_SIZE);
      double price = f.readDouble();
      int score = f.readInt();
      return new Product(name, price, score);
   }

   /**
      Writes a product record.
      @param f the file to write to
   */
   public static void writeProduct(RandomAccessFile f,
      Product p) throws IOException
   {  writeFixedString(f, p.getName(), NAME_SIZE);
      f.writeDouble(p.getPrice());
      f.writeInt(p.getScore());
   }

   public static final int NAME_SIZE = 30;

   public static final int CHAR_SIZE = 2;
   public static final int INT_SIZE = 4;
   public static final int DOUBLE_SIZE = 8;
  
   public static final int RECORD_SIZE 
      = CHAR_SIZE * NAME_SIZE + DOUBLE_SIZE + INT_SIZE;
}