@@ -22,6 +22,26 @@ import (
2222)
2323
2424func upsertPackage (ctx context.Context , db * sql.DB , p model.Package ) (id uuid.UUID , err error ) {
25+ selectReleaseDependencyPackage := Package .SELECT (
26+ Package .Name ,
27+ Package .PackageManager ,
28+ Package .CustomRegistry ,
29+ Package .Description ,
30+ ).WHERE (
31+ Package .Name .EQ (postgres .String (p .Name )).
32+ AND (Package .PackageManager .EQ (postgres .NewEnumValue (string (p .PackageManager )))).
33+ AND (Package .CustomRegistry .EQ (postgres .String (p .CustomRegistry ))),
34+ )
35+
36+ var releaseDependencyPackage model.Package
37+ err = selectReleaseDependencyPackage .QueryContext (ctx , db , & releaseDependencyPackage )
38+ if err == nil {
39+ // If the release dependency package already exists, we don't need to do anything
40+ if releaseDependencyPackage .Description == p .Description {
41+ return releaseDependencyPackage .ID , nil
42+ }
43+ }
44+
2545 packageInsert := Package .INSERT (
2646 Package .Name ,
2747 Package .PackageManager ,
@@ -48,6 +68,31 @@ func upsertPackage(ctx context.Context, db *sql.DB, p model.Package) (id uuid.UU
4868}
4969
5070func upsertRelease (ctx context.Context , db * sql.DB , r model.Release ) (id uuid.UUID , err error ) {
71+ selectRelease := Release .SELECT (
72+ Release .AllColumns ,
73+ ).WHERE (
74+ Release .PackageID .EQ (postgres .UUID (r .PackageID )).
75+ AND (Release .Version .EQ (postgres .String (r .Version ))),
76+ )
77+
78+ var release model.Release
79+ err = selectRelease .QueryContext (ctx , db , & release )
80+ if err == nil {
81+ // TODO (cthompson) not easy to compare jsonb, so we're skipping this for now
82+ // release.UpstreamData == r.UpstreamData &&
83+
84+ // If the release already exists, we don't need to do anything
85+ if release .PublishingMaintainerID == r .PublishingMaintainerID &&
86+ release .ReleaseTime == r .ReleaseTime &&
87+ release .BlobHash == r .BlobHash &&
88+ release .UpstreamBlobURL == r .UpstreamBlobURL {
89+
90+ // TODO (cthompson) update FetchedTime
91+
92+ return release .ID , nil
93+ }
94+ }
95+
5196 releaseInsert := Release .INSERT (
5297 Release .PackageID ,
5398 Release .PublishingMaintainerID ,
@@ -82,6 +127,23 @@ func upsertRelease(ctx context.Context, db *sql.DB, r model.Release) (id uuid.UU
82127}
83128
84129func upsertReleaseDependencyPackage (ctx context.Context , db * sql.DB , p model.Package ) (id uuid.UUID , err error ) {
130+ selectReleaseDependencyPackage := Package .SELECT (
131+ Package .Name ,
132+ Package .PackageManager ,
133+ Package .CustomRegistry ,
134+ ).WHERE (
135+ Package .Name .EQ (postgres .String (p .Name )).
136+ AND (Package .PackageManager .EQ (postgres .NewEnumValue (string (p .PackageManager )))).
137+ AND (Package .CustomRegistry .EQ (postgres .String (p .CustomRegistry ))),
138+ )
139+
140+ var releaseDependencyPackage model.Package
141+ err = selectReleaseDependencyPackage .QueryContext (ctx , db , & releaseDependencyPackage )
142+ if err == nil {
143+ // If the release dependency package already exists, we don't need to do anything
144+ return releaseDependencyPackage .ID , nil
145+ }
146+
85147 insertPackage := Package .INSERT (
86148 Package .Name ,
87149 Package .PackageManager ,
@@ -105,6 +167,26 @@ func upsertReleaseDependencyPackage(ctx context.Context, db *sql.DB, p model.Pac
105167}
106168
107169func upsertReleaseDependency (ctx context.Context , db * sql.DB , r model.ReleaseDependency ) (id uuid.UUID , err error ) {
170+ selectReleaseDependency := ReleaseDependency .SELECT (
171+ ReleaseDependency .ID ,
172+ ReleaseDependency .ReleaseID ,
173+ ReleaseDependency .IsDev ,
174+ ).WHERE (
175+ ReleaseDependency .ReleaseID .EQ (postgres .UUID (r .ReleaseID )).
176+ AND (ReleaseDependency .PackageName .EQ (postgres .String (r .PackageName ))).
177+ AND (ReleaseDependency .PackageVersionQuery .EQ (postgres .String (r .PackageVersionQuery ))),
178+ )
179+
180+ var releaseDependency model.ReleaseDependency
181+ err = selectReleaseDependency .QueryContext (ctx , db , & releaseDependency )
182+ if err == nil {
183+ // If the release dependency already exists, we don't need to do anything
184+ if releaseDependency .ReleaseID == r .ReleaseID &&
185+ releaseDependency .IsDev == r .IsDev {
186+ return releaseDependency .ID , nil
187+ }
188+ }
189+
108190 insertReleaseDependency := ReleaseDependency .INSERT (
109191 ReleaseDependency .ReleaseID ,
110192 ReleaseDependency .DependencyPackageID ,
@@ -131,18 +213,52 @@ func upsertReleaseDependency(ctx context.Context, db *sql.DB, r model.ReleaseDep
131213}
132214
133215func upsertPackageMaintainer (ctx context.Context , db * sql.DB , p model.PackageMaintainer ) error {
216+ selectPackageMaintainer := PackageMaintainer .SELECT (
217+ PackageMaintainer .AllColumns ,
218+ ).WHERE (
219+ PackageMaintainer .PackageID .EQ (postgres .UUID (p .PackageID )).
220+ AND (PackageMaintainer .MaintainerID .EQ (postgres .UUID (p .MaintainerID ))),
221+ )
222+
223+ var packageMaintainer model.PackageMaintainer
224+ err := selectPackageMaintainer .QueryContext (ctx , db , & packageMaintainer )
225+ if err == nil {
226+ // If the package maintainer already exists, we don't need to do anything
227+ if packageMaintainer .PackageID == p .PackageID &&
228+ packageMaintainer .MaintainerID == p .MaintainerID {
229+ return nil
230+ }
231+ }
232+
134233 insertPackageMaintainer := PackageMaintainer .INSERT (
135234 PackageMaintainer .PackageID ,
136235 PackageMaintainer .MaintainerID ,
137236 ).MODEL (p ).
138237 ON_CONFLICT ().
139238 ON_CONSTRAINT ("package_maintainer_package_id_maintainer_id_idx" ).
140239 DO_NOTHING ()
141- _ , err : = insertPackageMaintainer .ExecContext (ctx , db )
240+ _ , err = insertPackageMaintainer .ExecContext (ctx , db )
142241 return err
143242}
144243
145244func upsertMaintainer (ctx context.Context , db * sql.DB , m model.Maintainer ) (id uuid.UUID , err error ) {
245+ selectMaintainer := Maintainer .SELECT (
246+ Maintainer .AllColumns ,
247+ ).WHERE (
248+ Maintainer .Email .EQ (postgres .String (m .Email )),
249+ )
250+
251+ var maintainer model.Maintainer
252+ err = selectMaintainer .QueryContext (ctx , db , & maintainer )
253+ if err == nil {
254+ // If the maintainer already exists, we don't need to do anything
255+ if maintainer .Email == m .Email &&
256+ maintainer .Name == m .Name &&
257+ maintainer .PackageManager == m .PackageManager {
258+ return maintainer .ID , nil
259+ }
260+ }
261+
146262 insertMaintainer := Maintainer .INSERT (
147263 Maintainer .Email ,
148264 Maintainer .Name ,
0 commit comments