pico
created pr with
97.1
added 97.2
1: fdc255e = 1: fdc255e refactor: remove unused db methods
2: 3f855f6 = 2: 3f855f6 chore: add tests for postgres db impl
3: 7cd29a6 = 3: 7cd29a6 refactor: use sqlx interface
4: acd449e = 4: acd449e chore: add db tags
5: f6ed0d7 = 5: f6ed0d7 refactor: use sqlx
6: 29035c6 = 6: 29035c6 refactor: replace custom sql functions with sqlx
7: d4ea6d9 = 7: d4ea6d9 refactor: inline all sql queries
-: ------- > 8: 4bd37ed refactor: use `select * from` where possible
cmds
checkout latest patchset:
ssh pr.pico.sh print 97 | git am -3checkout any patchset in a patch request:
ssh pr.pico.sh print 97.[rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 97
Patchset
97.1
refactor: remove unused db methods
Eric Bower
chore: add tests for postgres db impl
2025-12-18T03:03:10ZEric Bower
refactor: use sqlx interface
2025-12-18T03:17:57ZEric Bower
chore: add db tags
2025-12-18T03:27:57ZEric Bower
refactor: use sqlx
2025-12-18T03:31:25ZEric Bower
→ refactor: replace custom sql functions with sqlx
2025-12-18T03:43:01ZEric Bower
refactor: inline all sql queries
2025-12-18T03:57:00ZEric Bower
2025-12-18T04:02:50Z
refactor: replace custom sql functions with sqlx
Eric Bower
2025-12-18T03:57:00ZSemantic diff summary
0 added,
19 modified,
1 signature changed,
1 removed
across 1 analyzed file
pkg/db/postgres/storage.go
-
function_declarationCreatePostFromRowremoved -
function_declarationUpdatePublicKeymodified -
function_declarationRemoveKeysmodified -
function_declarationFindUsersWithPostmodified -
method_declarationpostPagersignature changed -
method_declarationFindPostmodified -
method_declarationFindPostsForFeedmodified -
function_declarationRemovePostsmodified -
function_declarationFindPostsForUsermodified -
method_declarationFindAllPostsForUsermodified -
method_declarationFindPostsmodified -
method_declarationFindExpiredPostsmodified -
function_declarationvisitUniquemodified -
function_declarationvisitReferermodified -
function_declarationvisitUrlmodified -
function_declarationVisitUrlNotFoundmodified -
function_declarationvisitHostmodified -
function_declarationReplaceAliasesForPostmodified -
function_declarationFindUserPostsByTagmodified -
function_declarationFindPostsByTagmodified -
function_declarationFindTunsEventLogsmodified
+35
-96
pkg/db/postgres/storage.go
#
| ... | ... | @@ -222,34 +222,6 @@ type RowScanner interface { | |
| 222 | 222 | Scan(dest ...any) error | |
| 223 | 223 | } | |
| 224 | 224 | ||
| 225 | - | func CreatePostFromRow(r RowScanner) (*db.Post, error) { | |
| 226 | - | post := &db.Post{} | |
| 227 | - | err := r.Scan( | |
| 228 | - | &post.ID, | |
| 229 | - | &post.UserID, | |
| 230 | - | &post.Username, | |
| 231 | - | &post.Filename, | |
| 232 | - | &post.Slug, | |
| 233 | - | &post.Title, | |
| 234 | - | &post.Text, | |
| 235 | - | &post.Description, | |
| 236 | - | &post.CreatedAt, | |
| 237 | - | &post.PublishAt, | |
| 238 | - | &post.UpdatedAt, | |
| 239 | - | &post.Hidden, | |
| 240 | - | &post.FileSize, | |
| 241 | - | &post.MimeType, | |
| 242 | - | &post.Shasum, | |
| 243 | - | &post.Data, | |
| 244 | - | &post.ExpiresAt, | |
| 245 | - | &post.Views, | |
| 246 | - | ) | |
| 247 | - | if err != nil { | |
| 248 | - | return nil, err | |
| 249 | - | } | |
| 250 | - | return post, nil | |
| 251 | - | } | |
| 252 | - | ||
| 253 | 225 | func CreatePostWithTagsFromRow(r RowScanner) (*db.Post, error) { | |
| 254 | 226 | post := &db.Post{} | |
| 255 | 227 | tagStr := "" |
| ... | ... | @@ -380,10 +352,11 @@ func (me *PsqlDB) UpdatePublicKey(pubkeyID, name string) (*db.PublicKey, error) | |
| 380 | 352 | ||
| 381 | 353 | func (me *PsqlDB) findPublicKeyForKey(key string) (*db.PublicKey, error) { | |
| 382 | 354 | var keys []*db.PublicKey | |
| 383 | - | rs, err := me.Db.Query(sqlSelectPublicKey, key) | |
| 355 | + | rs, err := me.Db.Queryx(sqlSelectPublicKey, key) | |
| 384 | 356 | if err != nil { | |
| 385 | 357 | return nil, err | |
| 386 | 358 | } | |
| 359 | + | defer func() { _ = rs.Close() }() | |
| 387 | 360 | ||
| 388 | 361 | for rs.Next() { | |
| 389 | 362 | pk := &db.PublicKey{} |
| ... | ... | @@ -440,7 +413,7 @@ func (me *PsqlDB) RemoveKeys(keyIDs []string) error { | |
| 440 | 413 | ||
| 441 | 414 | func (me *PsqlDB) FindUsersWithPost(space string) ([]*db.User, error) { | |
| 442 | 415 | var users []*db.User | |
| 443 | - | rs, err := me.Db.Query( | |
| 416 | + | rs, err := me.Db.Queryx( | |
| 444 | 417 | `SELECT u.id, u.name, u.created_at | |
| 445 | 418 | FROM app_users u | |
| 446 | 419 | INNER JOIN posts ON u.id=posts.user_id |
| ... | ... | @@ -603,16 +577,15 @@ func (me *PsqlDB) FindPostWithSlug(slug string, user_id string, space string) (* | |
| 603 | 577 | } | |
| 604 | 578 | ||
| 605 | 579 | func (me *PsqlDB) FindPost(postID string) (*db.Post, error) { | |
| 606 | - | r := me.Db.QueryRow(sqlSelectPost, postID) | |
| 607 | - | post, err := CreatePostFromRow(r) | |
| 580 | + | post := &db.Post{} | |
| 581 | + | err := me.Db.Get(post, sqlSelectPost, postID) | |
| 608 | 582 | if err != nil { | |
| 609 | 583 | return nil, err | |
| 610 | 584 | } | |
| 611 | - | ||
| 612 | 585 | return post, nil | |
| 613 | 586 | } | |
| 614 | 587 | ||
| 615 | - | func (me *PsqlDB) postPager(rs *sql.Rows, pageNum int, space string, tag string) (*db.Paginate[*db.Post], error) { | |
| 588 | + | func (me *PsqlDB) postPager(rs *sqlx.Rows, pageNum int, space string, tag string) (*db.Paginate[*db.Post], error) { | |
| 616 | 589 | var posts []*db.Post | |
| 617 | 590 | for rs.Next() { | |
| 618 | 591 | post := &db.Post{} |
| ... | ... | @@ -659,10 +632,11 @@ func (me *PsqlDB) postPager(rs *sql.Rows, pageNum int, space string, tag string) | |
| 659 | 632 | } | |
| 660 | 633 | ||
| 661 | 634 | func (me *PsqlDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 662 | - | rs, err := me.Db.Query(sqlSelectPostsByRank, page.Num, page.Num*page.Page, space) | |
| 635 | + | rs, err := me.Db.Queryx(sqlSelectPostsByRank, page.Num, page.Num*page.Page, space) | |
| 663 | 636 | if err != nil { | |
| 664 | 637 | return nil, err | |
| 665 | 638 | } | |
| 639 | + | defer func() { _ = rs.Close() }() | |
| 666 | 640 | return me.postPager(rs, page.Num, space, "") | |
| 667 | 641 | } | |
| 668 | 642 |
| ... | ... | @@ -724,7 +698,7 @@ func (me *PsqlDB) RemovePosts(postIDs []string) error { | |
| 724 | 698 | ||
| 725 | 699 | func (me *PsqlDB) FindPostsForUser(page *db.Pager, userID string, space string) (*db.Paginate[*db.Post], error) { | |
| 726 | 700 | var posts []*db.Post | |
| 727 | - | rs, err := me.Db.Query( | |
| 701 | + | rs, err := me.Db.Queryx( | |
| 728 | 702 | sqlSelectPostsForUser, | |
| 729 | 703 | userID, | |
| 730 | 704 | space, |
| ... | ... | @@ -762,60 +737,27 @@ func (me *PsqlDB) FindPostsForUser(page *db.Pager, userID string, space string) | |
| 762 | 737 | ||
| 763 | 738 | func (me *PsqlDB) FindAllPostsForUser(userID string, space string) ([]*db.Post, error) { | |
| 764 | 739 | var posts []*db.Post | |
| 765 | - | rs, err := me.Db.Query(sqlSelectAllPostsForUser, userID, space) | |
| 740 | + | err := me.Db.Select(&posts, sqlSelectAllPostsForUser, userID, space) | |
| 766 | 741 | if err != nil { | |
| 767 | - | return posts, err | |
| 768 | - | } | |
| 769 | - | for rs.Next() { | |
| 770 | - | post, err := CreatePostFromRow(rs) | |
| 771 | - | if err != nil { | |
| 772 | - | return nil, err | |
| 773 | - | } | |
| 774 | - | ||
| 775 | - | posts = append(posts, post) | |
| 776 | - | } | |
| 777 | - | if rs.Err() != nil { | |
| 778 | - | return posts, rs.Err() | |
| 742 | + | return nil, err | |
| 779 | 743 | } | |
| 780 | 744 | return posts, nil | |
| 781 | 745 | } | |
| 782 | 746 | ||
| 783 | 747 | func (me *PsqlDB) FindPosts() ([]*db.Post, error) { | |
| 784 | 748 | var posts []*db.Post | |
| 785 | - | rs, err := me.Db.Query(sqlSelectPosts) | |
| 749 | + | err := me.Db.Select(&posts, sqlSelectPosts) | |
| 786 | 750 | if err != nil { | |
| 787 | - | return posts, err | |
| 788 | - | } | |
| 789 | - | for rs.Next() { | |
| 790 | - | post, err := CreatePostFromRow(rs) | |
| 791 | - | if err != nil { | |
| 792 | - | return nil, err | |
| 793 | - | } | |
| 794 | - | ||
| 795 | - | posts = append(posts, post) | |
| 796 | - | } | |
| 797 | - | if rs.Err() != nil { | |
| 798 | - | return posts, rs.Err() | |
| 751 | + | return nil, err | |
| 799 | 752 | } | |
| 800 | 753 | return posts, nil | |
| 801 | 754 | } | |
| 802 | 755 | ||
| 803 | 756 | func (me *PsqlDB) FindExpiredPosts(space string) ([]*db.Post, error) { | |
| 804 | 757 | var posts []*db.Post | |
| 805 | - | rs, err := me.Db.Query(sqlSelectExpiredPosts, space) | |
| 758 | + | err := me.Db.Select(&posts, sqlSelectExpiredPosts, space) | |
| 806 | 759 | if err != nil { | |
| 807 | - | return posts, err | |
| 808 | - | } | |
| 809 | - | for rs.Next() { | |
| 810 | - | post, err := CreatePostFromRow(rs) | |
| 811 | - | if err != nil { | |
| 812 | - | return nil, err | |
| 813 | - | } | |
| 814 | - | ||
| 815 | - | posts = append(posts, post) | |
| 816 | - | } | |
| 817 | - | if rs.Err() != nil { | |
| 818 | - | return posts, rs.Err() | |
| 760 | + | return nil, err | |
| 819 | 761 | } | |
| 820 | 762 | return posts, nil | |
| 821 | 763 | } |
| ... | ... | @@ -877,10 +819,11 @@ func (me *PsqlDB) visitUnique(opts *db.SummaryOpts) ([]*db.VisitInterval, error) | |
| 877 | 819 | GROUP BY interval_start`, opts.Interval, where) | |
| 878 | 820 | ||
| 879 | 821 | intervals := []*db.VisitInterval{} | |
| 880 | - | rs, err := me.Db.Query(uniqueVisitors, opts.Origin, with, opts.UserID) | |
| 822 | + | rs, err := me.Db.Queryx(uniqueVisitors, opts.Origin, with, opts.UserID) | |
| 881 | 823 | if err != nil { | |
| 882 | 824 | return nil, err | |
| 883 | 825 | } | |
| 826 | + | defer func() { _ = rs.Close() }() | |
| 884 | 827 | ||
| 885 | 828 | for rs.Next() { | |
| 886 | 829 | interval := &db.VisitInterval{} |
| ... | ... | @@ -912,10 +855,11 @@ func (me *PsqlDB) visitReferer(opts *db.SummaryOpts) ([]*db.VisitUrl, error) { | |
| 912 | 855 | LIMIT 10`, where) | |
| 913 | 856 | ||
| 914 | 857 | intervals := []*db.VisitUrl{} | |
| 915 | - | rs, err := me.Db.Query(topUrls, opts.Origin, with, opts.UserID) | |
| 858 | + | rs, err := me.Db.Queryx(topUrls, opts.Origin, with, opts.UserID) | |
| 916 | 859 | if err != nil { | |
| 917 | 860 | return nil, err | |
| 918 | 861 | } | |
| 862 | + | defer func() { _ = rs.Close() }() | |
| 919 | 863 | ||
| 920 | 864 | for rs.Next() { | |
| 921 | 865 | interval := &db.VisitUrl{} |
| ... | ... | @@ -947,10 +891,11 @@ func (me *PsqlDB) visitUrl(opts *db.SummaryOpts) ([]*db.VisitUrl, error) { | |
| 947 | 891 | LIMIT 10`, where) | |
| 948 | 892 | ||
| 949 | 893 | intervals := []*db.VisitUrl{} | |
| 950 | - | rs, err := me.Db.Query(topUrls, opts.Origin, with, opts.UserID) | |
| 894 | + | rs, err := me.Db.Queryx(topUrls, opts.Origin, with, opts.UserID) | |
| 951 | 895 | if err != nil { | |
| 952 | 896 | return nil, err | |
| 953 | 897 | } | |
| 898 | + | defer func() { _ = rs.Close() }() | |
| 954 | 899 | ||
| 955 | 900 | for rs.Next() { | |
| 956 | 901 | interval := &db.VisitUrl{} |
| ... | ... | @@ -986,10 +931,11 @@ func (me *PsqlDB) VisitUrlNotFound(opts *db.SummaryOpts) ([]*db.VisitUrl, error) | |
| 986 | 931 | LIMIT %d`, where, limit) | |
| 987 | 932 | ||
| 988 | 933 | intervals := []*db.VisitUrl{} | |
| 989 | - | rs, err := me.Db.Query(topUrls, opts.Origin, with, opts.UserID) | |
| 934 | + | rs, err := me.Db.Queryx(topUrls, opts.Origin, with, opts.UserID) | |
| 990 | 935 | if err != nil { | |
| 991 | 936 | return nil, err | |
| 992 | 937 | } | |
| 938 | + | defer func() { _ = rs.Close() }() | |
| 993 | 939 | ||
| 994 | 940 | for rs.Next() { | |
| 995 | 941 | interval := &db.VisitUrl{} |
| ... | ... | @@ -1019,10 +965,11 @@ func (me *PsqlDB) visitHost(opts *db.SummaryOpts) ([]*db.VisitUrl, error) { | |
| 1019 | 965 | ORDER BY host_count DESC` | |
| 1020 | 966 | ||
| 1021 | 967 | intervals := []*db.VisitUrl{} | |
| 1022 | - | rs, err := me.Db.Query(topUrls, opts.UserID) | |
| 968 | + | rs, err := me.Db.Queryx(topUrls, opts.UserID) | |
| 1023 | 969 | if err != nil { | |
| 1024 | 970 | return nil, err | |
| 1025 | 971 | } | |
| 972 | + | defer func() { _ = rs.Close() }() | |
| 1026 | 973 | ||
| 1027 | 974 | for rs.Next() { | |
| 1028 | 975 | interval := &db.VisitUrl{} |
| ... | ... | @@ -1197,7 +1144,8 @@ func (me *PsqlDB) ReplaceAliasesForPost(aliases []string, postID string) error { | |
| 1197 | 1144 | ||
| 1198 | 1145 | func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) (*db.Paginate[*db.Post], error) { | |
| 1199 | 1146 | var posts []*db.Post | |
| 1200 | - | rs, err := me.Db.Query( | |
| 1147 | + | err := me.Db.Select( | |
| 1148 | + | &posts, | |
| 1201 | 1149 | sqlSelectUserPostsByTag, | |
| 1202 | 1150 | userID, | |
| 1203 | 1151 | tag, |
| ... | ... | @@ -1208,18 +1156,6 @@ func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) | |
| 1208 | 1156 | if err != nil { | |
| 1209 | 1157 | return nil, err | |
| 1210 | 1158 | } | |
| 1211 | - | for rs.Next() { | |
| 1212 | - | post, err := CreatePostFromRow(rs) | |
| 1213 | - | if err != nil { | |
| 1214 | - | return nil, err | |
| 1215 | - | } | |
| 1216 | - | ||
| 1217 | - | posts = append(posts, post) | |
| 1218 | - | } | |
| 1219 | - | ||
| 1220 | - | if rs.Err() != nil { | |
| 1221 | - | return nil, rs.Err() | |
| 1222 | - | } | |
| 1223 | 1159 | ||
| 1224 | 1160 | var count int | |
| 1225 | 1161 | err = me.Db.QueryRow(sqlSelectPostCount, space).Scan(&count) |
| ... | ... | @@ -1235,7 +1171,7 @@ func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) | |
| 1235 | 1171 | } | |
| 1236 | 1172 | ||
| 1237 | 1173 | func (me *PsqlDB) FindPostsByTag(pager *db.Pager, tag, space string) (*db.Paginate[*db.Post], error) { | |
| 1238 | - | rs, err := me.Db.Query( | |
| 1174 | + | rs, err := me.Db.Queryx( | |
| 1239 | 1175 | sqlSelectPostsByTag, | |
| 1240 | 1176 | pager.Num, | |
| 1241 | 1177 | pager.Num*pager.Page, |
| ... | ... | @@ -1245,16 +1181,18 @@ func (me *PsqlDB) FindPostsByTag(pager *db.Pager, tag, space string) (*db.Pagina | |
| 1245 | 1181 | if err != nil { | |
| 1246 | 1182 | return nil, err | |
| 1247 | 1183 | } | |
| 1184 | + | defer func() { _ = rs.Close() }() | |
| 1248 | 1185 | ||
| 1249 | 1186 | return me.postPager(rs, pager.Num, space, tag) | |
| 1250 | 1187 | } | |
| 1251 | 1188 | ||
| 1252 | 1189 | func (me *PsqlDB) FindPopularTags(space string) ([]string, error) { | |
| 1253 | 1190 | tags := make([]string, 0) | |
| 1254 | - | rs, err := me.Db.Query(sqlSelectPopularTags, space) | |
| 1191 | + | rs, err := me.Db.Queryx(sqlSelectPopularTags, space) | |
| 1255 | 1192 | if err != nil { | |
| 1256 | 1193 | return tags, err | |
| 1257 | 1194 | } | |
| 1195 | + | defer func() { _ = rs.Close() }() | |
| 1258 | 1196 | for rs.Next() { | |
| 1259 | 1197 | name := "" | |
| 1260 | 1198 | tally := 0 |
| ... | ... | @@ -1559,10 +1497,11 @@ func (me *PsqlDB) FindTunsEventLogs(userID string) ([]*db.TunsEventLog, error) { | |
| 1559 | 1497 | ||
| 1560 | 1498 | func (me *PsqlDB) FindUserStats(userID string) (*db.UserStats, error) { | |
| 1561 | 1499 | stats := db.UserStats{} | |
| 1562 | - | rs, err := me.Db.Query(`SELECT cur_space, count(id), min(created_at), max(created_at), max(updated_at) FROM posts WHERE user_id=$1 GROUP BY cur_space`, userID) | |
| 1500 | + | rs, err := me.Db.Queryx(`SELECT cur_space, count(id), min(created_at), max(created_at), max(updated_at) FROM posts WHERE user_id=$1 GROUP BY cur_space`, userID) | |
| 1563 | 1501 | if err != nil { | |
| 1564 | 1502 | return nil, err | |
| 1565 | 1503 | } | |
| 1504 | + | defer func() { _ = rs.Close() }() | |
| 1566 | 1505 | ||
| 1567 | 1506 | for rs.Next() { | |
| 1568 | 1507 | stat := db.UserServiceStats{} |