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