Copyright © T. H. Merrett COMP 612 Principles of Database Programming Week 1 3 of 4 /* Program using the Cars database to answer the query: WHAT IS THE COLOUR, */ /* YEAR, MAKE AND OWNER'S NAME, ADDRESS AND PHONE NUMBER OF THE CAR WITH */ /* REGISTRATION NUMBER ...........? */ import java.io.*; public class week1j1 { public static void main(String[] args) { int cmpr= 0, faptr= 0, brptr= 0, soptr= 0, kpos= 0, indx; byte fill; try { DataInputStream dbptrd = new DataInputStream(new BufferedInputStream( new FileInputStream("/course/cs612/carsdata/dbptr"),2100)); int[] regptr= new int[1000]; int[] colptr= new int[1000]; int[] yrptr= new int[1000]; int[] makptr= new int[1000]; int[] ownptr= new int[1000]; for(int enumerate= 0; enumerate<1000; enumerate++) // read dbptr { regptr[enumerate]= dbptrd.readInt(); colptr[enumerate]= dbptrd.readInt(); yrptr[enumerate]= dbptrd.readInt(); makptr[enumerate]= dbptrd.readInt(); ownptr[enumerate]= dbptrd.readInt(); fill= dbptrd.readByte(); // need this: // Note. Failing to read the byte (\n) ending each record caused the // for(indx..) loop below to suspend in the 2nd iteration, probably // at seek(regptr..): no message. } dbptrd.close(); DataInputStream colourd = new DataInputStream(new BufferedInputStream( new FileInputStream("/course/cs612/carsdata/colour"),201)); String colour[]= new String[20]; for(int enumerate= 0; enumerate<20; enumerate++) { colour[enumerate]= strRead(colourd, 10, false); } colourd.close(); DataInputStream yeard = new DataInputStream(new BufferedInputStream( new FileInputStream("/course/cs612/carsdata/years"),341)); int years[]= new int[85]; for(int enumerate= 0; enumerate<85; enumerate++) { years[enumerate]= yeard.readInt(); } yeard.close(); DataInputStream ownptrd = new DataInputStream(new BufferedInputStream( new FileInputStream("/course/cs612/carsdata/ownptr"),1770)); int[] ownptr0= new int[885]; for(int enumerate= 0; enumerate<885; enumerate++) // read ownptr 0 { ownptr0[enumerate]= ownptrd.readInt(); } ownptrd.close(); DataInputStream makptrd = new DataInputStream(new BufferedInputStream( new FileInputStream("/course/cs612/carsdata/makptr"),2389)); int dsize= makptrd.readInt(), psize= makptrd.readInt(); // sizes int[] makptr0= new int[psize]; for(int enumerate= 0; enumerate<psize; enumerate++) { makptr0[enumerate]= makptrd.readInt(); // don't need the rest, but must read past them: faptr= makptrd.readInt(); brptr= makptrd.readInt(); soptr= makptrd.readInt(); kpos= makptrd.readInt(); } makptrd.close(); RandomAccessFile ownerd= new RandomAccessFile("/course/cs612/carsdata/owner", "r"); RandomAccessFile makesd= new RandomAccessFile("/course/cs612/carsdata/makes", "r"); RandomAccessFile regisd= new RandomAccessFile("/course/cs612/carsdata/regis", "r"); // :using direct access to regis, owners String findRegis= args[0].trim(); // supplied as argument to call // sequential search looking up dbptr: could use binary search: for(indx= 0; indx<1000; indx++) { regisd.seek(7*regptr[indx]); cmpr= findRegis.compareTo(strRead(regisd, 7, true).trim()); // compare Strings: if (cmpr==0) break; // success else if (cmpr<0) {indx= 1000; break;} // end unsuccessfully } if (indx==1000) System.out.println(findRegis + " not found"); else { makesd.seek(41*(long)makptr0[makptr[indx]]); // indirect ref ownerd.seek(81*(long)ownptr0[ownptr[indx]]); // indirect ref System.out.println(findRegis + " " + colour[colptr[indx]].trim() + " " + years[yrptr[indx]] + " " + strRead(makesd, 41, true).trim() + " " + strRead(ownerd, 40, false).trim() + " " + strRead(ownerd, 33, false).trim() + " " + strRead(ownerd, 8, true).trim()); } } catch(IOException e) { System.out.print("Error: " + e); System.exit(1); } } private static String strRead(DataInput filed, int size, boolean crlf) throws IOException { byte[] record= new byte[size]; filed.readFully(record, 0, size); return bytechars.byte2string(record).substring(0, size - (crlf?1:0)); // if reading whole record, it will include crlf; field will not } } // class week1j1