-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspouse.go
108 lines (102 loc) · 2.59 KB
/
spouse.go
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"database/sql"
"fmt"
"time"
)
type SpouseLite struct {
Person1 PersonLite
Person2 PersonLite
Status int // 1=MARRIED,2=DATING,3=EX-MARRIED
MarriedDate time.Time
}
func (s *SpouseLite) StatusFormatted() string {
switch s.Status {
case 1:
return "Married"
case 2:
return "Dating"
case 3:
return "Ex-Married"
default:
return ""
}
}
func LoadSpousesByPersonId(db *sql.DB, personId int) ([]SpouseLite, error) {
trace(traceName(fmt.Sprintf("LoadSpousesByPersonId(%d)", personId)))
rows, err := db.Query(
"SELECT person1_id, person2_id, status, married_date"+
" FROM spouses"+
" WHERE person1_id=? OR person2_id=? ORDER BY status", personId, personId)
if err != nil {
return nil, err
}
person1, err := LoadPersonLiteById(db, personId)
if err != nil {
return nil, err
}
var spouseList []SpouseLite
for rows.Next() {
item := SpouseLite{Person1: *person1}
var person1Id, person2Id int
var marriedDate sql.NullString
err = rows.Scan(&person1Id, &person2Id, &item.Status, &marriedDate)
if err != nil {
return nil, err
}
if marriedDate.Valid {
item.MarriedDate, _ = time.Parse("2006-01-02", marriedDate.String)
}
if person2Id == personId {
person2Id = person1Id
}
person2, err := LoadPersonLiteById(db, person2Id)
if err != nil {
return nil, err
}
item.Person2 = *person2
spouseList = append(spouseList, item)
}
return spouseList, nil
}
func DeleteSpouse(db *sql.DB, person1Id int, person2Id int) error {
if person2Id < person1Id {
tmp := person1Id
person1Id = person2Id
person2Id = tmp
}
trace(traceName(fmt.Sprintf("DeleteSpouse(%d, %d)", person1Id, person2Id)))
res, err := db.Exec("DELETE FROM spouses WHERE person1_id=? AND person2_id=?", person1Id, person2Id)
if err != nil {
return err
}
numAffected, err := res.RowsAffected()
if err != nil {
return err
}
if numAffected < 1 {
return fmt.Errorf("Spouse not found with person1_id: %d, person2_id: %d", person1Id, person2Id)
}
return nil
}
func InsertSpouse(db *sql.DB, person1Id int, person2Id int, status int, marriedDate string) error {
if person2Id < person1Id {
tmp := person1Id
person1Id = person2Id
person2Id = tmp
}
trace(traceName(fmt.Sprintf("InsertSpouse(%d, %d, %d, %s)", person1Id, person2Id, status, marriedDate)))
nullableMariedDate := sql.NullString{
String: marriedDate,
Valid: marriedDate != "",
}
_, err := db.Exec(
"INSERT INTO spouses"+
" (person1_id, person2_id, status, married_date)"+
" VALUES(?, ?, ?, ?)",
person1Id, person2Id, status, nullableMariedDate)
if err != nil {
return err
}
return nil
}