1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
(import-macros {: map : reduce} :lib.macro)
(tset package :path (.. package.path ";./vendor/lpeglj/?.lua"))
(local array (require :lib.array))
(local ozchai (require :parser.ozchai))
(local ipuer (require :parser.ipuer))
(local artoftea (require :parser.artoftea))
(local db (luna.db.open "file:var/db.sqlite?_journal=WAL&_sync=NORMAL"))
(luna.db.exec db "
PRAGMA foreign_keys=ON;
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
CREATE VIRTUAL TABLE IF NOT EXISTS search USING fts5(name, fid, `table`);
CREATE TABLE IF NOT EXISTS products (
id TEXT NOT NULL PRIMARY KEY,
site TEXT NOT NULL,
category TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT NOT NULL,
year INT NOT NULL,
image TEXT NOT NULL,
url TEXT NOT NULL,
price REAL NOT NULL,
weight REAL NOT NULL,
price_per REAL NOT NULL,
misc TEXT NOT NULL,
creation_time DATETIME NOT NULL
);" [])
(fn now []
(os.date "%Y-%m-%d %H:%M:%S"))
(fn store-products [products]
(local sql
(.. "INSERT OR REPLACE INTO products VALUES "
(table.concat
(map (fn [_ _]
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
products)
",")))
(local vars
(reduce
(fn [_ product rest]
(array.concat rest
[product.id
product.site
product.category
product.title
(or product.description "")
(or product.year 0)
(or product.image "")
(or product.url "")
(or product.price 0)
(or product.weight 0)
(or product.price-per 0)
(or product.misc "")
(now)]))
products []))
(luna.db.exec db sql vars))
(fn populate-search-table []
(local tx (luna.db.begin db))
(luna.db.exec-tx tx "DELETE FROM search" [])
(luna.db.exec-tx tx "INSERT INTO search
SELECT title, id, 'products'
FROM products;" [])
(luna.db.commit tx))
(store-products (artoftea.products))
(store-products (ipuer.products))
(store-products (ozchai.products))
(populate-search-table)
|