1
1
# coding: utf-8
2
- # Copyright 2012 litl, LLC. All Rights Reserved.
3
-
4
- __version__ = "1.0.0"
2
+ # Copyright 2012-2015 litl, LLC. All Rights Reserved.
5
3
6
4
import abc
7
5
import itertools
8
6
import logging
9
7
import os
10
8
import sqlite3
11
9
10
+ __version__ = "1.1.0"
11
+
12
12
logger = logging .getLogger (__name__ )
13
13
14
14
__all__ = ["SQLiteStore" , "KVStore" ]
15
15
16
+ import sys
17
+ if sys .version_info < (3 ,):
18
+ def b (x ):
19
+ return x
20
+
21
+ def un_b (x ):
22
+ return x
23
+ else :
24
+ import codecs
25
+
26
+ def b (x ):
27
+ return codecs .latin_1_encode (x )[0 ]
28
+
29
+ def un_b (x ):
30
+ return codecs .latin_1_decode (x )[0 ]
31
+
16
32
17
33
class KVStore (object ):
18
34
"""An abstract key-value interface with support for range iteration."""
@@ -244,7 +260,7 @@ def __init__(self, path):
244
260
self .conn = sqlite3 .connect (path )
245
261
246
262
# Don't create unicode objects for retrieved values
247
- self .conn .text_factory = buffer
263
+ self .conn .text_factory = memoryview
248
264
249
265
# Disable the SQLite cache. Its pages tend to get swapped
250
266
# out, even if the database file is in buffer cache.
@@ -284,15 +300,16 @@ def get(self, key, default=None):
284
300
q = "SELECT value FROM kv WHERE key = ?"
285
301
c = self .conn .cursor ()
286
302
287
- row = c .execute (q , (sqlite3 .Binary (key ),)).fetchone ()
303
+ row = c .execute (q , (sqlite3 .Binary (b ( key ) ),)).fetchone ()
288
304
if not row :
289
305
return default
290
306
291
- return bytes (row [0 ])
307
+ return un_b ( bytes (row [0 ]) )
292
308
293
309
def put (self , key , value ):
294
310
q = "INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)"
295
- self .conn .execute (q , (sqlite3 .Binary (key ), sqlite3 .Binary (value )))
311
+ self .conn .execute (q ,
312
+ (sqlite3 .Binary (b (key )), sqlite3 .Binary (b (value ))))
296
313
self .conn .commit ()
297
314
298
315
def put_many (self , items ):
@@ -301,14 +318,15 @@ def put_many(self, items):
301
318
302
319
blob = sqlite3 .Binary
303
320
for batch in ibatch (items , 30000 ):
304
- items = ((blob (key ), blob (value )) for key , value in batch )
321
+ items = ((blob (b (key )), blob (b (value )))
322
+ for key , value in batch )
305
323
306
324
c .executemany (q , items )
307
325
self .conn .commit ()
308
326
309
327
def delete (self , key ):
310
328
q = "DELETE FROM kv WHERE key = ?"
311
- self .conn .execute (q , (sqlite3 .Binary (key ),))
329
+ self .conn .execute (q , (sqlite3 .Binary (b ( key ) ),))
312
330
self .conn .commit ()
313
331
314
332
def delete_many (self , keys ):
@@ -317,19 +335,23 @@ def delete_many(self, keys):
317
335
318
336
blob = sqlite3 .Binary
319
337
for batch in ibatch (keys , 30000 ):
320
- items = ((blob (key ),) for key in batch )
338
+ items = ((blob (b ( key ) ),) for key in batch )
321
339
322
340
c .executemany (q , items )
323
341
self .conn .commit ()
324
342
325
343
def _range_where (self , key_from = None , key_to = None ):
326
344
if key_from is not None and key_to is None :
345
+ key_from = b (key_from )
327
346
return "WHERE key >= :key_from"
328
347
329
348
if key_from is None and key_to is not None :
349
+ key_to = b (key_to )
330
350
return "WHERE key <= :key_to"
331
351
332
352
if key_from is not None and key_to is not None :
353
+ key_from = b (key_from )
354
+ key_to = b (key_to )
333
355
return "WHERE key BETWEEN :key_from AND :key_to"
334
356
335
357
return ""
@@ -339,25 +361,25 @@ def items(self, key_from=None, key_to=None):
339
361
% self ._range_where (key_from , key_to )
340
362
341
363
if key_from is not None :
342
- key_from = sqlite3 .Binary (key_from )
364
+ key_from = sqlite3 .Binary (b ( key_from ) )
343
365
344
366
if key_to is not None :
345
- key_to = sqlite3 .Binary (key_to )
367
+ key_to = sqlite3 .Binary (b ( key_to ) )
346
368
347
369
c = self .conn .cursor ()
348
370
for key , value in c .execute (q , dict (key_from = key_from , key_to = key_to )):
349
- yield bytes (key ), bytes (value )
371
+ yield un_b ( bytes (key )), un_b ( bytes (value ) )
350
372
351
373
def keys (self , key_from = None , key_to = None ):
352
374
q = "SELECT key FROM kv %s ORDER BY key " \
353
375
% self ._range_where (key_from , key_to )
354
376
355
377
if key_from is not None :
356
- key_from = sqlite3 .Binary (key_from )
378
+ key_from = sqlite3 .Binary (b ( key_from ) )
357
379
358
380
if key_to is not None :
359
- key_to = sqlite3 .Binary (key_to )
381
+ key_to = sqlite3 .Binary (b ( key_to ) )
360
382
361
383
c = self .conn .cursor ()
362
384
for key , in c .execute (q , dict (key_from = key_from , key_to = key_to )):
363
- yield bytes (key )
385
+ yield un_b ( bytes (key ) )
0 commit comments