RMS access using high level API
Source code:
1 import struct
2 from vms.rmsdef import RMS__SUC, RMS__RNF, RMS__OK_DUP
3 from vms.fabdef import FAB_M_PUT, FAB_M_GET, FAB_M_DEL, FAB_M_UPD, \
FAB_M_SHRPUT, FAB_M_SHRGET, FAB_M_SHRDEL, FAB_M_SHRUPD
4 from vms.rms.IndexedFile import IndexedFile
5 from construct import *
6
7 TestRec = Struct("TestRec", String("f1", 5), SLInt32("f2"), String("f3", 11))
8
9 class TestFile(IndexedFile):
10 Name = 'test.dat'
11 def __init__(self):
12 IndexedFile.__init__(self, TestFile.Name, TestRec)
13
14 def primary_keynum(self):
15 return 0
16
17 def keyval(self, rec, keynum):
18 if keynum == 0:
19 return rec.f1
20 elif keynum == 1:
21 return rec.f2
22 else:
23 raise "Invalid keynum parameter"
24
25 def pack_key(self, keynum, keyval):
26 if keynum == 0:
27 return struct.pack("=5s", keyval)
28 elif keynum == 1:
29 return struct.pack("=i", keyval)
30 else:
31 raise KeyError
32
33 if __name__=='__main__':
34 f = TestFile()
35 print
36 print 'Reset file'
37 f.reset()
38
39 print
40 print 'Insert a few records'
41 rec = Container(f1 = 'AA5AA', f2 = 5, f3 = '1234567890A')
42 f.put(rec)
43 rec = Container(f1 = 'BB2BB', f2 = 2, f3 = '1234567890B')
44 f.put(rec)
45 rec = Container(f1 = 'CC4CC', f2 = 4, f3 = '1234567890C')
46 f.put(rec)
47 rec = Container(f1 = 'DD1DD', f2 = 1, f3 = '1234567890D')
48 f.put(rec)
49 rec = Container(f1 = 'EE1EE', f2 = 2, f3 = '1234567890E')
50 f.put(rec)
51 rec = Container(f1 = 'FF3FF', f2 = 3, f3 = '1234567890F')
52 f.put(rec)
53
54 print
55 print 'Initial records using an iterator, primary key order'
56 for rec in f:
57 print rec.f1, rec.f2, rec.f3
58
59 print
60 print 'Initial records using an iterator, secondary key order'
61 f.iterator_keynum(1)
62 for rec in f:
63 print rec.f1, rec.f2, rec.f3
64
65 print
66 print 'Update all records using an iterator'
67 # iterator key is automatically reset to primary key
68 for rec in f:
69 rec.f2 = rec.f2 + 10
70 f.update_current(rec)
71
72 print
73 print 'Updated records using an iterator'
74 for rec in f:
75 print rec.f1, rec.f2, rec.f3
76
77 print
78 print 'build a list of all records'
79 lst = f.fetchall(0)
80 print len(lst)
81
82 print
83 print 'delete a record using secondary key value 14'
84 f.delete(1, 14)
85
86 print
87 print 'Records using an iterator, secondary key order'
88 f.iterator_keynum(1)
89 for rec in f:
90 print rec.f1, rec.f2, rec.f3
91
92 print 'delete all records using secondary key value 12'
93 f.open(acc = FAB_M_GET + FAB_M_DEL)
94 f.usekey(1)
95 f.rewind()
96 f.find(None, f.pack_key(1, 12))
97 for rec in f:
98 if rec.f2 == 12:
99 f.delete_current()
100 else:
101 break
102 f.close()
103
104 print
105 print 'Records using an iterator, primary key order'
106 for rec in f:
107 print rec.f1, rec.f2, rec.f3
Result:
Reset file Insert a few records Initial records using an iterator, primary key order AA5AA 5 1234567890A BB2BB 2 1234567890B CC4CC 4 1234567890C DD1DD 1 1234567890D EE1EE 2 1234567890E FF3FF 3 1234567890F Initial records using an iterator, secondary key order DD1DD 1 1234567890D BB2BB 2 1234567890B EE1EE 2 1234567890E FF3FF 3 1234567890F CC4CC 4 1234567890C AA5AA 5 1234567890A Update all records using an iterator Updated records using an iterator AA5AA 15 1234567890A BB2BB 12 1234567890B CC4CC 14 1234567890C DD1DD 11 1234567890D EE1EE 12 1234567890E FF3FF 13 1234567890F build a list of all records 6 delete a record using secondary key value 14 Records using an iterator, secondary key order DD1DD 11 1234567890D BB2BB 12 1234567890B EE1EE 12 1234567890E FF3FF 13 1234567890F AA5AA 15 1234567890A delete all records using secondary key value 12 Records using an iterator, primary key order AA5AA 15 1234567890A DD1DD 11 1234567890D FF3FF 13 1234567890F
