...
1 package main
2
3 import (
4 "context"
5 "fmt"
6 "os"
7 "strconv"
8
9 "github.com/jackc/pgx/v4"
10 )
11
12 var conn *pgx.Conn
13
14 func main() {
15 var err error
16 conn, err = pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))
17 if err != nil {
18 fmt.Fprintf(os.Stderr, "Unable to connection to database: %v\n", err)
19 os.Exit(1)
20 }
21
22 if len(os.Args) == 1 {
23 printHelp()
24 os.Exit(0)
25 }
26
27 switch os.Args[1] {
28 case "list":
29 err = listTasks()
30 if err != nil {
31 fmt.Fprintf(os.Stderr, "Unable to list tasks: %v\n", err)
32 os.Exit(1)
33 }
34
35 case "add":
36 err = addTask(os.Args[2])
37 if err != nil {
38 fmt.Fprintf(os.Stderr, "Unable to add task: %v\n", err)
39 os.Exit(1)
40 }
41
42 case "update":
43 n, err := strconv.ParseInt(os.Args[2], 10, 32)
44 if err != nil {
45 fmt.Fprintf(os.Stderr, "Unable convert task_num into int32: %v\n", err)
46 os.Exit(1)
47 }
48 err = updateTask(int32(n), os.Args[3])
49 if err != nil {
50 fmt.Fprintf(os.Stderr, "Unable to update task: %v\n", err)
51 os.Exit(1)
52 }
53
54 case "remove":
55 n, err := strconv.ParseInt(os.Args[2], 10, 32)
56 if err != nil {
57 fmt.Fprintf(os.Stderr, "Unable convert task_num into int32: %v\n", err)
58 os.Exit(1)
59 }
60 err = removeTask(int32(n))
61 if err != nil {
62 fmt.Fprintf(os.Stderr, "Unable to remove task: %v\n", err)
63 os.Exit(1)
64 }
65
66 default:
67 fmt.Fprintln(os.Stderr, "Invalid command")
68 printHelp()
69 os.Exit(1)
70 }
71 }
72
73 func listTasks() error {
74 rows, _ := conn.Query(context.Background(), "select * from tasks")
75
76 for rows.Next() {
77 var id int32
78 var description string
79 err := rows.Scan(&id, &description)
80 if err != nil {
81 return err
82 }
83 fmt.Printf("%d. %s\n", id, description)
84 }
85
86 return rows.Err()
87 }
88
89 func addTask(description string) error {
90 _, err := conn.Exec(context.Background(), "insert into tasks(description) values($1)", description)
91 return err
92 }
93
94 func updateTask(itemNum int32, description string) error {
95 _, err := conn.Exec(context.Background(), "update tasks set description=$1 where id=$2", description, itemNum)
96 return err
97 }
98
99 func removeTask(itemNum int32) error {
100 _, err := conn.Exec(context.Background(), "delete from tasks where id=$1", itemNum)
101 return err
102 }
103
104 func printHelp() {
105 fmt.Print(`Todo pgx demo
106
107 Usage:
108
109 todo list
110 todo add task
111 todo update task_num item
112 todo remove task_num
113
114 Example:
115
116 todo add 'Learn Go'
117 todo list
118 `)
119 }
120
View as plain text