@@ -81,19 +81,23 @@ func (pd *PackageDescriptor) CalculateBlobSize() int64 {
8181
8282// GetPackageDescriptor gets the package description for a version
8383func GetPackageDescriptor (ctx context.Context , pv * PackageVersion ) (* PackageDescriptor , error ) {
84- p , err := GetPackageByID (ctx , pv .PackageID )
84+ return getPackageDescriptor (ctx , pv , newQueryCache ())
85+ }
86+
87+ func getPackageDescriptor (ctx context.Context , pv * PackageVersion , c * cache ) (* PackageDescriptor , error ) {
88+ p , err := c .QueryPackage (ctx , pv .PackageID )
8589 if err != nil {
8690 return nil , err
8791 }
88- o , err := user_model . GetUserByID (ctx , p .OwnerID )
92+ o , err := c . QueryUser (ctx , p .OwnerID )
8993 if err != nil {
9094 return nil , err
9195 }
92- repository , err := repo_model . GetRepositoryByID (ctx , p .RepoID )
93- if err != nil && ! repo_model . IsErrRepoNotExist ( err ) {
96+ repository , err := c . QueryRepository (ctx , p .RepoID )
97+ if err != nil {
9498 return nil , err
9599 }
96- creator , err := user_model . GetUserByID (ctx , pv .CreatorID )
100+ creator , err := c . QueryUser (ctx , pv .CreatorID )
97101 if err != nil {
98102 return nil , err
99103 }
@@ -119,7 +123,7 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
119123
120124 pfds := make ([]* PackageFileDescriptor , 0 , len (pfs ))
121125 for _ , pf := range pfs {
122- pfd , err := GetPackageFileDescriptor (ctx , pf )
126+ pfd , err := getPackageFileDescriptor (ctx , pf , c )
123127 if err != nil {
124128 return nil , err
125129 }
@@ -177,7 +181,11 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
177181
178182// GetPackageFileDescriptor gets a package file descriptor for a package file
179183func GetPackageFileDescriptor (ctx context.Context , pf * PackageFile ) (* PackageFileDescriptor , error ) {
180- pb , err := GetBlobByID (ctx , pf .BlobID )
184+ return getPackageFileDescriptor (ctx , pf , newQueryCache ())
185+ }
186+
187+ func getPackageFileDescriptor (ctx context.Context , pf * PackageFile , c * cache ) (* PackageFileDescriptor , error ) {
188+ pb , err := c .QueryBlob (ctx , pf .BlobID )
181189 if err != nil {
182190 return nil , err
183191 }
@@ -194,13 +202,76 @@ func GetPackageFileDescriptor(ctx context.Context, pf *PackageFile) (*PackageFil
194202
195203// GetPackageDescriptors gets the package descriptions for the versions
196204func GetPackageDescriptors (ctx context.Context , pvs []* PackageVersion ) ([]* PackageDescriptor , error ) {
205+ return getPackageDescriptors (ctx , pvs , newQueryCache ())
206+ }
207+
208+ func getPackageDescriptors (ctx context.Context , pvs []* PackageVersion , c * cache ) ([]* PackageDescriptor , error ) {
197209 pds := make ([]* PackageDescriptor , 0 , len (pvs ))
198210 for _ , pv := range pvs {
199- pd , err := GetPackageDescriptor (ctx , pv )
211+ pd , err := getPackageDescriptor (ctx , pv , c )
200212 if err != nil {
201213 return nil , err
202214 }
203215 pds = append (pds , pd )
204216 }
205217 return pds , nil
206218}
219+
220+ type cache struct {
221+ Packages map [int64 ]* Package
222+ Users map [int64 ]* user_model.User
223+ Repositories map [int64 ]* repo_model.Repository
224+ Blobs map [int64 ]* PackageBlob
225+ }
226+
227+ func newQueryCache () * cache {
228+ return & cache {
229+ Packages : make (map [int64 ]* Package ),
230+ Users : make (map [int64 ]* user_model.User ),
231+ Repositories : map [int64 ]* repo_model.Repository {0 : nil }, // 0 is an expected value
232+ Blobs : make (map [int64 ]* PackageBlob ),
233+ }
234+ }
235+
236+ func (c * cache ) QueryPackage (ctx context.Context , id int64 ) (* Package , error ) {
237+ if p , found := c .Packages [id ]; found {
238+ return p , nil
239+ }
240+
241+ p , err := GetPackageByID (ctx , id )
242+ c .Packages [id ] = p
243+ return p , err
244+ }
245+
246+ func (c * cache ) QueryUser (ctx context.Context , id int64 ) (* user_model.User , error ) {
247+ if u , found := c .Users [id ]; found {
248+ return u , nil
249+ }
250+
251+ u , err := user_model .GetUserByID (ctx , id )
252+ c .Users [id ] = u
253+ return u , err
254+ }
255+
256+ func (c * cache ) QueryRepository (ctx context.Context , id int64 ) (* repo_model.Repository , error ) {
257+ if r , found := c .Repositories [id ]; found {
258+ return r , nil
259+ }
260+
261+ r , err := repo_model .GetRepositoryByID (ctx , id )
262+ if err != nil && ! repo_model .IsErrRepoNotExist (err ) {
263+ err = nil
264+ }
265+ c .Repositories [id ] = r
266+ return r , err
267+ }
268+
269+ func (c * cache ) QueryBlob (ctx context.Context , id int64 ) (* PackageBlob , error ) {
270+ if b , found := c .Blobs [id ]; found {
271+ return b , nil
272+ }
273+
274+ b , err := GetBlobByID (ctx , id )
275+ c .Blobs [id ] = b
276+ return b , err
277+ }
0 commit comments