111 lines
3.0 KiB
Go
111 lines
3.0 KiB
Go
package main
|
|
|
|
/*
|
|
Author: Valentijn van der Jagt
|
|
|
|
In this project i play around with go. This is my first time writing go, and im using a lot of help from sources. all useful sources are listed in the comments below.
|
|
|
|
*/
|
|
|
|
// https://stackoverflow.com/questions/61080317/go-lang-very-simple-http-post-requests-and-response-endpoint, HTTP Server example
|
|
// https://stackoverflow.com/questions/16466320/is-there-a-way-to-do-repetitive-tasks-at-intervals, How timer intervals work in GoLang
|
|
// https://pkg.go.dev/modernc.org/sqlite#section-documentation, how to interface with specifically sqlite in GoLang
|
|
// https://github.com/mattn/go-sqlite3/blob/v1.14.34/_example/simple/simple.go, How to inferface with a database in GoLang.
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func executeQuery(db *sql.DB, query string) {
|
|
_, err := db.Exec(query)
|
|
if err != nil {
|
|
log.Printf("%q: %s\n", err, query)
|
|
return
|
|
}
|
|
}
|
|
|
|
func createTables(db *sql.DB) {
|
|
executeQuery(db, `
|
|
CREATE TABLE shipments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tracking_number TEXT NOT NULL UNIQUE,
|
|
service TEXT NOT NULL,
|
|
sender_name TEXT,
|
|
receiver_name TEXT,
|
|
origin_country TEXT,
|
|
origin_city TEXT,
|
|
origin_postal TEXT,
|
|
origin_address TEXT,
|
|
destination_country TEXT,
|
|
destination_city TEXT,
|
|
destination_postal TEXT,
|
|
destination_address TEXT,
|
|
pickup_date TEXT,
|
|
estimated_delivery_from TEXT,
|
|
estimated_delivery_to TEXT,
|
|
current_status TEXT,
|
|
last_update TEXT DEFAULT (datetime('now')),
|
|
created_at TEXT DEFAULT (datetime('now'))
|
|
);
|
|
|
|
-- Status Events: history of status updates
|
|
CREATE TABLE shipment_events (
|
|
id INTEGER PRIMARY KEY,
|
|
shipment_id INTEGER NOT NULL,
|
|
event_time TEXT NOT NULL,
|
|
status_code TEXT NOT NULL,
|
|
status_desc TEXT,
|
|
description TEXT,
|
|
remark TEXT,
|
|
next_steps TEXT,
|
|
location_country TEXT,
|
|
location_city TEXT,
|
|
location_postal TEXT,
|
|
FOREIGN KEY (shipment_id) REFERENCES shipments(id)
|
|
);
|
|
CREATE INDEX idx_events_shipment_time ON shipment_events(shipment_id, event_time);
|
|
|
|
CREATE TABLE shipment_updates (
|
|
id INTEGER PRIMARY KEY,
|
|
shipment_id INTEGER NOT NULL,
|
|
update_time TEXT DEFAULT (datetime('now')),
|
|
service TEXT,
|
|
location_country TEXT,
|
|
location_city TEXT,
|
|
status_code TEXT,
|
|
status_desc TEXT,
|
|
estimated_from TEXT,
|
|
estimated_to TEXT,
|
|
FOREIGN KEY (shipment_id) REFERENCES shipments(id)
|
|
);
|
|
CREATE INDEX idx_updates_shipment_time ON shipment_updates(shipment_id, update_time);
|
|
`)
|
|
|
|
log.Printf("[Database] tables created")
|
|
|
|
}
|
|
|
|
func dropTables(db *sql.DB) {
|
|
executeQuery(db, `
|
|
DROP TABLE IF EXISTS shipments;
|
|
DROP TABLE IF EXISTS shipment_events;
|
|
DROP TABLE IF EXISTS shipment_updates;
|
|
`)
|
|
|
|
log.Printf("[Database] tables dropped")
|
|
|
|
}
|
|
|
|
func main() {
|
|
db, err := sql.Open("sqlite", "./dhl.db")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
dropTables(db) // temporarely for debugging
|
|
createTables(db)
|
|
}
|