{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Pantry.Storage
( SqlBackend
, initStorage
, withStorage
, migrateAll
, storeBlob
, loadBlob
, loadBlobById
, loadBlobBySHA
, allBlobsSource
, allHackageCabalRawPackageLocations
, allBlobsCount
, allHackageCabalCount
, getBlobKey
, loadURLBlob
, storeURLBlob
, clearHackageRevisions
, storeHackageRevision
, loadHackagePackageVersions
, loadHackagePackageVersion
, loadLatestCacheUpdate
, storeCacheUpdate
, storeHackageTarballInfo
, loadHackageTarballInfo
, getHPackBlobKeyById
, storeTree
, loadTree
, storeHPack
, loadPackageById
, getPackageNameById
, getPackageNameId
, getVersionId
, getTreeForKey
, storeHackageTree
, loadHackageTree
, loadHackageTreeKey
, storeArchiveCache
, loadArchiveCache
, storeRepoCache
, loadRepoCache
, storePreferredVersion
, loadPreferredVersion
, sinkHackagePackageNames
, loadCabalBlobKey
, hpackToCabal
, countHackageCabals
, getSnapshotCacheByHash
, getSnapshotCacheId
, storeSnapshotModuleCache
, loadExposedModulePackages
, findOrGenerateCabalFile
, PackageNameId
, PackageName
, VersionId
, ModuleNameId
, Version
, versionVersion
, Unique(..)
, EntityField(..)
, BlobId
, Key(unBlobKey)
, HackageCabalId
, HackageCabal(..)
, HackageTarballId
, CacheUpdateId
, FilePathId
, Tree(..)
, TreeId
, TreeEntry(..)
, TreeEntryId
, ArchiveCacheId
, RepoCacheId
, PreferredVersionsId
, UrlBlobId
, SnapshotCacheId
, PackageExposedModuleId
, loadCachedTree
, CachedTree (..)
, unCachedTree
) where
import RIO hiding (FilePath)
import RIO.Process
import qualified RIO.ByteString as B
import qualified Pantry.Types as P
import qualified RIO.List as List
import qualified RIO.FilePath as FilePath
import RIO.FilePath ((</>), takeDirectory)
import RIO.Directory (createDirectoryIfMissing, setPermissions, getPermissions, setOwnerExecutable)
import Database.Persist
import Database.Persist.Sqlite
import Database.Persist.TH
import RIO.Orphans (HasResourceMap)
import qualified Pantry.SHA256 as SHA256
import qualified RIO.Map as Map
import qualified RIO.Text as T
import RIO.Time (UTCTime, getCurrentTime)
import Path (Path, Abs, File, Dir, toFilePath, filename, parseAbsDir, fromAbsFile, fromRelFile)
import Path.IO (listDir, createTempDir, getTempDir, removeDirRecur)
import Pantry.HPack (hpackVersion, hpack)
import Conduit
import Data.Acquire (with)
import Pantry.Types (PackageNameP (..), VersionP (..), SHA256, FileSize (..), FileType (..), HasPantryConfig, BlobKey, Repo (..), TreeKey, SafeFilePath, Revision (..), Package (..), SnapshotCacheHash (..), connRDBMS)
import qualified Pantry.SQLite as SQLite