Browse Source

Example: dump DB content.

Frederic G. MARAND 6 years ago
parent
commit
bd5a5423b7
3 changed files with 124 additions and 2 deletions
  1. 107 2
      cmd/kurzd/kurzd.go
  2. 7 0
      go.mod
  3. 10 0
      go.sum

+ 107 - 2
cmd/kurzd/kurzd.go

@@ -1,5 +1,15 @@
 // Package kurzd contains the Kurz daemon command.
-package kurzd
+package main
+
+import (
+	"fmt"
+	"gopkg.in/yaml.v2"
+	"os"
+	"time"
+
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+)
 
 /**
 kurzd
@@ -22,5 +32,100 @@ kurzd
 	stop                            Stop all instances of kurzd on the current server (restricted)
  */
 func main() {
-	
+	command, subCommand, options, err := parseCommand()
+	if err != nil {
+		panic(err.Error())
+	}
+
+	switch command {
+	case "export":
+		switch subCommand {
+		case "content":
+			dbDriver, dbDsn := parseDbCred(options)
+			db, err := dbDial(dbDriver, dbDsn)
+			if err != nil {
+				panic("Could not open database")
+			}
+			defer db.Close()
+			entries, err := exportContent(db)
+			if err != nil {
+				panic(err.Error())
+			}
+			y, err := yaml.Marshal(&entries)
+			if err != nil {
+				panic(err.Error())
+			}
+			fmt.Println(string(y))
+		}
+	}
+}
+
+type stringMap map[string]string
+
+type MapEntry struct {
+	Hash                uint64
+	Url                 string
+	Date1, Date2, Date3 time.Time
+	RefCount            uint32
+}
+
+func dbDial(dbDriver, dbDsn string) (*sql.DB, error) {
+	db, err := sql.Open(dbDriver, dbDsn)
+	if err != nil {
+		return nil, err
+	}
+	return db, nil
+}
+
+func parseDbCred(_ stringMap) (driver, dsn string) {
+	const DefaultDriver = "mysql"
+	const DefaultDsn = "root:root@tcp(localhost:3306)/kurz"
+
+	envDriver := os.Getenv("DB_DRIVER")
+	if envDriver == "" {
+		envDriver = DefaultDriver
+	}
+
+	envDsn := os.Getenv("DB_DSN")
+	if envDsn == "" {
+		envDsn = DefaultDsn
+	}
+	envDsn += "?parseTime=true"
+
+	return envDriver, envDsn
+}
+
+/* parseCommand returns a valid command/subCommand/options triplet and nil, or
+   an error, in which case the values for the other results are not defined.
+ */
+func parseCommand() (command, subCommand string, options stringMap, err error) {
+	return "export", "content", stringMap{}, nil
+}
+
+func exportContent(db *sql.DB) ([]MapEntry, error) {
+	stmt, err := db.Prepare(`
+SELECT Hash, url, Date1, Date2, Date3, RefCount
+FROM map
+ORDER BY url`)
+	if err != nil {
+		panic(err.Error())
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	entry := MapEntry{}
+	var entries []MapEntry
+	for rows.Next() {
+		err = rows.Scan(&entry.Hash, &entry.Url, &entry.Date1, &entry.Date2, &entry.Date3, &entry.RefCount)
+		if err != nil {
+			return nil, err
+		}
+		entries = append(entries, entry)
+	}
+
+	return entries, nil
 }

+ 7 - 0
go.mod

@@ -0,0 +1,7 @@
+module code.osinet.fr/fgm/kurz
+
+require (
+	github.com/go-sql-driver/mysql v1.4.0
+	google.golang.org/appengine v1.3.0 // indirect
+	gopkg.in/yaml.v2 v2.2.1
+)

+ 10 - 0
go.sum

@@ -0,0 +1,10 @@
+github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk=
+google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=