@@ -3,34 +3,60 @@ require "pg"
33module Invidious::Database
44 extend self
55
6- def check_enum (db, enum_name, struct_type = nil )
6+ # Checks table integrity
7+ #
8+ # Note: config is passed as a parameter to avoid complex
9+ # dependencies between different parts of the software.
10+ def check_integrity (cfg )
11+ return if ! cfg.check_tables
12+ Invidious ::Database .check_enum(" privacy" , PlaylistPrivacy )
13+
14+ Invidious ::Database .check_table(" channels" , InvidiousChannel )
15+ Invidious ::Database .check_table(" channel_videos" , ChannelVideo )
16+ Invidious ::Database .check_table(" playlists" , InvidiousPlaylist )
17+ Invidious ::Database .check_table(" playlist_videos" , PlaylistVideo )
18+ Invidious ::Database .check_table(" nonces" , Nonce )
19+ Invidious ::Database .check_table(" session_ids" , SessionId )
20+ Invidious ::Database .check_table(" users" , User )
21+ Invidious ::Database .check_table(" videos" , Video )
22+
23+ if cfg.cache_annotations
24+ Invidious ::Database .check_table(" annotations" , Annotation )
25+ end
26+ end
27+
28+ #
29+ # Table/enum integrity checks
30+ #
31+
32+ def check_enum (enum_name, struct_type = nil )
733 return # TODO
834
9- if ! db .query_one?(" SELECT true FROM pg_type WHERE typname = $1" , enum_name, as: Bool )
35+ if ! PG_DB .query_one?(" SELECT true FROM pg_type WHERE typname = $1" , enum_name, as: Bool )
1036 LOGGER .info(" check_enum: CREATE TYPE #{ enum_name } " )
1137
12- db .using_connection do |conn |
38+ PG_DB .using_connection do |conn |
1339 conn.as(PG ::Connection ).exec_all(File .read(" config/sql/#{ enum_name } .sql" ))
1440 end
1541 end
1642 end
1743
18- def check_table (db, table_name, struct_type = nil )
44+ def check_table (table_name, struct_type = nil )
1945 # Create table if it doesn't exist
2046 begin
21- db .exec(" SELECT * FROM #{ table_name } LIMIT 0" )
47+ PG_DB .exec(" SELECT * FROM #{ table_name } LIMIT 0" )
2248 rescue ex
2349 LOGGER .info(" check_table: check_table: CREATE TABLE #{ table_name } " )
2450
25- db .using_connection do |conn |
51+ PG_DB .using_connection do |conn |
2652 conn.as(PG ::Connection ).exec_all(File .read(" config/sql/#{ table_name } .sql" ))
2753 end
2854 end
2955
3056 return if ! struct_type
3157
3258 struct_array = struct_type.type_array
33- column_array = get_column_array(db , table_name)
59+ column_array = get_column_array(PG_DB , table_name)
3460 column_types = File .read(" config/sql/#{ table_name } .sql" ).match(/CREATE TABLE public\. #{ table_name } \n\( (?<types>[\d\D ] *?) \) ;/ )
3561 .try & .[" types" ].split(" ," ).map(& .strip).reject & .starts_with?(" CONSTRAINT" )
3662
@@ -41,14 +67,14 @@ module Invidious::Database
4167 if ! column_array[i]?
4268 new_column = column_types.select(& .starts_with?(name))[0 ]
4369 LOGGER .info(" check_table: ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
44- db .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
70+ PG_DB .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
4571 next
4672 end
4773
4874 # Column doesn't exist
4975 if ! column_array.includes? name
5076 new_column = column_types.select(& .starts_with?(name))[0 ]
51- db .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
77+ PG_DB .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
5278 end
5379
5480 # Column exists but in the wrong position, rotate
@@ -59,29 +85,29 @@ module Invidious::Database
5985 # There's a column we didn't expect
6086 if ! new_column
6187 LOGGER .info(" check_table: ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } " )
62- db .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
88+ PG_DB .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
6389
64- column_array = get_column_array(db , table_name)
90+ column_array = get_column_array(PG_DB , table_name)
6591 next
6692 end
6793
6894 LOGGER .info(" check_table: ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
69- db .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
95+ PG_DB .exec(" ALTER TABLE #{ table_name } ADD COLUMN #{ new_column } " )
7096
7197 LOGGER .info(" check_table: UPDATE #{ table_name } SET #{ column_array[i] } _new=#{ column_array[i] } " )
72- db .exec(" UPDATE #{ table_name } SET #{ column_array[i] } _new=#{ column_array[i] } " )
98+ PG_DB .exec(" UPDATE #{ table_name } SET #{ column_array[i] } _new=#{ column_array[i] } " )
7399
74100 LOGGER .info(" check_table: ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
75- db .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
101+ PG_DB .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
76102
77103 LOGGER .info(" check_table: ALTER TABLE #{ table_name } RENAME COLUMN #{ column_array[i] } _new TO #{ column_array[i] } " )
78- db .exec(" ALTER TABLE #{ table_name } RENAME COLUMN #{ column_array[i] } _new TO #{ column_array[i] } " )
104+ PG_DB .exec(" ALTER TABLE #{ table_name } RENAME COLUMN #{ column_array[i] } _new TO #{ column_array[i] } " )
79105
80- column_array = get_column_array(db , table_name)
106+ column_array = get_column_array(PG_DB , table_name)
81107 end
82108 else
83109 LOGGER .info(" check_table: ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
84- db .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
110+ PG_DB .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column_array[i] } CASCADE" )
85111 end
86112 end
87113 end
@@ -91,14 +117,14 @@ module Invidious::Database
91117 column_array.each do |column |
92118 if ! struct_array.includes? column
93119 LOGGER .info(" check_table: ALTER TABLE #{ table_name } DROP COLUMN #{ column } CASCADE" )
94- db .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column } CASCADE" )
120+ PG_DB .exec(" ALTER TABLE #{ table_name } DROP COLUMN #{ column } CASCADE" )
95121 end
96122 end
97123 end
98124
99125 def get_column_array (db, table_name)
100126 column_array = [] of String
101- db .query(" SELECT * FROM #{ table_name } LIMIT 0" ) do |rs |
127+ PG_DB .query(" SELECT * FROM #{ table_name } LIMIT 0" ) do |rs |
102128 rs.column_count.times do |i |
103129 column = rs.as(PG ::ResultSet ).field(i)
104130 column_array << column.name
0 commit comments