From e2ad1d9a505490187caf10c2093952919a301376 Mon Sep 17 00:00:00 2001 From: sbouaram Date: Wed, 3 May 2023 09:13:34 +0200 Subject: [PATCH] removing prepare statements --- storage/postgresql.go | 96 +++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/storage/postgresql.go b/storage/postgresql.go index eb740da..5800607 100644 --- a/storage/postgresql.go +++ b/storage/postgresql.go @@ -58,14 +58,11 @@ func (psql PostgresqlStorage) CreateGroup(group Group) error { if err != nil { return err } - insertGroupStmt, err := psql.DbConnection.Prepare(fmt.Sprintf("INSERT INTO %s (id, namespace, members, data)"+ - " VALUES ($1, $2, $3, $4)", - psql.Tables["groups"])) - if err != nil { - return err - } - defer insertGroupStmt.Close() - _, err = insertGroupStmt.Exec(group.ID, group.Namespace, pq.Array(group.Members), dataJson) + + query := fmt.Sprintf("INSERT INTO %s (id, namespace, members, data) VALUES ($1, $2, $3, $4)", + psql.Tables["groups"]) + + _, err = psql.DbConnection.Exec(query, group.ID, group.Namespace, pq.Array(group.Members), dataJson) if err != nil { return err } @@ -98,17 +95,14 @@ func (psql PostgresqlStorage) GetGroup(id string) (*Group, error) { func (psql PostgresqlStorage) GetGroups(namespaces []string) ([]Group, error) { var groups []Group - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`SELECT id, namespace, members, data - FROM %s WHERE namespace = ANY($1)`, psql.Tables["groups"])) - if err != nil { - return nil, fmt.Errorf("psql prepare select groups query failed : %s", err) - } - defer stmt.Close() - rows, err := stmt.Query(pq.Array(namespaces)) + query := fmt.Sprintf(`SELECT id, namespace, members, data FROM %s WHERE namespace = ANY($1)`, psql.Tables["groups"]) + + rows, err := psql.DbConnection.Query(query, pq.Array(namespaces)) if err != nil { return nil, fmt.Errorf("psql select groups query failed : %s", err) } defer rows.Close() + for rows.Next() { var ( id string @@ -116,15 +110,18 @@ func (psql PostgresqlStorage) GetGroups(namespaces []string) ([]Group, error) { data []byte members pq.StringArray ) + err := rows.Scan(&id, &ns, &members, &data) if err != nil { return nil, fmt.Errorf("psql scan groups row failed : %s", err) } + var groupData map[string]interface{} err = json.Unmarshal(data, &groupData) if err != nil { return nil, fmt.Errorf("psql unmarshal group data failed : %s", err) } + groups = append(groups, Group{ ID: id, Namespace: ns, @@ -132,6 +129,7 @@ func (psql PostgresqlStorage) GetGroups(namespaces []string) ([]Group, error) { Data: groupData, }) } + if err = rows.Err(); err != nil { return nil, fmt.Errorf("psql iterate groups rows failed : %s", err) } @@ -140,13 +138,8 @@ func (psql PostgresqlStorage) GetGroups(namespaces []string) ([]Group, error) { func (psql PostgresqlStorage) GetGroupsByIds(ids []string) ([]Group, error) { groups := make([]Group, 0) - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`SELECT id, namespace, members, data - FROM %s WHERE id = ANY($1)`, psql.Tables["groups"])) - if err != nil { - return nil, fmt.Errorf("psql prepare select groups query failed : %s", err) - } - defer stmt.Close() - rows, err := stmt.Query(pq.Array(ids)) + query := fmt.Sprintf(`SELECT id, namespace, members, data FROM %s WHERE id = ANY($1)`, psql.Tables["groups"]) + rows, err := psql.DbConnection.Query(query, pq.Array(ids)) if err != nil { return nil, fmt.Errorf("psql select groups query failed: %s", err) } @@ -179,14 +172,9 @@ func (psql PostgresqlStorage) UpdateGroup(group Group) error { if err != nil { return fmt.Errorf("failed to serialize data field: %s", err) } - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`UPDATE %s SET namespace=$2, members=$3, data=$4 WHERE id=$1`, - psql.Tables["groups"])) - if err != nil { - return fmt.Errorf("psql prepare update group query failed : %s", err) - } - defer stmt.Close() - _, err = stmt.Exec(group.ID, group.Namespace, members, data) + _, err = psql.DbConnection.Exec(fmt.Sprintf(`UPDATE %s SET namespace=$2, members=$3, data=$4 WHERE id=$1`, + psql.Tables["groups"]), group.ID, group.Namespace, members, data) if err != nil { return fmt.Errorf("psql update group query failed : %s", err) } @@ -194,19 +182,15 @@ func (psql PostgresqlStorage) UpdateGroup(group Group) error { } func (psql PostgresqlStorage) CreateGroupMember(member GroupMember) error { - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`INSERT INTO %s (id, member_id, group_id, data) - VALUES ($1, $2, $3, $4)`, psql.Tables["group_members"])) - if err != nil { - return fmt.Errorf("psql prepare insert group member query failed: %s", err) - } - defer stmt.Close() - data, err := json.Marshal(member.Data) + dataJson, err := json.Marshal(member.Data) if err != nil { return err } - _, err = stmt.Exec(member.ID, member.Memberid, member.Groupid, data) + _, err = psql.DbConnection.Exec(fmt.Sprintf("INSERT INTO %s (id, member_id, group_id, data)"+ + " VALUES ($1, $2, $3, $4)", + psql.Tables["group_members"]), member.ID, member.Memberid, member.Groupid, dataJson) if err != nil { - return fmt.Errorf("psql insert group member query failed: %s", err) + return err } return nil } @@ -275,13 +259,9 @@ func (psql PostgresqlStorage) GetGroupsMember(namespaces []string) ([]GroupMembe func (psql PostgresqlStorage) GetGroupsMemberByIds(ids []string) ([]GroupMember, error) { groupMembers := make([]GroupMember, 0) - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`SELECT id, member_id, group_id, data - FROM %s WHERE group_id = ANY($1)`, psql.Tables["group_members"])) - if err != nil { - return nil, fmt.Errorf("psql prepare select group members query failed: %s", err) - } - defer stmt.Close() - rows, err := stmt.Query(pq.Array(ids)) + req := fmt.Sprintf(`SELECT id, member_id, group_id, data + FROM %s WHERE group_id = ANY($1)`, psql.Tables["group_members"]) + rows, err := psql.DbConnection.Query(req, pq.Array(ids)) if err != nil { return nil, fmt.Errorf("psql select group members query failed: %s", err) } @@ -306,19 +286,13 @@ func (psql PostgresqlStorage) GetGroupsMemberByIds(ids []string) ([]GroupMember, } func (psql PostgresqlStorage) UpdateGroupMember(groupMember GroupMember) error { - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`UPDATE %s SET member_id=$1, group_id=$2, - data=$3 WHERE id=$4`, psql.Tables["group_members"])) - if err != nil { - return fmt.Errorf("psql prepare update group member query failed : %s", err) - } - defer stmt.Close() - data, err := json.Marshal(groupMember.Data) if err != nil { return fmt.Errorf("failed to marshal data field: %s", err) } - res, err := stmt.Exec(groupMember.Memberid, groupMember.Groupid, data, groupMember.ID) + req := fmt.Sprintf(`UPDATE %s SET member_id=$1, group_id=$2, data=$3 WHERE id=$4`, psql.Tables["group_members"]) + res, err := psql.DbConnection.Exec(req, groupMember.Memberid, groupMember.Groupid, data, groupMember.ID) if err != nil { return fmt.Errorf("psql update group member query failed: %s", err) } @@ -335,14 +309,20 @@ func (psql PostgresqlStorage) UpdateGroupMember(groupMember GroupMember) error { } func (psql PostgresqlStorage) DeleteGroupMember(id string) error { - stmt, err := psql.DbConnection.Prepare(fmt.Sprintf(`DELETE FROM %s WHERE id=$1`, psql.Tables["group_members"])) + res, err := psql.DbConnection.Exec(fmt.Sprintf(`DELETE FROM %s WHERE id=$1`, psql.Tables["group_members"]), id) if err != nil { - return fmt.Errorf("psql prepare delete group member query failed: %s", err) - } - defer stmt.Close() - if _, err := stmt.Exec(id); err != nil { return fmt.Errorf("psql delete group member query failed: %s", err) } + + rowsAffected, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("failed to get rows affected by delete query: %s", err) + } + + if rowsAffected == 0 { + return fmt.Errorf("no rows were deleted for group member with id %s", id) + } + return nil }