// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.30.0 // source: queries.sql package sqlc import ( "context" "time" "github.com/jackc/pgx/v5/pgtype" ) const createImage = `-- name: CreateImage :one INSERT INTO images (storage_type, image_path) VALUES ($1, $2) RETURNING id, storage_type, image_path ` type CreateImageParams struct { StorageType StorageTypeT `json:"storage_type"` ImagePath string `json:"image_path"` } func (q *Queries) CreateImage(ctx context.Context, arg CreateImageParams) (Image, error) { row := q.db.QueryRow(ctx, createImage, arg.StorageType, arg.ImagePath) var i Image err := row.Scan(&i.ID, &i.StorageType, &i.ImagePath) return i, err } const getImageByID = `-- name: GetImageByID :one SELECT id, storage_type, image_path FROM images WHERE id = $1::bigint ` func (q *Queries) GetImageByID(ctx context.Context, illustID int64) (Image, error) { row := q.db.QueryRow(ctx, getImageByID, illustID) var i Image err := row.Scan(&i.ID, &i.StorageType, &i.ImagePath) return i, err } const getReviewByID = `-- name: GetReviewByID :one SELECT id, data, rating, user_id, title_id, created_at FROM reviews WHERE review_id = $1::bigint ` // 100 is default limit // -- name: ListTitles :many // SELECT title_id, title_names, studio_id, poster_id, signal_ids, // // title_status, rating, rating_count, release_year, release_season, // season, episodes_aired, episodes_all, episodes_len // // FROM titles // ORDER BY title_id // LIMIT $1 OFFSET $2; // -- name: UpdateTitle :one // UPDATE titles // SET // // title_names = COALESCE(sqlc.narg('title_names'), title_names), // studio_id = COALESCE(sqlc.narg('studio_id'), studio_id), // poster_id = COALESCE(sqlc.narg('poster_id'), poster_id), // signal_ids = COALESCE(sqlc.narg('signal_ids'), signal_ids), // title_status = COALESCE(sqlc.narg('title_status'), title_status), // release_year = COALESCE(sqlc.narg('release_year'), release_year), // release_season = COALESCE(sqlc.narg('release_season'), release_season), // episodes_aired = COALESCE(sqlc.narg('episodes_aired'), episodes_aired), // episodes_all = COALESCE(sqlc.narg('episodes_all'), episodes_all), // episodes_len = COALESCE(sqlc.narg('episodes_len'), episodes_len) // // WHERE title_id = sqlc.arg('title_id') // RETURNING *; func (q *Queries) GetReviewByID(ctx context.Context, reviewID int64) (Review, error) { row := q.db.QueryRow(ctx, getReviewByID, reviewID) var i Review err := row.Scan( &i.ID, &i.Data, &i.Rating, &i.UserID, &i.TitleID, &i.CreatedAt, ) return i, err } const getStudioByID = `-- name: GetStudioByID :one SELECT id, studio_name, illust_id, studio_desc FROM studios WHERE id = $1::bigint ` func (q *Queries) GetStudioByID(ctx context.Context, studioID int64) (Studio, error) { row := q.db.QueryRow(ctx, getStudioByID, studioID) var i Studio err := row.Scan( &i.ID, &i.StudioName, &i.IllustID, &i.StudioDesc, ) return i, err } const getTitleByID = `-- name: GetTitleByID :one SELECT t.id, t.title_names, t.studio_id, t.poster_id, t.title_status, t.rating, t.rating_count, t.release_year, t.release_season, t.season, t.episodes_aired, t.episodes_all, t.episodes_len, i.storage_type::text as title_storage_type, i.image_path as title_image_path, jsonb_agg(g.tag_name)'[]'::jsonb as tag_names, s.studio_name as studio_name, s.illust_id as studio_illust_id, s.studio_desc as studio_desc, si.storage_type::text as studio_storage_type, si.image_path as studio_image_path FROM titles as t LEFT JOIN images as i ON (t.poster_id = i.id) LEFT JOIN title_tags as tt ON (t.id = tt.title_id) LEFT JOIN tags as g ON (tt.tag_id = g.id) LEFT JOIN studios as s ON (t.studio_id = s.id) LEFT JOIN images as si ON (s.illust_id = si.id) WHERE id = $1::bigint GROUP BY t.id, i.id, s.id, si.id ` type GetTitleByIDRow struct { ID int64 `json:"id"` TitleNames []byte `json:"title_names"` StudioID int64 `json:"studio_id"` PosterID *int64 `json:"poster_id"` TitleStatus TitleStatusT `json:"title_status"` Rating *float64 `json:"rating"` RatingCount *int32 `json:"rating_count"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` Season *int32 `json:"season"` EpisodesAired *int32 `json:"episodes_aired"` EpisodesAll *int32 `json:"episodes_all"` EpisodesLen []byte `json:"episodes_len"` TitleStorageType string `json:"title_storage_type"` TitleImagePath *string `json:"title_image_path"` TagNames []byte `json:"tag_names"` StudioName *string `json:"studio_name"` StudioIllustID *int64 `json:"studio_illust_id"` StudioDesc *string `json:"studio_desc"` StudioStorageType string `json:"studio_storage_type"` StudioImagePath *string `json:"studio_image_path"` } // -- name: ListUsers :many // SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date // FROM users // ORDER BY user_id // LIMIT $1 OFFSET $2; // -- name: CreateUser :one // INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date) // VALUES ($1, $2, $3, $4, $5, $6, $7) // RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date; // -- name: UpdateUser :one // UPDATE users // SET // // avatar_id = COALESCE(sqlc.narg('avatar_id'), avatar_id), // disp_name = COALESCE(sqlc.narg('disp_name'), disp_name), // user_desc = COALESCE(sqlc.narg('user_desc'), user_desc), // passhash = COALESCE(sqlc.narg('passhash'), passhash) // // WHERE user_id = sqlc.arg('user_id') // RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date; // -- name: DeleteUser :exec // DELETE FROM users // WHERE user_id = $1; // sqlc.struct: TitlesFull func (q *Queries) GetTitleByID(ctx context.Context, titleID int64) (GetTitleByIDRow, error) { row := q.db.QueryRow(ctx, getTitleByID, titleID) var i GetTitleByIDRow err := row.Scan( &i.ID, &i.TitleNames, &i.StudioID, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.EpisodesLen, &i.TitleStorageType, &i.TitleImagePath, &i.TagNames, &i.StudioName, &i.StudioIllustID, &i.StudioDesc, &i.StudioStorageType, &i.StudioImagePath, ) return i, err } const getTitleTags = `-- name: GetTitleTags :many SELECT tag_names FROM tags as g JOIN title_tags as t ON(t.tag_id = g.id) WHERE t.title_id = $1::bigint ` func (q *Queries) GetTitleTags(ctx context.Context, titleID int64) ([][]byte, error) { rows, err := q.db.Query(ctx, getTitleTags, titleID) if err != nil { return nil, err } defer rows.Close() items := [][]byte{} for rows.Next() { var tag_names []byte if err := rows.Scan(&tag_names); err != nil { return nil, err } items = append(items, tag_names) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const getUserByID = `-- name: GetUserByID :one SELECT id, avatar_id, mail, nickname, disp_name, user_desc, creation_date FROM users WHERE id = $1 ` type GetUserByIDRow struct { ID int64 `json:"id"` AvatarID *int64 `json:"avatar_id"` Mail *string `json:"mail"` Nickname string `json:"nickname"` DispName *string `json:"disp_name"` UserDesc *string `json:"user_desc"` CreationDate time.Time `json:"creation_date"` } func (q *Queries) GetUserByID(ctx context.Context, id int64) (GetUserByIDRow, error) { row := q.db.QueryRow(ctx, getUserByID, id) var i GetUserByIDRow err := row.Scan( &i.ID, &i.AvatarID, &i.Mail, &i.Nickname, &i.DispName, &i.UserDesc, &i.CreationDate, ) return i, err } const insertStudio = `-- name: InsertStudio :one INSERT INTO studios (studio_name, illust_id, studio_desc) VALUES ( $1::text, $2::bigint, $3::text) RETURNING id, studio_name, illust_id, studio_desc ` type InsertStudioParams struct { StudioName string `json:"studio_name"` IllustID *int64 `json:"illust_id"` StudioDesc *string `json:"studio_desc"` } func (q *Queries) InsertStudio(ctx context.Context, arg InsertStudioParams) (Studio, error) { row := q.db.QueryRow(ctx, insertStudio, arg.StudioName, arg.IllustID, arg.StudioDesc) var i Studio err := row.Scan( &i.ID, &i.StudioName, &i.IllustID, &i.StudioDesc, ) return i, err } const insertTag = `-- name: InsertTag :one INSERT INTO tags (tag_names) VALUES ( $1::jsonb) RETURNING id, tag_names ` func (q *Queries) InsertTag(ctx context.Context, tagNames []byte) (Tag, error) { row := q.db.QueryRow(ctx, insertTag, tagNames) var i Tag err := row.Scan(&i.ID, &i.TagNames) return i, err } const insertTitleTags = `-- name: InsertTitleTags :one INSERT INTO title_tags (title_id, tag_id) VALUES ( $1::bigint, $2::bigint) RETURNING title_id, tag_id ` type InsertTitleTagsParams struct { TitleID int64 `json:"title_id"` TagID int64 `json:"tag_id"` } func (q *Queries) InsertTitleTags(ctx context.Context, arg InsertTitleTagsParams) (TitleTag, error) { row := q.db.QueryRow(ctx, insertTitleTags, arg.TitleID, arg.TagID) var i TitleTag err := row.Scan(&i.TitleID, &i.TagID) return i, err } const searchTitles = `-- name: SearchTitles :many SELECT t.id, t.title_names, t.studio_id, t.poster_id, t.title_status, t.rating, t.rating_count, t.release_year, t.release_season, t.season, t.episodes_aired, t.episodes_all, t.episodes_len, i.storage_type::text as title_storage_type, i.image_path as title_image_path, jsonb_agg(g.tag_name)'[]'::jsonb as tag_names, s.studio_name as studio_name, s.illust_id as studio_illust_id, s.studio_desc as studio_desc, si.storage_type::text as studio_storage_type, si.image_path as studio_image_path FROM titles as t LEFT JOIN images as i ON (t.poster_id = i.id) LEFT JOIN title_tags as tt ON (t.id = tt.title_id) LEFT JOIN tags as g ON (tt.tag_id = g.id) LEFT JOIN studios as s ON (t.studio_id = s.id) LEFT JOIN images as si ON (s.illust_id = si.id) WHERE CASE WHEN $1::boolean THEN -- forward: greater than cursor (next page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year > $3::int) OR (t.release_year = $3::int AND t.id > $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating > $5::float) OR (t.rating = $5::float AND t.id > $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id > $4::bigint) ELSE true -- fallback END ELSE -- backward: less than cursor (prev page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year < $3::int) OR (t.release_year = $3::int AND t.id < $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating < $5::float) OR (t.rating = $5::float AND t.id < $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id < $4::bigint) ELSE true END END AND ( CASE WHEN $6::text IS NOT NULL THEN ( SELECT bool_and( EXISTS ( SELECT 1 FROM jsonb_each_text(t.title_names) AS t(key, val) WHERE val ILIKE pattern ) ) FROM unnest( ARRAY( SELECT '%' || trim(w) || '%' FROM unnest(string_to_array($6::text, ' ')) AS w WHERE trim(w) <> '' ) ) AS pattern ) ELSE true END ) AND (t.title_status::text IN ($7::text, $8::text, $9::text)) AND ($10::float IS NULL OR t.rating >= $10::float) AND ($11::int IS NULL OR t.release_year = $11::int) AND ($12::release_season_t IS NULL OR t.release_season = $12::release_season_t) GROUP BY t.id, i.id, s.id, si.id ORDER BY CASE WHEN $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating END END ASC, CASE WHEN NOT $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating END END DESC, CASE WHEN $2::text <> 'id' THEN t.id END ASC LIMIT COALESCE($13::int, 100) ` type SearchTitlesParams struct { Forward bool `json:"forward"` SortBy string `json:"sort_by"` CursorYear *int32 `json:"cursor_year"` CursorID *int64 `json:"cursor_id"` CursorRating *float64 `json:"cursor_rating"` Word *string `json:"word"` Ongoing string `json:"ongoing"` Finished string `json:"finished"` Planned string `json:"planned"` Rating *float64 `json:"rating"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` Limit *int32 `json:"limit"` } type SearchTitlesRow struct { ID int64 `json:"id"` TitleNames []byte `json:"title_names"` StudioID int64 `json:"studio_id"` PosterID *int64 `json:"poster_id"` TitleStatus TitleStatusT `json:"title_status"` Rating *float64 `json:"rating"` RatingCount *int32 `json:"rating_count"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` Season *int32 `json:"season"` EpisodesAired *int32 `json:"episodes_aired"` EpisodesAll *int32 `json:"episodes_all"` EpisodesLen []byte `json:"episodes_len"` TitleStorageType string `json:"title_storage_type"` TitleImagePath *string `json:"title_image_path"` TagNames []byte `json:"tag_names"` StudioName *string `json:"studio_name"` StudioIllustID *int64 `json:"studio_illust_id"` StudioDesc *string `json:"studio_desc"` StudioStorageType string `json:"studio_storage_type"` StudioImagePath *string `json:"studio_image_path"` } func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]SearchTitlesRow, error) { rows, err := q.db.Query(ctx, searchTitles, arg.Forward, arg.SortBy, arg.CursorYear, arg.CursorID, arg.CursorRating, arg.Word, arg.Ongoing, arg.Finished, arg.Planned, arg.Rating, arg.ReleaseYear, arg.ReleaseSeason, arg.Limit, ) if err != nil { return nil, err } defer rows.Close() items := []SearchTitlesRow{} for rows.Next() { var i SearchTitlesRow if err := rows.Scan( &i.ID, &i.TitleNames, &i.StudioID, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.EpisodesLen, &i.TitleStorageType, &i.TitleImagePath, &i.TagNames, &i.StudioName, &i.StudioIllustID, &i.StudioDesc, &i.StudioStorageType, &i.StudioImagePath, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const searchUserTitles = `-- name: SearchUserTitles :many SELECT user_id, title_id, status, rate, review_id, ctime, id, title_names, studio_id, poster_id, title_status, rating, rating_count, release_year, release_season, season, episodes_aired, episodes_all, episodes_len FROM usertitles as u JOIN titles as t ON (u.title_id = t.id) WHERE CASE WHEN $1::text IS NOT NULL THEN ( SELECT bool_and( EXISTS ( SELECT 1 FROM jsonb_each_text(t.title_names) AS t(key, val) WHERE val ILIKE pattern ) ) FROM unnest( ARRAY( SELECT '%' || trim(w) || '%' FROM unnest(string_to_array($1::text, ' ')) AS w WHERE trim(w) <> '' ) ) AS pattern ) ELSE true END AND ($2::title_status_t IS NULL OR t.title_status = $2::title_status_t) AND ($3::float IS NULL OR t.rating >= $3::float) AND ($4::int IS NULL OR t.release_year = $4::int) AND ($5::release_season_t IS NULL OR t.release_season = $5::release_season_t) AND ($6::usertitle_status_t IS NULL OR u.usertitle_status = $6::usertitle_status_t) LIMIT COALESCE($7::int, 100) ` type SearchUserTitlesParams struct { Word *string `json:"word"` Status *TitleStatusT `json:"status"` Rating *float64 `json:"rating"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` UsertitleStatus NullUsertitleStatusT `json:"usertitle_status"` Limit *int32 `json:"limit"` } type SearchUserTitlesRow struct { UserID int64 `json:"user_id"` TitleID int64 `json:"title_id"` Status UsertitleStatusT `json:"status"` Rate *int32 `json:"rate"` ReviewID *int64 `json:"review_id"` Ctime pgtype.Timestamptz `json:"ctime"` ID int64 `json:"id"` TitleNames []byte `json:"title_names"` StudioID int64 `json:"studio_id"` PosterID *int64 `json:"poster_id"` TitleStatus TitleStatusT `json:"title_status"` Rating *float64 `json:"rating"` RatingCount *int32 `json:"rating_count"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` Season *int32 `json:"season"` EpisodesAired *int32 `json:"episodes_aired"` EpisodesAll *int32 `json:"episodes_all"` EpisodesLen []byte `json:"episodes_len"` } // 100 is default limit func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesParams) ([]SearchUserTitlesRow, error) { rows, err := q.db.Query(ctx, searchUserTitles, arg.Word, arg.Status, arg.Rating, arg.ReleaseYear, arg.ReleaseSeason, arg.UsertitleStatus, arg.Limit, ) if err != nil { return nil, err } defer rows.Close() items := []SearchUserTitlesRow{} for rows.Next() { var i SearchUserTitlesRow if err := rows.Scan( &i.UserID, &i.TitleID, &i.Status, &i.Rate, &i.ReviewID, &i.Ctime, &i.ID, &i.TitleNames, &i.StudioID, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.EpisodesLen, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil }