public
Description: Io programming language
Homepage: http://iolanguage.com
Clone URL: git://github.com/stevedekorte/io.git
Fix for IoTokyoCabinetPrefixCursor at end of cursor and for key separators
Steve Dekorte (author)
Thu Mar 27 18:26:56 -0700 2008
commit  7614bd96e42ba62eb62fc5920ff220aaad61d4e0
tree    4f8c4b37ec96826ca899bb5af084e0e0c68a2145
parent  4a3d9a05163b12f291e7f8bf1ec0bdd6cddf2961
...
28
29
30
 
31
...
28
29
30
31
32
0
@@ -28,3 +28,4 @@ TokyoCabinet do(
0
   )
0
 )
0
 
0
+TokyoCabinetPrefixCursor prefix ::= nil
0
\ No newline at end of file
...
118
119
120
121
122
123
124
 
 
 
 
 
 
 
 
 
125
126
127
...
195
196
197
198
 
199
200
201
...
227
228
229
 
230
231
232
233
234
 
235
 
 
236
237
238
...
118
119
120
 
 
121
 
122
123
124
125
126
127
128
129
130
131
132
133
...
201
202
203
 
204
205
206
207
...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
0
@@ -118,10 +118,16 @@ int IoTokyoCabinetPrefixCursor_keyBeginsWithPrefix_(IoObject *self, IoSeq *prefi
0
 {  
0
   int size;
0
   char *value = tcbdbcurkey(TokyoCabinetPrefixCursor(self), &size);
0
- UArray o = UArray_stackAllocedWithData_type_size_(value, CTYPE_uint8_t, size);
0
- UArray *p = IoSeq_rawUArray(prefix);
0
   
0
- return UArray_beginsWith_(&o, p);
0
+ if(value)
0
+ {
0
+ UArray o = UArray_stackAllocedWithData_type_size_(value, CTYPE_uint8_t, size);
0
+ UArray *p = IoSeq_rawUArray(prefix);
0
+
0
+ return UArray_beginsWith_(&o, p);
0
+ }
0
+
0
+ return 0;
0
 }
0
 
0
 /*
0
@@ -195,7 +201,7 @@ IoObject *IoTokyoCabinetPrefixCursor_next(IoObject *self, IoObject *locals, IoMe
0
   */
0
 
0
   IoSeq *prefix = IoObject_getSlot_(self, IOSYMBOL("prefix"));
0
-IOASSERT(ISSEQ(prefix), "prefix must be a sequence");
0
+ IOASSERT(ISSEQ(prefix), "prefix must be a sequence");
0
   IOASSERT(TokyoCabinetPrefixCursor(self), "invalid TokyoCabinetPrefixCursor");
0
   tcbdbcurnext(TokyoCabinetPrefixCursor(self));
0
   return IOBOOL(self, IoTokyoCabinetPrefixCursor_keyBeginsWithPrefix_(self, prefix));
0
@@ -227,12 +233,16 @@ IoObject *IoTokyoCabinetPrefixCursor_key(IoObject *self, IoObject *locals, IoMes
0
   IOASSERT(TokyoCabinetPrefixCursor(self), "invalid TokyoCabinetPrefixCursor");
0
   ks = tcbdbcurkey(TokyoCabinetPrefixCursor(self), &size);
0
 
0
+ if (ks)
0
   {
0
     UArray *k = UArray_newWithData_type_size_copy_(ks, CTYPE_uint8_t, size, 1);
0
   
0
     if (UArray_beginsWith_(k, IoSeq_rawUArray(prefix)))
0
     {
0
+ //printf("before clip '%s'\n", UArray_bytes(k));
0
       UArray_clipBeforeEndOf_(k, IoSeq_rawUArray(prefix));
0
+ UArray_removeFirst(k); // remove separator
0
+ //printf("after clip '%s'\n", UArray_bytes(k));
0
       return IoSeq_newWithUArray_copy_(IOSTATE, k, 0);
0
     }
0
 
...
13
14
15
16
 
17
18
19
 
20
21
22
 
23
24
25
26
 
27
28
29
30
31
 
 
 
32
33
34
35
36
37
38
 
 
 
39
40
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
43
44
...
49
50
51
 
 
 
 
52
53
54
55
56
 
 
57
58
59
60
 
 
61
62
63
64
65
66
 
 
67
68
69
...
13
14
15
 
16
17
18
 
19
20
21
 
22
23
24
25
 
26
27
28
 
 
 
29
30
31
32
33
34
35
 
 
 
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
...
83
84
85
86
87
88
89
90
91
92
 
 
93
94
95
96
 
 
97
98
99
100
101
102
 
 
103
104
105
106
107
0
@@ -13,32 +13,66 @@ TokyoCabinetTest := UnitTest clone do(
0
     assertEquals(nil, db at("foo"))
0
     
0
     db begin
0
- db atPut("a", "1")
0
+ db atPut("001/a", "1")
0
     db commit
0
     
0
- assertEquals("1", db at("a"))
0
+ assertEquals("1", db at("001/a"))
0
     
0
     db begin
0
- db atPut("b", "2")
0
+ db atPut("001/b", "2")
0
     db commit
0
     
0
     db begin
0
- db atPut("c", "3")
0
+ db atPut("001/c", "3")
0
     db commit
0
     
0
- assertEquals("3", db at("c"))
0
- assertEquals("2", db at("b"))
0
- assertEquals("1", db at("a"))
0
+ assertEquals("3", db at("001/c"))
0
+ assertEquals("2", db at("001/b"))
0
+ assertEquals("1", db at("001/a"))
0
     
0
     db close
0
     db open("test.db")
0
     
0
- assertEquals("1", db at("a"))
0
- assertEquals("2", db at("b"))
0
- assertEquals("3", db at("c"))
0
+ assertEquals("1", db at("001/a"))
0
+ assertEquals("2", db at("001/b"))
0
+ assertEquals("3", db at("001/c"))
0
     
0
     c := db cursor
0
     c first
0
+ assertEquals("001/a", c key)
0
+ assertEquals("1", c value)
0
+
0
+ c next
0
+ assertEquals("001/b", c key)
0
+ assertEquals("2", c value)
0
+
0
+ c next
0
+ assertEquals("001/c", c key)
0
+ assertEquals("3", c value)
0
+ c close
0
+
0
+ /*
0
+ db begin
0
+ db removeAt("001/a")
0
+ db removeAt("001/b")
0
+ db commit
0
+
0
+ assertEquals(nil, db at("001/a"))
0
+ assertEquals(nil, db at("001/b"))
0
+
0
+ db close
0
+ db open("test.db")
0
+
0
+ assertEquals(nil, db at("001/a"))
0
+ assertEquals(nil, db at("001/b"))
0
+
0
+ db close
0
+ */
0
+
0
+ // --------------------------------
0
+
0
+ c := db prefixCursor setPrefix("001")
0
+ c first
0
     assertEquals("a", c key)
0
     assertEquals("1", c value)
0
     
0
@@ -49,21 +83,25 @@ TokyoCabinetTest := UnitTest clone do(
0
     c next
0
     assertEquals("c", c key)
0
     assertEquals("3", c value)
0
+
0
+ c next
0
+ assertEquals(nil, c key)
0
+ assertEquals(nil, c value)
0
     c close
0
     
0
     db begin
0
- db removeAt("a")
0
- db removeAt("b")
0
+ db removeAt("001/a")
0
+ db removeAt("001/b")
0
     db commit
0
     
0
- assertEquals(nil, db at("a"))
0
- assertEquals(nil, db at("b"))
0
+ assertEquals(nil, db at("001/a"))
0
+ assertEquals(nil, db at("001/b"))
0
     
0
     db close
0
     db open("test.db")
0
     
0
- assertEquals(nil, db at("a"))
0
- assertEquals(nil, db at("b"))
0
+ assertEquals(nil, db at("001/a"))
0
+ assertEquals(nil, db at("001/b"))
0
     
0
     db close
0
   )

Comments

    No one has commented yet.