initial orm for sqlite state
parent
4cb44525dc
commit
ce4e8b57c5
|
@ -1,3 +1,4 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from .run import sins, generation
|
from .run import sins
|
||||||
# from .orm import SeedNode
|
from .mutation import generation, flip, seed_shell
|
||||||
|
from .orm import db_config, ScrapNode
|
||||||
|
|
34
sins/orm.py
34
sins/orm.py
|
@ -1,19 +1,26 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from sqlalchemy import Blob, Column, ForeignKey, Integer, String, DateTime, create_engine, exists, desc
|
from hashlib import sha1
|
||||||
|
from pathlib import Path
|
||||||
|
from sqlalchemy import LargeBinary, Column, ForeignKey, Integer, String, DateTime, create_engine
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.orm import Session, relationship, backref
|
from sqlalchemy.orm import Session, relationship, backref
|
||||||
from sqlalchemy.orm.collections import attribute_mapped_collection
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
import logging
|
import logging
|
||||||
from hashlib import sha1
|
|
||||||
|
|
||||||
logger = logging.getLogger('sins')
|
logger = logging.getLogger('sins')
|
||||||
now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
|
now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
|
def db_config(path: Path) -> Session:
|
||||||
|
engine = create_engine(f'sqlite:///{path.resolve()}', native_datetime=True)
|
||||||
|
Base.metadata.create_all(engine)
|
||||||
|
session = Session(engine)
|
||||||
|
return session
|
||||||
|
|
||||||
class SeedNode(Base):
|
class ScrapNode(Base):
|
||||||
|
__tablename__ = 'scrap_node'
|
||||||
ctime = Column(DateTime, default=datetime.utcnow)
|
ctime = Column(DateTime, default=datetime.utcnow)
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
length = Column(Integer, default=0)
|
length = Column(Integer, default=0)
|
||||||
|
@ -21,20 +28,29 @@ class SeedNode(Base):
|
||||||
parent_id = Column(Integer, ForeignKey(id))
|
parent_id = Column(Integer, ForeignKey(id))
|
||||||
checksum = Column(String)
|
checksum = Column(String)
|
||||||
stdout = Column(String)
|
stdout = Column(String)
|
||||||
image = Column(Blob)
|
image = Column(LargeBinary)
|
||||||
|
|
||||||
children = relationship(
|
children = relationship(
|
||||||
"SeedNode",
|
"ScrapNode",
|
||||||
cascade="all, delete-orphan",
|
cascade="all, delete-orphan",
|
||||||
backref=backref("parent", remote_side=id),
|
backref=backref("parent", remote_side=id),
|
||||||
collection_class=attribute_mapped_collection('name'))
|
collection_class=attribute_mapped_collection('name'))
|
||||||
|
|
||||||
def __init__(self, *, child: bytes, parent: SeedNode = None):
|
def __init__(self, *, child: bytes, parent_id: int = None):
|
||||||
if parent:
|
self.parent_id = parent_id
|
||||||
self.parent_id = parent.id
|
|
||||||
|
|
||||||
self.image = child
|
self.image = child
|
||||||
self.length = len(child)
|
self.length = len(child)
|
||||||
|
self.sha1sum
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
values = {
|
||||||
|
'id': self.id,
|
||||||
|
'checksum': self.checksum,
|
||||||
|
'length': self.length,
|
||||||
|
'parent_id': self.parent_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
return str(values)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sha1sum(self):
|
def sha1sum(self):
|
||||||
|
|
46
sins/run.py
46
sins/run.py
|
@ -4,9 +4,12 @@ from datetime import datetime
|
||||||
from multiprocessing import Process, Queue
|
from multiprocessing import Process, Queue
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from queue import Empty
|
from queue import Empty
|
||||||
|
from sqlalchemy import exists, desc
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from .mutation import generation, flip, seed_shell
|
from .mutation import generation, flip, seed_shell
|
||||||
|
from .orm import db_config, ScrapNode
|
||||||
|
|
||||||
|
|
||||||
def sins():
|
def sins():
|
||||||
|
@ -53,19 +56,47 @@ def sins():
|
||||||
with seed.open('rb') as seed_file:
|
with seed.open('rb') as seed_file:
|
||||||
seed_data = seed_file.read()
|
seed_data = seed_file.read()
|
||||||
|
|
||||||
logger.info(f'seed:\n{seed_data}')
|
seed = ScrapNode(child=seed_data)
|
||||||
|
|
||||||
|
logger.info(f'seed:\n{seed}')
|
||||||
|
|
||||||
|
if args.output:
|
||||||
|
db_path = Path(f'{args.output}/sins.sqlite')
|
||||||
|
else:
|
||||||
|
temp_dir = TemporaryDirectory()
|
||||||
|
db_path = Path(f'{temp_dir.name}/sins.sqlite')
|
||||||
|
|
||||||
|
session = db_config(db_path)
|
||||||
|
logger.info(f'db_path: {db_path}')
|
||||||
|
|
||||||
|
if args.seed:
|
||||||
|
exists = session.query(ScrapNode).filter(ScrapNode.checksum == seed.checksum)
|
||||||
|
|
||||||
|
if exists:
|
||||||
|
seed = exists[0]
|
||||||
|
|
||||||
|
else:
|
||||||
|
session.add(seed)
|
||||||
|
session.commit()
|
||||||
|
else:
|
||||||
|
recent = session.query(ScrapNode).order_by(desc('ctime')).first()
|
||||||
|
|
||||||
|
if recent:
|
||||||
|
seed = recent
|
||||||
|
|
||||||
|
parent = seed
|
||||||
|
|
||||||
queue = Queue()
|
queue = Queue()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
lineage = 0
|
lineage = 0
|
||||||
seed_flipped = flip(seed_data)
|
scrap = flip(parent.image)
|
||||||
|
|
||||||
while lineage < args.lineage:
|
while lineage < args.lineage:
|
||||||
logger.info(f'lineage: {lineage}')
|
logger.info(f'lineage: {lineage}')
|
||||||
result = None
|
result = None
|
||||||
|
|
||||||
proc = Process(target=generation, args=(queue, seed_flipped))
|
proc = Process(target=generation, args=(queue, scrap))
|
||||||
proc.start()
|
proc.start()
|
||||||
try:
|
try:
|
||||||
result = queue.get(timeout=1)
|
result = queue.get(timeout=1)
|
||||||
|
@ -77,7 +108,10 @@ def sins():
|
||||||
lineage += 1
|
lineage += 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
logger.info(f'scrap:\n{seed_flipped}')
|
parent = ScrapNode(child=scrap, parent_id=parent.id)
|
||||||
logger.info(f'result: {result}')
|
parent.length = result
|
||||||
|
session.add(seed)
|
||||||
|
session.commit()
|
||||||
|
logger.info(f'scrap:\n{parent}')
|
||||||
lineage = 0
|
lineage = 0
|
||||||
seed_flipped = flip(seed_flipped)
|
scrap = flip(parent.image)
|
||||||
|
|
Loading…
Reference in New Issue