{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
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
, 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 (..))
import qualified Pantry.SQLite as SQLite