// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package dbgen

import (
	"context"
	"database/sql"

	"gorm.io/gorm"

	"gorm.io/gen"

	"gorm.io/plugin/dbresolver"
)

var (
	Q                  = new(Query)
	AccessToken        *accessToken
	Emote              *emote
	Feed               *feed
	LoginProcessToken  *loginProcessToken
	MediaMetadata      *mediaMetadata
	Note               *note
	NoteTag            *noteTag
	NoteToAttachment   *noteToAttachment
	NoteToBoost        *noteToBoost
	NoteToEmote        *noteToEmote
	NoteToFeed         *noteToFeed
	NoteToPing         *noteToPing
	Notification       *notification
	Reaction           *reaction
	RemoteServer       *remoteServer
	Role               *role
	User               *user
	UserAuthMethod     *userAuthMethod
	UserInfoField      *userInfoField
	UserRemoteLinks    *userRemoteLinks
	UserToBeing        *userToBeing
	UserToPronoun      *userToPronoun
	UserToRole         *userToRole
	UserToTag          *userToTag
	UserToUserRelation *userToUserRelation
)

func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
	*Q = *Use(db, opts...)
	AccessToken = &Q.AccessToken
	Emote = &Q.Emote
	Feed = &Q.Feed
	LoginProcessToken = &Q.LoginProcessToken
	MediaMetadata = &Q.MediaMetadata
	Note = &Q.Note
	NoteTag = &Q.NoteTag
	NoteToAttachment = &Q.NoteToAttachment
	NoteToBoost = &Q.NoteToBoost
	NoteToEmote = &Q.NoteToEmote
	NoteToFeed = &Q.NoteToFeed
	NoteToPing = &Q.NoteToPing
	Notification = &Q.Notification
	Reaction = &Q.Reaction
	RemoteServer = &Q.RemoteServer
	Role = &Q.Role
	User = &Q.User
	UserAuthMethod = &Q.UserAuthMethod
	UserInfoField = &Q.UserInfoField
	UserRemoteLinks = &Q.UserRemoteLinks
	UserToBeing = &Q.UserToBeing
	UserToPronoun = &Q.UserToPronoun
	UserToRole = &Q.UserToRole
	UserToTag = &Q.UserToTag
	UserToUserRelation = &Q.UserToUserRelation
}

func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
	return &Query{
		db:                 db,
		AccessToken:        newAccessToken(db, opts...),
		Emote:              newEmote(db, opts...),
		Feed:               newFeed(db, opts...),
		LoginProcessToken:  newLoginProcessToken(db, opts...),
		MediaMetadata:      newMediaMetadata(db, opts...),
		Note:               newNote(db, opts...),
		NoteTag:            newNoteTag(db, opts...),
		NoteToAttachment:   newNoteToAttachment(db, opts...),
		NoteToBoost:        newNoteToBoost(db, opts...),
		NoteToEmote:        newNoteToEmote(db, opts...),
		NoteToFeed:         newNoteToFeed(db, opts...),
		NoteToPing:         newNoteToPing(db, opts...),
		Notification:       newNotification(db, opts...),
		Reaction:           newReaction(db, opts...),
		RemoteServer:       newRemoteServer(db, opts...),
		Role:               newRole(db, opts...),
		User:               newUser(db, opts...),
		UserAuthMethod:     newUserAuthMethod(db, opts...),
		UserInfoField:      newUserInfoField(db, opts...),
		UserRemoteLinks:    newUserRemoteLinks(db, opts...),
		UserToBeing:        newUserToBeing(db, opts...),
		UserToPronoun:      newUserToPronoun(db, opts...),
		UserToRole:         newUserToRole(db, opts...),
		UserToTag:          newUserToTag(db, opts...),
		UserToUserRelation: newUserToUserRelation(db, opts...),
	}
}

type Query struct {
	db *gorm.DB

	AccessToken        accessToken
	Emote              emote
	Feed               feed
	LoginProcessToken  loginProcessToken
	MediaMetadata      mediaMetadata
	Note               note
	NoteTag            noteTag
	NoteToAttachment   noteToAttachment
	NoteToBoost        noteToBoost
	NoteToEmote        noteToEmote
	NoteToFeed         noteToFeed
	NoteToPing         noteToPing
	Notification       notification
	Reaction           reaction
	RemoteServer       remoteServer
	Role               role
	User               user
	UserAuthMethod     userAuthMethod
	UserInfoField      userInfoField
	UserRemoteLinks    userRemoteLinks
	UserToBeing        userToBeing
	UserToPronoun      userToPronoun
	UserToRole         userToRole
	UserToTag          userToTag
	UserToUserRelation userToUserRelation
}

func (q *Query) Available() bool { return q.db != nil }

func (q *Query) clone(db *gorm.DB) *Query {
	return &Query{
		db:                 db,
		AccessToken:        q.AccessToken.clone(db),
		Emote:              q.Emote.clone(db),
		Feed:               q.Feed.clone(db),
		LoginProcessToken:  q.LoginProcessToken.clone(db),
		MediaMetadata:      q.MediaMetadata.clone(db),
		Note:               q.Note.clone(db),
		NoteTag:            q.NoteTag.clone(db),
		NoteToAttachment:   q.NoteToAttachment.clone(db),
		NoteToBoost:        q.NoteToBoost.clone(db),
		NoteToEmote:        q.NoteToEmote.clone(db),
		NoteToFeed:         q.NoteToFeed.clone(db),
		NoteToPing:         q.NoteToPing.clone(db),
		Notification:       q.Notification.clone(db),
		Reaction:           q.Reaction.clone(db),
		RemoteServer:       q.RemoteServer.clone(db),
		Role:               q.Role.clone(db),
		User:               q.User.clone(db),
		UserAuthMethod:     q.UserAuthMethod.clone(db),
		UserInfoField:      q.UserInfoField.clone(db),
		UserRemoteLinks:    q.UserRemoteLinks.clone(db),
		UserToBeing:        q.UserToBeing.clone(db),
		UserToPronoun:      q.UserToPronoun.clone(db),
		UserToRole:         q.UserToRole.clone(db),
		UserToTag:          q.UserToTag.clone(db),
		UserToUserRelation: q.UserToUserRelation.clone(db),
	}
}

func (q *Query) ReadDB() *Query {
	return q.ReplaceDB(q.db.Clauses(dbresolver.Read))
}

func (q *Query) WriteDB() *Query {
	return q.ReplaceDB(q.db.Clauses(dbresolver.Write))
}

func (q *Query) ReplaceDB(db *gorm.DB) *Query {
	return &Query{
		db:                 db,
		AccessToken:        q.AccessToken.replaceDB(db),
		Emote:              q.Emote.replaceDB(db),
		Feed:               q.Feed.replaceDB(db),
		LoginProcessToken:  q.LoginProcessToken.replaceDB(db),
		MediaMetadata:      q.MediaMetadata.replaceDB(db),
		Note:               q.Note.replaceDB(db),
		NoteTag:            q.NoteTag.replaceDB(db),
		NoteToAttachment:   q.NoteToAttachment.replaceDB(db),
		NoteToBoost:        q.NoteToBoost.replaceDB(db),
		NoteToEmote:        q.NoteToEmote.replaceDB(db),
		NoteToFeed:         q.NoteToFeed.replaceDB(db),
		NoteToPing:         q.NoteToPing.replaceDB(db),
		Notification:       q.Notification.replaceDB(db),
		Reaction:           q.Reaction.replaceDB(db),
		RemoteServer:       q.RemoteServer.replaceDB(db),
		Role:               q.Role.replaceDB(db),
		User:               q.User.replaceDB(db),
		UserAuthMethod:     q.UserAuthMethod.replaceDB(db),
		UserInfoField:      q.UserInfoField.replaceDB(db),
		UserRemoteLinks:    q.UserRemoteLinks.replaceDB(db),
		UserToBeing:        q.UserToBeing.replaceDB(db),
		UserToPronoun:      q.UserToPronoun.replaceDB(db),
		UserToRole:         q.UserToRole.replaceDB(db),
		UserToTag:          q.UserToTag.replaceDB(db),
		UserToUserRelation: q.UserToUserRelation.replaceDB(db),
	}
}

type queryCtx struct {
	AccessToken        IAccessTokenDo
	Emote              IEmoteDo
	Feed               IFeedDo
	LoginProcessToken  ILoginProcessTokenDo
	MediaMetadata      IMediaMetadataDo
	Note               INoteDo
	NoteTag            INoteTagDo
	NoteToAttachment   INoteToAttachmentDo
	NoteToBoost        INoteToBoostDo
	NoteToEmote        INoteToEmoteDo
	NoteToFeed         INoteToFeedDo
	NoteToPing         INoteToPingDo
	Notification       INotificationDo
	Reaction           IReactionDo
	RemoteServer       IRemoteServerDo
	Role               IRoleDo
	User               IUserDo
	UserAuthMethod     IUserAuthMethodDo
	UserInfoField      IUserInfoFieldDo
	UserRemoteLinks    IUserRemoteLinksDo
	UserToBeing        IUserToBeingDo
	UserToPronoun      IUserToPronounDo
	UserToRole         IUserToRoleDo
	UserToTag          IUserToTagDo
	UserToUserRelation IUserToUserRelationDo
}

func (q *Query) WithContext(ctx context.Context) *queryCtx {
	return &queryCtx{
		AccessToken:        q.AccessToken.WithContext(ctx),
		Emote:              q.Emote.WithContext(ctx),
		Feed:               q.Feed.WithContext(ctx),
		LoginProcessToken:  q.LoginProcessToken.WithContext(ctx),
		MediaMetadata:      q.MediaMetadata.WithContext(ctx),
		Note:               q.Note.WithContext(ctx),
		NoteTag:            q.NoteTag.WithContext(ctx),
		NoteToAttachment:   q.NoteToAttachment.WithContext(ctx),
		NoteToBoost:        q.NoteToBoost.WithContext(ctx),
		NoteToEmote:        q.NoteToEmote.WithContext(ctx),
		NoteToFeed:         q.NoteToFeed.WithContext(ctx),
		NoteToPing:         q.NoteToPing.WithContext(ctx),
		Notification:       q.Notification.WithContext(ctx),
		Reaction:           q.Reaction.WithContext(ctx),
		RemoteServer:       q.RemoteServer.WithContext(ctx),
		Role:               q.Role.WithContext(ctx),
		User:               q.User.WithContext(ctx),
		UserAuthMethod:     q.UserAuthMethod.WithContext(ctx),
		UserInfoField:      q.UserInfoField.WithContext(ctx),
		UserRemoteLinks:    q.UserRemoteLinks.WithContext(ctx),
		UserToBeing:        q.UserToBeing.WithContext(ctx),
		UserToPronoun:      q.UserToPronoun.WithContext(ctx),
		UserToRole:         q.UserToRole.WithContext(ctx),
		UserToTag:          q.UserToTag.WithContext(ctx),
		UserToUserRelation: q.UserToUserRelation.WithContext(ctx),
	}
}

func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error {
	return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...)
}

func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx {
	tx := q.db.Begin(opts...)
	return &QueryTx{Query: q.clone(tx), Error: tx.Error}
}

type QueryTx struct {
	*Query
	Error error
}

func (q *QueryTx) Commit() error {
	return q.db.Commit().Error
}

func (q *QueryTx) Rollback() error {
	return q.db.Rollback().Error
}

func (q *QueryTx) SavePoint(name string) error {
	return q.db.SavePoint(name).Error
}

func (q *QueryTx) RollbackTo(name string) error {
	return q.db.RollbackTo(name).Error
}
