Re: Proposal: manipulating pg_control file from Perl
От | Dagfinn Ilmari Mannsåker |
---|---|
Тема | Re: Proposal: manipulating pg_control file from Perl |
Дата | |
Msg-id | 87o6y3zntj.fsf@wibble.ilmari.org обсуждение исходный текст |
Ответ на | Proposal: manipulating pg_control file from Perl (Aleksander Alekseev <aleksander@timescale.com>) |
Ответы |
Re: Proposal: manipulating pg_control file from Perl
|
Список | pgsql-hackers |
Aleksander Alekseev <aleksander@timescale.com> writes: > Hi Dagfinn, > >> Notwitstanding Tom's objections, these are not reasons for not being >> able to manipulate these values from Perl. The `i` and `I` formats for >> pack/unpack (see https://perldoc.perl.org/functions/pack) use what the C >> compiler calls `int`, in terms of both endianness and size. >> >> > For named reasons, manipulating pg_upgrade from Perl is impractical, >> > considering the number of environments we support. >> > >> > I see two possible solutions: >> > >> > 1) Provide a tool written in C that allows changing pg_control, e.g. >> > `pg_writecontoldata` or maybe a flat like `pg_controldata -w`. The >> > tool can be executed from Perl, so it shouldn't know about >> > sizeof(int), alignment and endiness. >> >> 1.5) Use Perl's pack/unpack functions, which are explicitly desgined for >> exactly this use case. > > Thanks for your reply. > > It is my understanding that Perl is not extremely aware of alignment. > For instance if I want to modify the checksum of the file and the > offset of the checksum is let's say 200 bytes on one platform, 204 on > another and 208 on a third, pack/unpack will not help me. > > Or did I miss something? You have to specify alignment manually using the `x![$type]` notation. I actually wrote up a pack template for the entire control file (assuming all types have alignof==sizeof), and it seems to work. Run the attached with a Postgres 17 data directory as the arguemnt, and it should show all the fields. - ilmari
Вложения
В списке pgsql-hackers по дате отправления: