db.go (2750B)
1 package main 2 3 import ( 4 "database/sql" 5 "log/slog" 6 "strings" 7 "uuid" 8 9 "github.com/mattn/go-sqlite3" 10 ) 11 12 // enums for various tables 13 14 type AlbumUserRoleEnum string 15 const ( 16 AlbumUserRoleEnumOwner AlbumUserRoleEnum = "owner" 17 AlbumUserRoleEnumEditor AlbumUserRoleEnum = "editor" 18 AlbumUserRoleEnumViewer AlbumUserRoleEnum = "viewer" 19 ) 20 21 type AssetChecksumAlgorithmEnum string 22 const ( 23 AssetChecksumAlgorithmEnumSha1 AssetChecksumAlgorithmEnum = "sha1" 24 AssetChecksumAlgorithmEnumSha1Path AssetChecksumAlgorithmEnum = "sha1-path" 25 ) 26 27 28 type AssetVisibilityEnum string 29 const ( 30 AssetVisibilityEnumArchive AssetVisibilityEnum = "archive" 31 AssetVisibilityEnumTimeline AssetVisibilityEnum = "timeline" 32 AssetVisibilityEnumHidden AssetVisibilityEnum = "hidden" 33 AssetVisibilityEnumLocked AssetVisibilityEnum = "locked" 34 ) 35 36 type AssetsStatusEnum string 37 const ( 38 AssetsStatusEnumActive AssetsStatusEnum = "active" 39 AssetsStatusEnumTrashed AssetsStatusEnum = "trashed" 40 AssetsStatusEnumDeleted AssetsStatusEnum = "deleted" 41 ) 42 43 44 type SourceTypeEnum string 45 const ( 46 SourceTypeEnumMachineLearning SourceTypeEnum = "machine-learning" 47 SourceTypeEnumExif SourceTypeEnum = "exif" 48 SourceTypeEnumManual SourceTypeEnum = "manual" 49 ) 50 51 type VideoStreamVariantCodecEnum string 52 const ( 53 VideoStreamVariantCodecEnumAv1 VideoStreamVariantCodecEnum = "av1" 54 VideoStreamVariantCodecEnumHevc VideoStreamVariantCodecEnum = "hevc" 55 VideoStreamVariantCodecEnumH264 VideoStreamVariantCodecEnum = "h264" 56 ) 57 58 59 // custom functions we need to implement 60 func RegisterCustomFunctions() { 61 sql.Register("sqlite3_custom", &sqlite3.SQLiteDriver{ 62 ConnectHook: func(sc *sqlite3.SQLiteConn) error { 63 err := sc.RegisterFunc("f_concat_ws", fConcatWs, true) 64 if err != nil { 65 return err 66 } 67 err = sc.RegisterFunc("f_unaccent", fUnaccent, true) 68 if err != nil { 69 return err 70 } 71 err = sc.RegisterFunc("immich_uuid_v7", immichUuidV7, true) 72 if err != nil { 73 return err 74 } 75 err = sc.RegisterFunc("uuid_generate_v4", uuidGenerateV4, true) 76 if err != nil { 77 return err 78 } 79 slog.Info("custom functions registered") 80 81 return nil 82 }, 83 }) 84 } 85 86 func fConcatWs(a string, b any) string { 87 // CREATE FUNCTION public.f_concat_ws(text, text[]) RETURNS text 88 // LANGUAGE sql IMMUTABLE PARALLEL SAFE 89 // AS $_$SELECT array_to_string($2, $1)$_$; 90 return strings.Join(b.([]string), a) 91 } 92 93 func fUnaccent(a string) string { 94 // CREATE FUNCTION public.f_unaccent(text) RETURNS text 95 // LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE 96 // RETURN public.unaccent('public.unaccent'::regdictionary, $1); 97 panic("unimplemented") 98 } 99 100 func immichUuidV7() string { 101 u := uuid.NewV7() 102 return u.String() 103 } 104 105 func uuidGenerateV4() string { 106 u := uuid.NewV4() 107 return u.String() 108 }