techrec.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. import logging
  2. import sys
  3. import datetime
  4. import json
  5. import yaml
  6. try:
  7. from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean
  8. from sqlalchemy.orm import sessionmaker
  9. from sqlalchemy.ext.declarative import declarative_base
  10. except:
  11. sys.exit("No SQLAlchemy.")
  12. logging.basicConfig(level=logging.INFO)
  13. STATE_ACTIVE = 0
  14. STATE_RUN = 1
  15. STATE_DOWN = 2
  16. PAGESIZE = 10
  17. """
  18. This class describe a single Record (Rec() class) and the
  19. records manager (RecDB() class)
  20. """
  21. Base = declarative_base()
  22. """
  23. Rec entry
  24. """
  25. class Rec(Base):
  26. __tablename__ = 'rec'
  27. id = Column(Integer, primary_key=True)
  28. recid = Column(String)
  29. name = Column(String, nullable = True)
  30. starttime = Column(DateTime, nullable = True)
  31. endtime = Column(DateTime, nullable = True)
  32. active = Column(Boolean, default = True)
  33. def __init__(self, recid="", name="", starttime=None, endtime=None, asjson=""):
  34. self.error = 0
  35. self.job = None
  36. if len(asjson) == 0:
  37. self.name = name
  38. self.starttime = starttime
  39. self.endtime = endtime
  40. self.recid = recid
  41. else:
  42. #try:
  43. # dec = json.loads( unicode(asjson) )
  44. # dec = yaml.load( asjson )
  45. dec = json.dumps( asjson )
  46. # except:
  47. # self.error = 0
  48. print("dec %s %s" % (dec,type(dec)))
  49. print("asjson %s %s" % (asjson,type(asjson)))
  50. self.recid = asjson[0]['recid']
  51. self.name = asjson[0]['name']
  52. self.starttime = asjson[0]['starttime']
  53. self.endtime = asjson[0]['endtime']
  54. self.state = STATE_ACTIVE
  55. # launch the job for processing files
  56. def start(self):
  57. self.job = RecJob( self )
  58. """
  59. def getvalues(self,val=None):
  60. return { "id":self.id,
  61. "recid":self.recid,
  62. "name":self.name,
  63. "starttime":self.starttime,
  64. "endtime":self.endtime,
  65. "active": self.active
  66. }
  67. """
  68. def err(self):
  69. return self.error
  70. def set_run(self):
  71. self.active = STATE_RUN
  72. def set_done(self):
  73. self.active = STATE_DOWN
  74. def __repr__(self):
  75. return "<Rec(id:'%s',recid:'%s',name:'%s',Start: '%s',End: '%s',Active: '%s')>" \
  76. % (self.id, self.recid, self.name, self.starttime, self.endtime, self.active)
  77. """ ************
  78. RecDB
  79. ************ """
  80. class RecDB:
  81. def __init__(self):
  82. self.engine = create_engine('sqlite:///techrec.db', echo=False)
  83. self.conn = self.engine.connect()
  84. logging.getLogger('sqlalchemy.engine').setLevel(logging.FATAL)
  85. logging.getLogger('sqlalchemy.engine.base.Engine').setLevel(logging.FATAL)
  86. logging.getLogger('sqlalchemy.dialects').setLevel(logging.FATAL)
  87. logging.getLogger('sqlalchemy.pool').setLevel(logging.FATAL)
  88. logging.getLogger('sqlalchemy.orm').setLevel(logging.FATAL)
  89. Base.metadata.create_all(self.engine) # create Database
  90. Session = sessionmaker(bind=self.engine)
  91. self.session = Session()
  92. self.err = ""
  93. self.recordtimeformat = "%Y/%m/%d %H:%M:%S"
  94. def add(self, simplerecord):
  95. print self.session.add( simplerecord )
  96. self.commit()
  97. logging.info("New Record: %s" % simplerecord)
  98. return ( simplerecord )
  99. """"
  100. UPDATE RECORD
  101. """
  102. def update(self, recid, rec):
  103. _rlist = self._search(recid=recid)
  104. if not len(_rlist) == 1:
  105. return False
  106. logging.info("DB:: Update request %s:%s " % (recid, rec))
  107. logging.info("DB:: Update: data before %s" % _rlist[0])
  108. # 2013-11-24 22:22:42
  109. _rlist[0].starttime = datetime.datetime.strptime(rec["starttime"], self.recordtimeformat)
  110. _rlist[0].endtime = datetime.datetime.strptime(rec["endtime"], self.recordtimeformat)
  111. _rlist[0].name = rec["name"]
  112. logging.info("DB:: Update: data AFTER %s" % _rlist[0])
  113. self.commit()
  114. logging.info("DB:: Update complete")
  115. return True
  116. """"
  117. DELETE RECORD
  118. """
  119. def delete(self,_id):
  120. _rlist = self._search(_id=_id)
  121. if len(_rlist) == 0:
  122. logging.info("DB: Delete: no record found!")
  123. self.err = "No rec found"
  124. return False
  125. if len(_rlist) > 1:
  126. logging.info("DB: Delete: multilpe records found!")
  127. self.err = "multiple ID Found %s" % (_rlist)
  128. return False
  129. self.session.delete( _rlist[0] )
  130. logging.info("DB: Delete: delete complete")
  131. self.commit()
  132. return True
  133. def commit(self):
  134. logging.info("DB: Commit!!")
  135. self.session.commit()
  136. def get_all(self, page=0, page_size=PAGESIZE):
  137. return self._search(page=page, page_size=page_size)
  138. def _search(self, _id=None, name=None, recid=None, starttime=None, endtime=None, active=None, page=0, page_size=PAGESIZE):
  139. logging.info("DB: Search => id:%s recid:%s name:%s starttime:%s endtime=%s active=%s" % (_id,recid,name,starttime,endtime,active))
  140. query = self.session.query(Rec)
  141. if not _id == None: query = query.filter_by(id=_id)
  142. if not recid == None: query = query.filter_by(recid=recid)
  143. if not name == None: query = query.filter(Rec.name.like("%"+name+"%"))
  144. try:
  145. if not starttime == None:
  146. _st = datetime.datetime.strptime(starttime, self.recordtimeformat)
  147. query = query.filter(Rec.starttime > _st )
  148. except:
  149. logging.info("DB: search : no valid starttime")
  150. try:
  151. if not endtime == None:
  152. _et = datetime.datetime.strptime(endtime, self.recordtimeformat)
  153. query = query.filter(Rec.endtime < _et )
  154. except ValueError:
  155. logging.info("DB: search : no valid endtime")
  156. if not active == None: query = query.filter(Rec.active==active)
  157. if page_size: query = query.limit(page_size)
  158. if page: query = query.offset(page*page_size)
  159. print query
  160. ret = query.all()
  161. # print "Sending: %s" % ret
  162. return ret
  163. def get_err(self):
  164. print "DB error: %s" % (self.err)
  165. t = self.err
  166. self.err = ""
  167. return t
  168. """def get_by_id(self,id):
  169. try:
  170. return self._search( _id=id )[0]
  171. except:
  172. return None
  173. """
  174. # Just for debug
  175. def printall( queryres ):
  176. for record in queryres: print "Record: %s" % record
  177. # Job in thread
  178. class RecJob():
  179. def __init__(self, rec):
  180. print "Estraggo %s Start:%s, End:%s" % (rec.name, rec.starttime, rec.endtime)
  181. self.fdir = "/rec/ror/"
  182. self.fnameformat = "ror-%Y-%m-%d-%H-00-00.mp3"
  183. self.name = rec.name
  184. self.starttime = rec.starttime
  185. self.endtime = rec.endtime
  186. def extract(self):
  187. if type(self.starttime) != type(datetime.datetime.now()):
  188. logging.info("Starttime format error")
  189. return
  190. if type(self.endtime) != type(datetime.datetime.now()):
  191. logging.info("Endtime format error")
  192. return
  193. if self.starttime >= self.endtime:
  194. logging.info("Starttime > Endtime (%s > %s)" % (self.starttime,self.endtime) )
  195. return
  196. start = self.starttime
  197. end = self.endtime
  198. app = self.starttime
  199. while True:
  200. print
  201. print "**** From file %s take:" % ( self._get_recfile(start) )
  202. nexth = self._truncate(start) + datetime.timedelta(minutes=60)
  203. if start > self._truncate(start):
  204. print "FROM: %s for %s seconds" % (start - self._truncate(start), nexth - start )
  205. if end < self._truncate(nexth):
  206. print "FROM: %s for %s seconds" % (0, end - self._truncate(start) )
  207. else:
  208. print "FROM: %s for 0 to 60." % (self._get_recfile(start))
  209. if nexth >= end:
  210. print "FINITO"
  211. print "Start ", start, " end: ", end
  212. break;
  213. start = nexth
  214. def _truncate(self, mytime):
  215. return datetime.datetime(mytime.year,mytime.month,mytime.day,mytime.hour)
  216. def _get_recfile(self, mytime):
  217. return "%s/%s" % (self.fdir,mytime.strftime(self.fnameformat))
  218. def __repr__(self):
  219. return "%s: %s (%s) => %s (%s)" % ( self.name, self.starttime, type(self.starttime) ,self.endtime, type(self.endtime))
  220. """
  221. TEST
  222. """
  223. if __name__ == "__main__":
  224. db = RecDB()
  225. _mytime = datetime.datetime(2014,05,24,15,12,17)
  226. _endtime = datetime.datetime(2014,05,24,17,45,17)
  227. a = Rec(name="Mimmo1", starttime=_mytime, endtime=_endtime)
  228. j = RecJob( a )
  229. # print (j)
  230. # j.extract()
  231. printall( db._search() )
  232. sys.exit("End test job")
  233. # a = Rec(name="Mimmo1", starttime=_mytime, endtime=None)
  234. print "Aggiunto", db.add( a )
  235. printall( db.get_all(page_size=5,page=0) )
  236. print "Mimmo "
  237. printall( db._search(name="Mimmo1"))
  238. print "Search"
  239. printall( db._search(name="Mimmo1",starttime=datetime.datetime(2014,05,24,15,16,1) ))
  240. a = db.get_by_id(5)
  241. a.start()
  242. db.delete(1)
  243. db.delete(2)
  244. db.delete(4)
  245. db.delete(1)
  246. printall( db._search() )