StorageOpts func(*storage.ResourcePiecesOpts)
}
-// A convenience function that creates a connection pool, resource provider, and a pieces storage
-// ClientImpl and returns them all with a Close attached.
-func NewPiecesStorage(opts NewPiecesStorageOpts) (_ storage.ClientImplCloser, err error) {
- conns, err := NewPool(opts.NewPoolOpts)
- if err != nil {
- return
- }
- if opts.PageSize == 0 {
- opts.PageSize = 1 << 14
- }
- err = initPoolDatabase(conns, opts.InitDbOpts)
- if err != nil {
- conns.Close()
- return
- }
- if opts.SetJournalMode == "" && !opts.Memory {
- opts.SetJournalMode = "wal"
- }
- err = initPoolConns(context.TODO(), conns, opts.InitConnOpts)
- if err != nil {
- conns.Close()
- return
- }
- provOpts := ProviderOpts{
- BatchWrites: conns.NumConns() > 1,
- }
- if f := opts.ProvOpts; f != nil {
- f(&provOpts)
- }
- prov, err := NewProvider(conns, provOpts)
- if err != nil {
- conns.Close()
- return
- }
- var (
- journalMode string
- )
- withPoolConn(conns, func(c conn) {
- err = sqlitex.Exec(c, "pragma journal_mode", func(stmt *sqlite.Stmt) error {
- journalMode = stmt.ColumnText(0)
- return nil
- })
- })
- if err != nil {
- err = fmt.Errorf("getting journal mode: %w", err)
- prov.Close()
- return
- }
- if journalMode == "" {
- err = errors.New("didn't get journal mode")
- prov.Close()
- return
- }
- storageOpts := storage.ResourcePiecesOpts{
- NoSizedPuts: journalMode != "wal" || conns.NumConns() == 1,
- }
- if f := opts.StorageOpts; f != nil {
- f(&storageOpts)
- }
- store := storage.NewResourcePiecesOpts(prov, storageOpts)
- return struct {
- storage.ClientImpl
- io.Closer
- }{
- store,
- prov,
- }, nil
-}
-
type NewPoolOpts struct {
NewConnOpts
InitConnOpts