log.schema 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. CREATE TABLE IF NOT EXISTS seen_hosts (
  2. id INTEGER PRIMARY KEY AUTOINCREMENT,
  3. ip_address TEXT NOT NULL UNIQUE
  4. );
  5. CREATE TABLE IF NOT EXISTS seen_users (
  6. id INTEGER PRIMARY KEY AUTOINCREMENT,
  7. user TEXT NOT NULL UNIQUE
  8. );
  9. CREATE TABLE IF NOT EXISTS seen_routes (
  10. id INTEGER PRIMARY KEY AUTOINCREMENT,
  11. route TEXT NOT NULL,
  12. method TEXT NOT NULL,
  13. UNIQUE(route, method)
  14. );
  15. CREATE TABLE IF NOT EXISTS response_code (
  16. id INTEGER PRIMARY KEY AUTOINCREMENT,
  17. code INTEGER NOT NULL UNIQUE
  18. );
  19. CREATE TABLE IF NOT EXISTS referer (
  20. id INTEGER PRIMARY KEY AUTOINCREMENT,
  21. referer TEXT NOT NULL UNIQUE
  22. );
  23. CREATE TABLE IF NOT EXISTS ua (
  24. id INTEGER PRIMARY KEY AUTOINCREMENT,
  25. ua TEXT NOT NULL UNIQUE
  26. );
  27. CREATE TABLE IF NOT EXISTS requests (
  28. id INTEGER PRIMARY KEY,
  29. uuid TEXT NOT NULL UNIQUE,
  30. date INTEGER NOT NULL,
  31. host_id INTEGER NOT NULL REFERENCES seen_hosts(id) ON DELETE CASCADE,
  32. user_id INTEGER NOT NULL REFERENCES seen_users(id) ON DELETE CASCADE,
  33. route_id INTEGER NOT NULL REFERENCES seen_routes(id) ON DELETE CASCADE,
  34. referer_id INTEGER NOT NULL REFERENCES referer(id) ON DELETE CASCADE,
  35. ua_id INTEGER NOT NULL REFERENCES ua(id) ON DELETE CASCADE,
  36. response_code_id INTEGER NOT NULL REFERENCES response_code(id) ON DELETE RESTRICT
  37. );
  38. /* Urchin stuff - it's powerful to be able to do things in backend based on campaign, even if you use a JS frontend. */
  39. CREATE TABLE IF NOT EXISTS urchin_source (
  40. id INTEGER PRIMARY KEY AUTOINCREMENT,
  41. value TEXT NOT NULL UNIQUE
  42. );
  43. CREATE TABLE IF NOT EXISTS urchin_medium (
  44. id INTEGER PRIMARY KEY AUTOINCREMENT,
  45. value TEXT NOT NULL UNIQUE
  46. );
  47. CREATE TABLE IF NOT EXISTS urchin_campaign (
  48. id INTEGER PRIMARY KEY AUTOINCREMENT,
  49. value TEXT NOT NULL UNIQUE
  50. );
  51. CREATE TABLE IF NOT EXISTS urchin_term (
  52. id INTEGER PRIMARY KEY AUTOINCREMENT,
  53. value TEXT NOT NULL UNIQUE
  54. );
  55. CREATE TABLE IF NOT EXISTS urchin_content (
  56. id INTEGER PRIMARY KEY AUTOINCREMENT,
  57. value TEXT NOT NULL UNIQUE
  58. );
  59. CREATE TABLE IF NOT EXISTS urchin (
  60. id INTEGER PRIMARY KEY AUTOINCREMENT,
  61. request_id INTEGER NOT NULL UNIQUE REFERENCES requests(id) ON DELETE CASCADE,
  62. source_id INTEGER NOT NULL REFERENCES urchin_source(id) ON DELETE CASCADE,
  63. medium_id INTEGER REFERENCES urchin_medium(id) ON DELETE CASCADE,
  64. campaign_id INTEGER REFERENCES urchin_campaign(id) ON DELETE CASCADE,
  65. term_id INTEGER REFERENCES urchin_term(id) ON DELETE CASCADE,
  66. content_id INTEGER REFERENCES urchin_content(id) ON DELETE CASCADE
  67. );
  68. CREATE VIEW IF NOT EXISTS urchin_requests AS
  69. SELECT
  70. u.id,
  71. r.uuid AS request_uuid,
  72. us.value AS utm_source,
  73. um.value AS utm_medium,
  74. uc.value AS utm_campaign,
  75. ut.value AS utm_term,
  76. uo.value AS utm_content
  77. FROM
  78. urchin AS u
  79. JOIN
  80. requests AS r ON u.request_id = r.id
  81. JOIN
  82. urchin_source AS us ON us.id = u.source_id
  83. LEFT JOIN
  84. urchin_medium AS um ON um.id = u.medium_id
  85. LEFT JOIN
  86. urchin_campaign AS uc ON uc.id = u.campaign_id
  87. LEFT JOIN
  88. urchin_term AS ut ON ut.id = u.term_id
  89. LEFT JOIN
  90. urchin_content AS uo ON uo.id = u.content_id;
  91. /* Make urchin_requests a writable view via triggers. We will always stomp the main row, as the last update will be what we want. */
  92. CREATE TRIGGER IF NOT EXISTS insert_urchin_requests INSTEAD OF INSERT ON urchin_requests BEGIN
  93. INSERT OR IGNORE INTO urchin_source (value) VALUES (NEW.utm_source);
  94. INSERT OR IGNORE INTO urchin_medium (value) VALUES (NEW.utm_medium);
  95. INSERT OR IGNORE INTO urchin_campaign (value) VALUES (NEW.utm_campaign);
  96. INSERT OR IGNORE INTO urchin_term (value) VALUES (NEW.utm_term);
  97. INSERT OR IGNORE INTO urchin_content (value) VALUES (NEW.utm_content);
  98. INSERT OR REPLACE INTO urchin SELECT
  99. NEW.id,
  100. r.id AS request_id,
  101. us.id AS source_id,
  102. um.id AS medium_id,
  103. uc.id AS campaign_id,
  104. ut.id AS term_id,
  105. uo.id AS content_id
  106. FROM requests AS r
  107. JOIN urchin_source AS us ON us.value = NEW.utm_source
  108. LEFT JOIN urchin_medium AS um ON um.value = NEW.utm_medium
  109. LEFT JOIN urchin_campaign AS uc ON uc.value = NEW.utm_campaign
  110. LEFT JOIN urchin_term AS ut ON ut.value = NEW.utm_term
  111. LEFT JOIN urchin_content AS uo ON uo.value = NEW.utm_content
  112. WHERE r.uuid = NEW.request_uuid;
  113. END;
  114. CREATE VIEW IF NOT EXISTS all_requests AS
  115. SELECT
  116. q.id,
  117. q.uuid,
  118. q.date,
  119. h.ip_address,
  120. u.user,
  121. r.method,
  122. r.route,
  123. f.referer,
  124. ua.ua,
  125. c.code
  126. FROM
  127. requests AS q
  128. JOIN
  129. seen_hosts AS h ON q.host_id = h.id
  130. JOIN
  131. seen_users AS u ON q.user_id = u.id
  132. JOIN
  133. seen_routes AS r ON q.route_id = r.id
  134. JOIN
  135. referer AS f ON q.referer_id = f.id
  136. JOIN
  137. ua ON q.ua_id = ua.id
  138. JOIN
  139. response_code AS c on q.response_code_id = c.id;
  140. /* Make all_requests a writable view via triggers. We will always stomp the main row, as the last update will be what we want. */
  141. CREATE TRIGGER IF NOT EXISTS insert_all_requests INSTEAD OF INSERT ON all_requests BEGIN
  142. INSERT OR IGNORE INTO response_code (code) VALUES (NEW.code);
  143. INSERT OR IGNORE INTO seen_routes (route,method) VALUES (NEW.route, NEW.method);
  144. INSERT OR IGNORE INTO seen_users (user) VALUES (NEW.user);
  145. INSERT OR IGNORE INTO seen_hosts (ip_address) VALUES (NEW.ip_address);
  146. INSERT OR IGNORE INTO referer (referer) VALUES (NEW.referer);
  147. INSERT OR IGNORE INTO ua (ua) VALUES (NEW.ua);
  148. INSERT OR REPLACE INTO requests SELECT
  149. NEW.id,
  150. NEW.uuid,
  151. NEW.date,
  152. h.id AS host_id,
  153. u.id AS user_id,
  154. r.id AS route_id,
  155. f.id AS referer_id,
  156. ua.id AS ua_id,
  157. c.id AS response_code_id
  158. FROM seen_hosts AS h
  159. JOIN seen_users AS u ON u.user = NEW.user
  160. JOIN seen_routes AS r ON r.route = NEW.route AND r.method = NEW.method
  161. JOIN referer AS f ON f.referer = NEW.referer
  162. JOIN ua ON ua.ua = NEW.ua
  163. JOIN response_code AS c ON c.code = NEW.code
  164. WHERE h.ip_address = NEW.ip_address;
  165. END;
  166. /* This is just to store various messages associated with requests, which are usually errors. */
  167. CREATE TABLE IF NOT EXISTS messages (
  168. uuid TEXT NOT NULL REFERENCES requests(uuid) ON DELETE NO ACTION,
  169. message TEXT NOT NULL
  170. );