__init__.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # Copyright (C) 2018-2019 Garmin Ltd.
  2. #
  3. # SPDX-License-Identifier: GPL-2.0-only
  4. #
  5. from contextlib import closing
  6. import re
  7. import sqlite3
  8. UNIX_PREFIX = "unix://"
  9. ADDR_TYPE_UNIX = 0
  10. ADDR_TYPE_TCP = 1
  11. def setup_database(database, sync=True):
  12. db = sqlite3.connect(database)
  13. db.row_factory = sqlite3.Row
  14. with closing(db.cursor()) as cursor:
  15. cursor.execute('''
  16. CREATE TABLE IF NOT EXISTS tasks_v2 (
  17. id INTEGER PRIMARY KEY AUTOINCREMENT,
  18. method TEXT NOT NULL,
  19. outhash TEXT NOT NULL,
  20. taskhash TEXT NOT NULL,
  21. unihash TEXT NOT NULL,
  22. created DATETIME,
  23. -- Optional fields
  24. owner TEXT,
  25. PN TEXT,
  26. PV TEXT,
  27. PR TEXT,
  28. task TEXT,
  29. outhash_siginfo TEXT,
  30. UNIQUE(method, outhash, taskhash)
  31. )
  32. ''')
  33. cursor.execute('PRAGMA journal_mode = WAL')
  34. cursor.execute('PRAGMA synchronous = %s' % ('NORMAL' if sync else 'OFF'))
  35. # Drop old indexes
  36. cursor.execute('DROP INDEX IF EXISTS taskhash_lookup')
  37. cursor.execute('DROP INDEX IF EXISTS outhash_lookup')
  38. # Create new indexes
  39. cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup_v2 ON tasks_v2 (method, taskhash, created)')
  40. cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup_v2 ON tasks_v2 (method, outhash)')
  41. return db
  42. def parse_address(addr):
  43. if addr.startswith(UNIX_PREFIX):
  44. return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX):],))
  45. else:
  46. m = re.match(r'\[(?P<host>[^\]]*)\]:(?P<port>\d+)$', addr)
  47. if m is not None:
  48. host = m.group('host')
  49. port = m.group('port')
  50. else:
  51. host, port = addr.split(':')
  52. return (ADDR_TYPE_TCP, (host, int(port)))
  53. def create_server(addr, dbname, *, sync=True):
  54. from . import server
  55. db = setup_database(dbname, sync=sync)
  56. s = server.Server(db)
  57. (typ, a) = parse_address(addr)
  58. if typ == ADDR_TYPE_UNIX:
  59. s.start_unix_server(*a)
  60. else:
  61. s.start_tcp_server(*a)
  62. return s
  63. def create_client(addr):
  64. from . import client
  65. c = client.Client()
  66. (typ, a) = parse_address(addr)
  67. if typ == ADDR_TYPE_UNIX:
  68. c.connect_unix(*a)
  69. else:
  70. c.connect_tcp(*a)
  71. return c