git.sophuwu.com > urlshort   
              67
            
             package main

import (
	bolt "go.etcd.io/bbolt"
	"math/rand"
	"os"
	"strings"
)

var urlDB *bolt.DB
var wordList []string

func fec(err error) { // fatal error check
	if err != nil {
		println(err.Error())
		urlDB.Close()
		os.Exit(1)
	}
}

func openFiles() {
	b, err := os.ReadFile("wordlist")
	fec(err)
	if len(b) == 0 {
		println("wordlist is empty")
		os.Exit(1)
	}
	wordList = strings.Split(string(b), "\n")

	var db *bolt.DB
	db, err = bolt.Open("urls.db", 0600, nil)
	fec(err)
	fec(db.Update(func(tx *bolt.Tx) error {
		_, err = tx.CreateBucketIfNotExists([]byte("urls"))
		return err
	}))
	urlDB = db
}

func getWords() string {
	word := func() string {
		return wordList[rand.Intn(len(wordList))]
	}
	return word() + "-" + word() + "-" + word()
}

func readURL(words string) string {
	var url string
	_ = urlDB.View(func(tx *bolt.Tx) error {
		b := tx.Bucket([]byte("urls"))
		url = string(b.Get([]byte(words)))
		return nil
	})
	return url
}

func writeURL(words, url string) error {
	return urlDB.Update(func(tx *bolt.Tx) error {
		b := tx.Bucket([]byte("urls"))
		return b.Put([]byte(words), []byte(url))
	})
}

func main() {
	openFiles()

}