149 lines
4.5 KiB
Python
149 lines
4.5 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
from __init__ import *
|
||
|
|
||
|
class RangeIterable(VTableIterable):
|
||
|
def __init__(self, start=0, stop=float('inf'), step=1):
|
||
|
self.start = start
|
||
|
self.stop = stop
|
||
|
self.step = step
|
||
|
self.curr = self.start
|
||
|
def __iter__(self):
|
||
|
print(self.__class__.__name__, self)
|
||
|
return self
|
||
|
def __next__(self):
|
||
|
if self.curr <= self.stop:
|
||
|
res = self.curr
|
||
|
self.curr += self.step
|
||
|
return (res,)
|
||
|
else:
|
||
|
raise StopIteration
|
||
|
|
||
|
class RangeIterableGenerator(VTableIterable):
|
||
|
def __init__(self, start=0, stop=float('inf'), step=1):
|
||
|
self.start = start
|
||
|
self.stop = stop
|
||
|
self.step = step
|
||
|
def __iter__(self):
|
||
|
print(self.__class__.__name__, self)
|
||
|
curr = self.start
|
||
|
while curr <= self.stop:
|
||
|
yield (curr,)
|
||
|
curr += self.step
|
||
|
|
||
|
class RangeIterableMember(object):
|
||
|
def __init__(self, extra):
|
||
|
self.extra = extra
|
||
|
@vtab_iterable(name='RangeIterableMember')
|
||
|
def generator(self, start=0, stop=float('inf'), step=1):
|
||
|
print(self.__class__.__name__, self, self.generator, self.extra)
|
||
|
for curr in range(start, stop, step):
|
||
|
yield (curr,)
|
||
|
|
||
|
class RangeIterableFancy(VTableIterable):
|
||
|
_vtname_ = 'RangeIterableRenamed'
|
||
|
_vtparams_ = ('start', 'stop', 'step', 'extra')
|
||
|
_vtcolumns_ = ('once', 'twice', 'thrice')
|
||
|
def __init__(self, start=0, stop=float('inf'), step=1, **kw):
|
||
|
self.start = start
|
||
|
self.stop = stop
|
||
|
self.step = step
|
||
|
self.kw = kw
|
||
|
def __iter__(self):
|
||
|
print(self.__class__.__name__, self, self.kw)
|
||
|
curr = self.start
|
||
|
while curr <= self.stop:
|
||
|
yield (curr, curr*2, curr*3)
|
||
|
curr += self.step
|
||
|
|
||
|
@vtab_iterable
|
||
|
def RangeGenerator(start=0, stop=float('inf'), step=1):
|
||
|
print(RangeGenerator.__name__, RangeGenerator)
|
||
|
for curr in range(start, stop, step):
|
||
|
yield (curr,)
|
||
|
|
||
|
@vtab_iterable(name='RangeGeneratorRenamed', params=('start', 'stop', 'step', 'extra'), columns=('once', 'twice', 'thrice'))
|
||
|
def RangeGeneratorFancy(start=0, stop=float('inf'), step=1, **kw):
|
||
|
print(RangeGeneratorFancy.__name__, RangeGeneratorFancy, kw)
|
||
|
for curr in range(start, stop, step):
|
||
|
yield (curr, curr*2, curr*3)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
import sqlite3
|
||
|
|
||
|
conn = sqlite3.connect(':memory:')
|
||
|
pDB = connect(conn)
|
||
|
|
||
|
conn.execute('CREATE TABLE test (a INTEGER, b INTEGER)')
|
||
|
conn.execute('INSERT INTO test (a, b) VALUES (?, ?)', (1, 2))
|
||
|
conn.execute('INSERT INTO test (a, b) VALUES (?, ?)', (3, 4))
|
||
|
conn.execute('INSERT INTO test (a, b) VALUES (?, ?)', (5, 6))
|
||
|
conn.execute('INSERT INTO test (a, b) VALUES (?, ?)', (7, 8))
|
||
|
|
||
|
for row in conn.execute('SELECT * FROM test'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM test'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
for row in conn.execute('SELECT * FROM test WHERE a = ?', (1,)):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM test WHERE a = ?', (1,)):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
RangeIterable.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeIterable(10, 16, 2)'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeIterable(10, 16, 2)'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
RangeIterableGenerator.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeIterableGenerator(20, 26, 2)'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeIterableGenerator(20, 26, 2)'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
obj = RangeIterableMember('hello')
|
||
|
obj.generator.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeIterableMember(30, 36, 2)'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeIterableMember(30, 36, 2)'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
RangeIterableFancy.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeIterableRenamed(40, 46, 2, datetime())'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeIterableRenamed(40, 46, 2, datetime())'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
RangeGenerator.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeGenerator(50, 56, 2)'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeGenerator(50, 56, 2)'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
RangeGeneratorFancy.register(conn)
|
||
|
for row in conn.execute('SELECT * FROM RangeGeneratorRenamed(60, 66, 2, datetime())'):
|
||
|
print('sqlite3:', row)
|
||
|
for row in pDB.execute('SELECT * FROM RangeGeneratorRenamed(60, 66, 2, datetime())'):
|
||
|
print('tricks:', row)
|
||
|
print()
|
||
|
|
||
|
import hashlib
|
||
|
|
||
|
async def md5sum(t):
|
||
|
return hashlib.md5(str(t).encode('utf-8')).hexdigest()
|
||
|
|
||
|
create_function(conn, 'md5', 1, md5sum)
|
||
|
|
||
|
for row in conn.execute('SELECT md5(value) FROM RangeIterable(10, 16, 2)'):
|
||
|
print(row)
|
||
|
for row in pDB.execute('SELECT md5(value) AS md5_value FROM RangeIterable(10, 16, 2)'):
|
||
|
print(row)
|