WIDEPRINT = rsh pequod enscript -rGf Courier5
#
# This makefile is intended to help the build process.
# Because of the changing nature of ph updates, it may not be
# perfect, and may require tweaking from time to time
#
# Your raw materials should be:
# s.tape.raw the raw student tape
# f.tape.raw the raw staff tape
# s.all.raw list of all student id's
# old.dir the old .dir file
# old.dov the old .dov file
#
# Your finished products should be:
# prod.{dir,dov,idx,iov,seq,bdx} the new database!
# sf.kill the people who were deleted from the database
#
# Many intermediaries are used.
#
# IMPORTANT WARNING: Few UNIX utilities can adequately deal with large files
# of long lines. I have had trouble with sort, awk, and grep in this regard.
# I suggest you stick to perl wherever possible.
# What sort program to use.
SORT=brute
# Directory binaries are stored in. Only fill this in if the binaries are
# not in the search path.
B=
# Build the .bdx and .seq files from the nameserver index
prod.bdx: prod.idx
${B}build -s prod
# Build the inverted index. This takes a long time, and needs a fast disk.
# It first creates an empty database, so it has empty indices to start with.
# Size should be a prime number > 6*#entries.
prod.idx: prod.dir scratch idx-size
cd scratch; ${B}credb `cat ../idx-size` prod; mv prod.idx prod.iov ..; rm prod.*; cd ..
${B}makei prod
# Create a directory to make blank databases in
scratch:
mkdir scratch
# Calculate the size of the needed index files
idx-size: sf.new other.old
sizedb prod.cnf sf.new other.old > idx-size
# Calculate the size of the needed database
db-size: sf.new other.old
echo `cat sf.new other.old | wc -l` " 5 * p" | dc | primes | head -1 > db-size
# This produces the main database, using maked on the concatenation of
# sf.new (the merged student, staff, and old data) and other.old (non-people
# data from the old database). Size should be a prime =~ 5*number of entries.
prod.dir: sf.new other.old rejects.old db-size
rm -rf prod.dir prod.dov
${B}credb `cat db-size` prod
rm prod.idx prod.iov
cat sf.new other.old | ${B}maked prod
# Pull non-people out of the old database, for reinsertion.
# The timetable is done separately, so we can filter out unwanted semesters.
# "pg" is grep rewritten in perl.
other.old: old.dir old.dov
${B}mdump other old > other.old
${B}mdump time old | pg -v "\t4:timetable " | pg -v "\t4:timetable summer" >> other.old
# Entries not marked "other" or "person"
rejects.old: old.dir old.dov
${B}mdump rejects old > rejects.old
# Build sf.new, which is sf.prefrosh + freshman logins
sf.new: sf.prefrosh
${B}froshlog prod.cnf sf.new frosh.logins sf.prefrosh > frosh.problems
# Build sf.prefrosh, which is the data for all people in the database.
# This step runs phoneaddr to copy either the work or home phone & address
# into the default phone & address fields, and also makes sure the FERPA
# people get suppressed.
sf.prefrosh: sf.prephone s.suppress
${B}phoneaddr sf.prephone | perl s.suppress | ${B}addnickname prod.cnf > sf.prefrosh
# Build sf.prephone, which is data for all the people, but without the
# phone and address fields.
# This step uses aliasprepare and aliasassign to assign aliases to those
# people who don't have them. aliasassign also needs to know about any
# aliases in other.old but only prints entries with type person.
sf.prephone: sf.comb other.old
${B}aliasprepare prod.cnf < sf.comb |${SORT} > lop
${B}aliasprepare prod.cnf < other.old | pg -v '6:~~~~' |${SORT} > loper
${B}aliasassign prod.cnf loper lop > sf.prephone
rm -f lop loper
# Build sf.comb, which is merged student, staff, and old data.
# This uses merge3, and takes quite some time.
# This step can remove old entries from the database, or not, as you wish.
sf.comb sf.kill: s.merge f.tape sf.old
${B}merge3 prod.cnf sf.old s.merge f.tape sf.comb sf.kill
# if you don't want deletions, uncomment the following line
# and comment out the one after
cat sf.kill >> sf.comb
# ${B}age prod.cnf sf.kill sf.kill.dead >> sf.comb
# Produce sf.old, the data about people from the old database.
sf.old: old.dir old.dov
${B}mdump people old | perl -p -e 's/\t11:incoming//;' | ${SORT} > sf.old
# s.suppress.raw is a list of the SSN's of the FERPA people. The FERPA
# people are not in s.tape.raw, but their id's appear in s.tape.all, so
# we can generate the FERPA list by comparing the two files.
s.suppress.raw: s.tape.raw s.all.raw
cat s.tape.raw s.all.raw | colrm 10 | sort | uniq -u > s.suppress.raw
# generate a perl script (s.suppress) to do the suppression of FERPA people.
# the script either adds or removes the suppress field, depending on whether
# or not the id is a FERPA id.
s.suppress: s.suppress.raw
perl -p -e 's/.*/5:$$&\t/;' s.suppress.raw | \
perl -e 'print "while(<>){\nif (0) {}\n";while(<>){chop;print "elsif (/^$$_/) {if (!/\t43:/){s/\$$/\t43:y/;}}\n";} print "print;\n}\n";' > s.suppress
# Unblock the raw student tape into maked format
s.tape: s.tape.raw
${B}s.unblock prod.cnf s.tape.raw | ${SORT} > s.tape
# Unblock frosh tape into maked format
h.tape: h.tape.raw
${B}h.unblock prod.cnf h.tape.raw > h.tape
# Unblock the raw staff tape into maked format
f.tape: f.tape.raw
${B}f.unblock prod.cnf f.tape.raw | ${SORT} > f.tape
# copy over the old database, and fix byte order. This is usually used only
# for testing; I normally do this by hand for real updates.
old.dov old.dir:
echo "read testing, five minutes" |\
rsh garcon cat \>/nameserv/db/prod.sta
rcp garcon:/nameserv/db/prod.dir old.dir
rcp garcon:/nameserv/db/prod.dov old.dov
rsh garcon rm /nameserv/db/prod.sta
${B}border -dir -dov old