"""
###########################################
like extract.py for memos, but also get
event date info from datebook dbase file;
similar dbase structure to memos, but recs
start with binary data giving time and date
info packed in bits, followed by null term
event text; ignores repeating event start/
stop, and times; run me in .pdb file's dir;
makes one text file per event, filenames
sort by ascending date, and include date
and event text prefix for filename, like:
DatebookDB\1999-04-Apr-15-[LP_Release].txt
###########################################
"""
monthname = ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
import struct, os
fname = 'DatebookDB.pdb'
file = open(fname, 'rb') # binary mode
bytes = file.read() # load file to str
print fname, len(bytes)
eos = bytes.find(chr(0))
dbname = bytes[:min(32,eos)]
print dbname
if not os.path.exists(dbname):
os.mkdir(dbname)
else:
os.system('rm %s/*' % dbname)
# see extract.py for basic dbase format
frec = 77
(nrec,) = struct.unpack('>H',bytes[frec-1:frec+1])
print nrec
flst = 70
for rec in range(1, nrec+1):
floc = flst + (rec * 8)
(rloc,) = struct.unpack('>I', bytes[floc:floc+4])
fend = flst + ((rec+1) * 8)
(rend,) = struct.unpack('>I', bytes[fend:fend+4])
try:
event = bytes[rloc:rend]
#xname = '%s/event%d' % (dnbname, rec)
hdr, text = event[:8], event[8:] # 1st 8 byte are time, date
hm = hdr[:4] # skip start,stop times
ymd = hdr[4:]
ymd12, ymd3, ymd4 = struct.unpack('>HBB', ymd)
yyyy = (ymd12 >> 9) & 0x7F # top 7 bits, 0..127, & needed?
yyyy += 1904 # to 2031, 4 in ymd3 low byte?
mm = (ymd12 >> 5) & 0xF # middle 4 bits, 0..15
dd = (ymd12 & 0x1F) # low 5 bits, 0..31
if ymd3 & 0xF0: # high byte nonzero
text = text[8:] # repeating evt-skip end info
if text[-1] == '\x00':
text = text[:-1] # text null terminated
for c in text[:2]: # some repeating have extra bytes
if not c.isalnum() and not c in ['-',' ','?','\n']:
print 'skipping'
text = text[6:] # this is just a heuristic
break # but works for my repeat events
# use part of text in filename
text0 = ''
text1 = text[:30] # up to 30 chars at front
for c in text1:
if c.isalnum() or c in ['-', '_']:
text0 += c
else:
text0 += '_'
xname = ('%s/%4d-%02d-%s-%02d-[%s].txt' %
(dbname, yyyy, mm, monthname[mm-1], dd, text0))
print rec, yyyy, mm, dd
print text
print xname
print '-'*40
# to the file we go
xtract = open(xname, 'wb')
xtract.write(text)
xtract.close()
except KeyboardInterrupt:
raise # propogate it
except:
import sys # ignore it
print sys.exc_type, sys.exc_value
print 'BAD'
print 'Done.'