this repo has no description
at main 2.3 kB view raw
1package src 2 3import ( 4 "database/sql" 5 "encoding/json" 6) 7 8type DB struct { 9 connection *sql.DB 10} 11 12func CreateDB(db *sql.DB) (*DB, error) { 13 create := ` 14 CREATE TABLE IF NOT EXISTS people ( 15 id TEXT NOT NULL PRIMARY KEY, 16 name TEXT, 17 nickname TEXT, 18 birthdate DATETIME, 19 stacks JSONB 20 );` 21 22 if _, err := db.Exec(create); err != nil { 23 return nil, err 24 } 25 26 return &DB{connection: db}, nil 27} 28 29func (db *DB) InsertPeople(person Person) (int64, error) { 30 db.connection.Ping() 31 sql := "INSERT INTO people VALUES(?,?,?,?,?);" 32 statement, err := db.connection.Prepare(sql) 33 if err != nil { 34 return 0, err 35 } 36 defer statement.Close() 37 stack, _ := json.Marshal(person.Stack) 38 39 res, err := statement.Exec(person.Id, person.Name, person.Nickname, person.Birthdate, stack) 40 if err != nil { 41 return 0, err 42 } 43 44 var id int64 45 if id, err = res.LastInsertId(); err != nil { 46 return 0, err 47 } 48 49 return id, nil 50} 51 52func (db *DB) GetPersonById(id string) (Person, error) { 53 row := db.connection.QueryRow(` 54 SELECT 55 id, 56 name, 57 nickname, 58 birthdate, 59 stacks 60 FROM people 61 WHERE id = ?;`, id) 62 63 person := Person{} 64 65 var err error 66 if err = row.Scan(&person.Id, &person.Name, &person.Nickname, &person.Birthdate, &person.Stack); err != nil { 67 return Person{}, err 68 } 69 70 return person, nil 71} 72 73func (db *DB) SearchPerson(param string) ([]Person, error) { 74 rows, err := db.connection.Query(` 75 SELECT 76 id, 77 name, 78 nickname, 79 birthdate, 80 stacks 81 FROM people 82 WHERE LOWER(name) LIKE '%' || ? || '%' 83 OR LOWER(nickname) LIKE '%' || ? || '%' 84 OR LOWER(stacks) LIKE '%' || ? || '%';`, param, param, param) 85 86 if err != nil { 87 return nil, err 88 } 89 defer rows.Close() 90 91 people := []Person{} 92 for rows.Next() { 93 i := Person{} 94 if err = rows.Scan(&i.Id, &i.Name, &i.Nickname, &i.Birthdate, &i.Stack); err != nil { 95 return nil, err 96 } 97 98 people = append(people, i) 99 } 100 101 return people, nil 102} 103 104func (db *DB) CountAllPeople() (int, error) { 105 row := db.connection.QueryRow(`SELECT COUNT(*) FROM people;`) 106 107 var value int 108 if err := row.Scan(&value); err != nil { 109 return 0, err 110 } 111 112 return value, nil 113}