From c0fb0a5ec04c064bb848534185b51c5d1b7bdaaf Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 4 Mar 2021 08:30:52 +0300 Subject: [PATCH] wip for db_migrations for core schema --- classes/config.php | 26 +++++--- classes/db/migrations.php | 59 ++++++++++++++++--- classes/debug.php | 5 ++ .../mysql => sql/mysql/migrations}/10.sql | 0 .../mysql => sql/mysql/migrations}/100.sql | 0 .../mysql => sql/mysql/migrations}/101.sql | 0 .../mysql => sql/mysql/migrations}/102.sql | 0 .../mysql => sql/mysql/migrations}/103.sql | 0 .../mysql => sql/mysql/migrations}/104.sql | 0 .../mysql => sql/mysql/migrations}/105.sql | 0 .../mysql => sql/mysql/migrations}/106.sql | 0 .../mysql => sql/mysql/migrations}/107.sql | 0 .../mysql => sql/mysql/migrations}/108.sql | 0 .../mysql => sql/mysql/migrations}/109.sql | 0 .../mysql => sql/mysql/migrations}/11.sql | 0 .../mysql => sql/mysql/migrations}/110.sql | 0 .../mysql => sql/mysql/migrations}/111.sql | 0 .../mysql => sql/mysql/migrations}/112.sql | 0 .../mysql => sql/mysql/migrations}/113.sql | 0 .../mysql => sql/mysql/migrations}/114.sql | 0 .../mysql => sql/mysql/migrations}/115.sql | 0 .../mysql => sql/mysql/migrations}/116.sql | 0 .../mysql => sql/mysql/migrations}/117.sql | 0 .../mysql => sql/mysql/migrations}/118.sql | 0 .../mysql => sql/mysql/migrations}/119.sql | 0 .../mysql => sql/mysql/migrations}/12.sql | 0 .../mysql => sql/mysql/migrations}/120.sql | 0 .../mysql => sql/mysql/migrations}/121.sql | 0 .../mysql => sql/mysql/migrations}/122.sql | 0 .../mysql => sql/mysql/migrations}/123.sql | 0 .../mysql => sql/mysql/migrations}/124.sql | 0 .../mysql => sql/mysql/migrations}/125.sql | 0 .../mysql => sql/mysql/migrations}/126.sql | 0 .../mysql => sql/mysql/migrations}/127.sql | 0 .../mysql => sql/mysql/migrations}/128.sql | 0 .../mysql => sql/mysql/migrations}/129.sql | 0 .../mysql => sql/mysql/migrations}/13.sql | 0 .../mysql => sql/mysql/migrations}/130.sql | 0 .../mysql => sql/mysql/migrations}/131.sql | 0 .../mysql => sql/mysql/migrations}/132.sql | 0 .../mysql => sql/mysql/migrations}/133.sql | 0 .../mysql => sql/mysql/migrations}/134.sql | 0 .../mysql => sql/mysql/migrations}/135.sql | 0 .../mysql => sql/mysql/migrations}/136.sql | 0 .../mysql => sql/mysql/migrations}/137.sql | 0 .../mysql => sql/mysql/migrations}/138.sql | 0 .../mysql => sql/mysql/migrations}/139.sql | 0 .../mysql => sql/mysql/migrations}/14.sql | 0 .../mysql => sql/mysql/migrations}/140.sql | 0 .../mysql => sql/mysql/migrations}/141.sql | 0 .../mysql => sql/mysql/migrations}/142.sql | 0 .../mysql => sql/mysql/migrations}/15.sql | 0 .../mysql => sql/mysql/migrations}/16.sql | 0 .../mysql => sql/mysql/migrations}/17.sql | 0 .../mysql => sql/mysql/migrations}/18.sql | 0 .../mysql => sql/mysql/migrations}/19.sql | 0 .../mysql => sql/mysql/migrations}/20.sql | 0 .../mysql => sql/mysql/migrations}/21.sql | 0 .../mysql => sql/mysql/migrations}/22.sql | 0 .../mysql => sql/mysql/migrations}/23.sql | 0 .../mysql => sql/mysql/migrations}/24.sql | 0 .../mysql => sql/mysql/migrations}/25.sql | 0 .../mysql => sql/mysql/migrations}/26.sql | 0 .../mysql => sql/mysql/migrations}/27.sql | 0 .../mysql => sql/mysql/migrations}/28.sql | 0 .../mysql => sql/mysql/migrations}/29.sql | 0 .../mysql => sql/mysql/migrations}/3.sql | 0 .../mysql => sql/mysql/migrations}/30.sql | 0 .../mysql => sql/mysql/migrations}/31.sql | 0 .../mysql => sql/mysql/migrations}/32.sql | 0 .../mysql => sql/mysql/migrations}/33.sql | 0 .../mysql => sql/mysql/migrations}/34.sql | 0 .../mysql => sql/mysql/migrations}/35.sql | 0 .../mysql => sql/mysql/migrations}/36.sql | 0 .../mysql => sql/mysql/migrations}/37.sql | 0 .../mysql => sql/mysql/migrations}/38.sql | 0 .../mysql => sql/mysql/migrations}/39.sql | 0 .../mysql => sql/mysql/migrations}/4.sql | 0 .../mysql => sql/mysql/migrations}/40.sql | 0 .../mysql => sql/mysql/migrations}/41.sql | 0 .../mysql => sql/mysql/migrations}/42.sql | 0 .../mysql => sql/mysql/migrations}/43.sql | 0 .../mysql => sql/mysql/migrations}/44.sql | 0 .../mysql => sql/mysql/migrations}/45.sql | 0 .../mysql => sql/mysql/migrations}/46.sql | 0 .../mysql => sql/mysql/migrations}/47.sql | 0 .../mysql => sql/mysql/migrations}/48.sql | 0 .../mysql => sql/mysql/migrations}/49.sql | 0 .../mysql => sql/mysql/migrations}/5.sql | 0 .../mysql => sql/mysql/migrations}/50.sql | 0 .../mysql => sql/mysql/migrations}/51.sql | 0 .../mysql => sql/mysql/migrations}/52.sql | 0 .../mysql => sql/mysql/migrations}/53.sql | 0 .../mysql => sql/mysql/migrations}/54.sql | 0 .../mysql => sql/mysql/migrations}/55.sql | 0 .../mysql => sql/mysql/migrations}/56.sql | 0 .../mysql => sql/mysql/migrations}/57.sql | 0 .../mysql => sql/mysql/migrations}/58.sql | 0 .../mysql => sql/mysql/migrations}/59.sql | 0 .../mysql => sql/mysql/migrations}/6.sql | 0 .../mysql => sql/mysql/migrations}/60.sql | 0 .../mysql => sql/mysql/migrations}/61.sql | 0 .../mysql => sql/mysql/migrations}/62.sql | 0 .../mysql => sql/mysql/migrations}/63.sql | 0 .../mysql => sql/mysql/migrations}/64.sql | 0 .../mysql => sql/mysql/migrations}/65.sql | 0 .../mysql => sql/mysql/migrations}/66.sql | 0 .../mysql => sql/mysql/migrations}/67.sql | 0 .../mysql => sql/mysql/migrations}/68.sql | 0 .../mysql => sql/mysql/migrations}/69.sql | 0 .../mysql => sql/mysql/migrations}/7.sql | 0 .../mysql => sql/mysql/migrations}/70.sql | 0 .../mysql => sql/mysql/migrations}/71.sql | 0 .../mysql => sql/mysql/migrations}/72.sql | 0 .../mysql => sql/mysql/migrations}/73.sql | 0 .../mysql => sql/mysql/migrations}/74.sql | 0 .../mysql => sql/mysql/migrations}/75.sql | 0 .../mysql => sql/mysql/migrations}/76.sql | 0 .../mysql => sql/mysql/migrations}/77.sql | 0 .../mysql => sql/mysql/migrations}/78.sql | 0 .../mysql => sql/mysql/migrations}/79.sql | 0 .../mysql => sql/mysql/migrations}/8.sql | 0 .../mysql => sql/mysql/migrations}/80.sql | 0 .../mysql => sql/mysql/migrations}/81.sql | 0 .../mysql => sql/mysql/migrations}/82.sql | 0 .../mysql => sql/mysql/migrations}/83.sql | 0 .../mysql => sql/mysql/migrations}/84.sql | 0 .../mysql => sql/mysql/migrations}/85.sql | 0 .../mysql => sql/mysql/migrations}/86.sql | 0 .../mysql => sql/mysql/migrations}/87.sql | 0 .../mysql => sql/mysql/migrations}/88.sql | 0 .../mysql => sql/mysql/migrations}/89.sql | 0 .../mysql => sql/mysql/migrations}/9.sql | 0 .../mysql => sql/mysql/migrations}/90.sql | 0 .../mysql => sql/mysql/migrations}/91.sql | 0 .../mysql => sql/mysql/migrations}/92.sql | 0 .../mysql => sql/mysql/migrations}/93.sql | 0 .../mysql => sql/mysql/migrations}/94.sql | 0 .../mysql => sql/mysql/migrations}/95.sql | 0 .../mysql => sql/mysql/migrations}/96.sql | 0 .../mysql => sql/mysql/migrations}/97.sql | 0 .../mysql => sql/mysql/migrations}/98.sql | 0 .../mysql => sql/mysql/migrations}/99.sql | 0 .../mysql/schema.sql | 0 .../pgsql => sql/pgsql/migrations}/10.sql | 0 .../pgsql => sql/pgsql/migrations}/100.sql | 0 .../pgsql => sql/pgsql/migrations}/101.sql | 0 .../pgsql => sql/pgsql/migrations}/102.sql | 0 .../pgsql => sql/pgsql/migrations}/103.sql | 0 .../pgsql => sql/pgsql/migrations}/104.sql | 0 .../pgsql => sql/pgsql/migrations}/105.sql | 0 .../pgsql => sql/pgsql/migrations}/106.sql | 0 .../pgsql => sql/pgsql/migrations}/107.sql | 0 .../pgsql => sql/pgsql/migrations}/108.sql | 0 .../pgsql => sql/pgsql/migrations}/109.sql | 0 .../pgsql => sql/pgsql/migrations}/11.sql | 0 .../pgsql => sql/pgsql/migrations}/110.sql | 0 .../pgsql => sql/pgsql/migrations}/111.sql | 0 .../pgsql => sql/pgsql/migrations}/112.sql | 0 .../pgsql => sql/pgsql/migrations}/113.sql | 0 .../pgsql => sql/pgsql/migrations}/114.sql | 0 .../pgsql => sql/pgsql/migrations}/115.sql | 0 .../pgsql => sql/pgsql/migrations}/116.sql | 0 .../pgsql => sql/pgsql/migrations}/117.sql | 0 .../pgsql => sql/pgsql/migrations}/118.sql | 0 .../pgsql => sql/pgsql/migrations}/119.sql | 0 .../pgsql => sql/pgsql/migrations}/12.sql | 0 .../pgsql => sql/pgsql/migrations}/120.sql | 0 .../pgsql => sql/pgsql/migrations}/121.sql | 0 .../pgsql => sql/pgsql/migrations}/122.sql | 0 .../pgsql => sql/pgsql/migrations}/123.sql | 0 .../pgsql => sql/pgsql/migrations}/124.sql | 0 .../pgsql => sql/pgsql/migrations}/125.sql | 0 .../pgsql => sql/pgsql/migrations}/126.sql | 0 .../pgsql => sql/pgsql/migrations}/127.sql | 0 .../pgsql => sql/pgsql/migrations}/128.sql | 0 .../pgsql => sql/pgsql/migrations}/129.sql | 0 .../pgsql => sql/pgsql/migrations}/13.sql | 0 .../pgsql => sql/pgsql/migrations}/130.sql | 0 .../pgsql => sql/pgsql/migrations}/131.sql | 0 .../pgsql => sql/pgsql/migrations}/132.sql | 0 .../pgsql => sql/pgsql/migrations}/133.sql | 0 .../pgsql => sql/pgsql/migrations}/134.sql | 0 .../pgsql => sql/pgsql/migrations}/135.sql | 0 .../pgsql => sql/pgsql/migrations}/136.sql | 0 .../pgsql => sql/pgsql/migrations}/137.sql | 0 .../pgsql => sql/pgsql/migrations}/138.sql | 0 .../pgsql => sql/pgsql/migrations}/139.sql | 0 .../pgsql => sql/pgsql/migrations}/14.sql | 0 .../pgsql => sql/pgsql/migrations}/140.sql | 0 .../pgsql => sql/pgsql/migrations}/141.sql | 0 .../pgsql => sql/pgsql/migrations}/142.sql | 0 .../pgsql => sql/pgsql/migrations}/15.sql | 0 .../pgsql => sql/pgsql/migrations}/16.sql | 0 .../pgsql => sql/pgsql/migrations}/17.sql | 0 .../pgsql => sql/pgsql/migrations}/18.sql | 0 .../pgsql => sql/pgsql/migrations}/19.sql | 0 .../pgsql => sql/pgsql/migrations}/20.sql | 0 .../pgsql => sql/pgsql/migrations}/21.sql | 0 .../pgsql => sql/pgsql/migrations}/22.sql | 0 .../pgsql => sql/pgsql/migrations}/23.sql | 0 .../pgsql => sql/pgsql/migrations}/24.sql | 0 .../pgsql => sql/pgsql/migrations}/25.sql | 0 .../pgsql => sql/pgsql/migrations}/26.sql | 0 .../pgsql => sql/pgsql/migrations}/27.sql | 0 .../pgsql => sql/pgsql/migrations}/28.sql | 0 .../pgsql => sql/pgsql/migrations}/29.sql | 0 .../pgsql => sql/pgsql/migrations}/3.sql | 0 .../pgsql => sql/pgsql/migrations}/30.sql | 0 .../pgsql => sql/pgsql/migrations}/31.sql | 0 .../pgsql => sql/pgsql/migrations}/32.sql | 0 .../pgsql => sql/pgsql/migrations}/33.sql | 0 .../pgsql => sql/pgsql/migrations}/34.sql | 0 .../pgsql => sql/pgsql/migrations}/35.sql | 0 .../pgsql => sql/pgsql/migrations}/36.sql | 0 .../pgsql => sql/pgsql/migrations}/37.sql | 0 .../pgsql => sql/pgsql/migrations}/38.sql | 0 .../pgsql => sql/pgsql/migrations}/39.sql | 0 .../pgsql => sql/pgsql/migrations}/4.sql | 0 .../pgsql => sql/pgsql/migrations}/40.sql | 0 .../pgsql => sql/pgsql/migrations}/41.sql | 0 .../pgsql => sql/pgsql/migrations}/42.sql | 0 .../pgsql => sql/pgsql/migrations}/43.sql | 0 .../pgsql => sql/pgsql/migrations}/44.sql | 0 .../pgsql => sql/pgsql/migrations}/45.sql | 0 .../pgsql => sql/pgsql/migrations}/46.sql | 0 .../pgsql => sql/pgsql/migrations}/47.sql | 0 .../pgsql => sql/pgsql/migrations}/48.sql | 0 .../pgsql => sql/pgsql/migrations}/49.sql | 0 .../pgsql => sql/pgsql/migrations}/5.sql | 0 .../pgsql => sql/pgsql/migrations}/50.sql | 0 .../pgsql => sql/pgsql/migrations}/51.sql | 0 .../pgsql => sql/pgsql/migrations}/52.sql | 0 .../pgsql => sql/pgsql/migrations}/53.sql | 0 .../pgsql => sql/pgsql/migrations}/54.sql | 0 .../pgsql => sql/pgsql/migrations}/55.sql | 0 .../pgsql => sql/pgsql/migrations}/56.sql | 0 .../pgsql => sql/pgsql/migrations}/57.sql | 0 .../pgsql => sql/pgsql/migrations}/58.sql | 0 .../pgsql => sql/pgsql/migrations}/59.sql | 0 .../pgsql => sql/pgsql/migrations}/6.sql | 0 .../pgsql => sql/pgsql/migrations}/60.sql | 0 .../pgsql => sql/pgsql/migrations}/61.sql | 0 .../pgsql => sql/pgsql/migrations}/62.sql | 0 .../pgsql => sql/pgsql/migrations}/63.sql | 0 .../pgsql => sql/pgsql/migrations}/64.sql | 0 .../pgsql => sql/pgsql/migrations}/65.sql | 0 .../pgsql => sql/pgsql/migrations}/66.sql | 0 .../pgsql => sql/pgsql/migrations}/67.sql | 0 .../pgsql => sql/pgsql/migrations}/68.sql | 0 .../pgsql => sql/pgsql/migrations}/69.sql | 0 .../pgsql => sql/pgsql/migrations}/7.sql | 0 .../pgsql => sql/pgsql/migrations}/70.sql | 0 .../pgsql => sql/pgsql/migrations}/71.sql | 0 .../pgsql => sql/pgsql/migrations}/72.sql | 0 .../pgsql => sql/pgsql/migrations}/73.sql | 0 .../pgsql => sql/pgsql/migrations}/74.sql | 0 .../pgsql => sql/pgsql/migrations}/75.sql | 0 .../pgsql => sql/pgsql/migrations}/76.sql | 0 .../pgsql => sql/pgsql/migrations}/77.sql | 0 .../pgsql => sql/pgsql/migrations}/78.sql | 0 .../pgsql => sql/pgsql/migrations}/79.sql | 0 .../pgsql => sql/pgsql/migrations}/8.sql | 0 .../pgsql => sql/pgsql/migrations}/80.sql | 0 .../pgsql => sql/pgsql/migrations}/81.sql | 0 .../pgsql => sql/pgsql/migrations}/82.sql | 0 .../pgsql => sql/pgsql/migrations}/83.sql | 0 .../pgsql => sql/pgsql/migrations}/84.sql | 0 .../pgsql => sql/pgsql/migrations}/85.sql | 0 .../pgsql => sql/pgsql/migrations}/86.sql | 0 .../pgsql => sql/pgsql/migrations}/87.sql | 0 .../pgsql => sql/pgsql/migrations}/88.sql | 0 .../pgsql => sql/pgsql/migrations}/89.sql | 0 .../pgsql => sql/pgsql/migrations}/9.sql | 0 .../pgsql => sql/pgsql/migrations}/90.sql | 0 .../pgsql => sql/pgsql/migrations}/91.sql | 0 .../pgsql => sql/pgsql/migrations}/92.sql | 0 .../pgsql => sql/pgsql/migrations}/93.sql | 0 .../pgsql => sql/pgsql/migrations}/94.sql | 0 .../pgsql => sql/pgsql/migrations}/95.sql | 0 .../pgsql => sql/pgsql/migrations}/96.sql | 0 .../pgsql => sql/pgsql/migrations}/97.sql | 0 .../pgsql => sql/pgsql/migrations}/98.sql | 0 .../pgsql => sql/pgsql/migrations}/99.sql | 0 .../pgsql/schema.sql | 0 update.php | 35 +++++++++-- 286 files changed, 102 insertions(+), 23 deletions(-) rename {schema/versions/mysql => sql/mysql/migrations}/10.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/100.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/101.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/102.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/103.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/104.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/105.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/106.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/107.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/108.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/109.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/11.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/110.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/111.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/112.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/113.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/114.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/115.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/116.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/117.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/118.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/119.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/12.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/120.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/121.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/122.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/123.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/124.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/125.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/126.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/127.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/128.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/129.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/13.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/130.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/131.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/132.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/133.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/134.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/135.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/136.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/137.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/138.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/139.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/14.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/140.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/141.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/142.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/15.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/16.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/17.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/18.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/19.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/20.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/21.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/22.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/23.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/24.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/25.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/26.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/27.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/28.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/29.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/3.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/30.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/31.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/32.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/33.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/34.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/35.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/36.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/37.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/38.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/39.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/4.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/40.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/41.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/42.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/43.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/44.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/45.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/46.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/47.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/48.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/49.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/5.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/50.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/51.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/52.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/53.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/54.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/55.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/56.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/57.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/58.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/59.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/6.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/60.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/61.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/62.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/63.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/64.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/65.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/66.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/67.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/68.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/69.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/7.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/70.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/71.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/72.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/73.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/74.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/75.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/76.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/77.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/78.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/79.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/8.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/80.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/81.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/82.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/83.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/84.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/85.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/86.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/87.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/88.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/89.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/9.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/90.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/91.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/92.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/93.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/94.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/95.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/96.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/97.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/98.sql (100%) rename {schema/versions/mysql => sql/mysql/migrations}/99.sql (100%) rename schema/ttrss_schema_mysql.sql => sql/mysql/schema.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/10.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/100.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/101.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/102.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/103.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/104.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/105.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/106.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/107.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/108.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/109.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/11.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/110.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/111.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/112.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/113.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/114.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/115.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/116.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/117.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/118.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/119.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/12.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/120.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/121.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/122.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/123.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/124.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/125.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/126.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/127.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/128.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/129.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/13.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/130.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/131.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/132.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/133.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/134.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/135.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/136.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/137.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/138.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/139.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/14.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/140.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/141.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/142.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/15.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/16.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/17.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/18.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/19.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/20.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/21.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/22.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/23.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/24.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/25.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/26.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/27.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/28.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/29.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/3.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/30.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/31.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/32.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/33.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/34.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/35.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/36.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/37.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/38.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/39.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/4.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/40.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/41.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/42.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/43.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/44.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/45.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/46.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/47.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/48.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/49.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/5.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/50.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/51.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/52.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/53.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/54.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/55.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/56.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/57.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/58.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/59.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/6.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/60.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/61.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/62.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/63.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/64.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/65.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/66.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/67.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/68.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/69.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/7.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/70.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/71.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/72.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/73.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/74.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/75.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/76.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/77.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/78.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/79.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/8.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/80.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/81.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/82.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/83.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/84.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/85.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/86.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/87.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/88.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/89.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/9.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/90.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/91.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/92.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/93.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/94.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/95.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/96.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/97.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/98.sql (100%) rename {schema/versions/pgsql => sql/pgsql/migrations}/99.sql (100%) rename schema/ttrss_schema_pgsql.sql => sql/pgsql/schema.sql (100%) diff --git a/classes/config.php b/classes/config.php index 7a37d4a86..30b65305a 100644 --- a/classes/config.php +++ b/classes/config.php @@ -114,6 +114,9 @@ class Config { private $schema_version = null; private $version = []; + /** @var Db_Migrations $migrations */ + private $migrations; + public static function get_instance() : Config { if (self::$instance == null) self::$instance = new self(); @@ -218,18 +221,25 @@ class Config { return $rv; } - static function get_schema_version(bool $nocache = false) { - return self::get_instance()->_schema_version($nocache); + static function get_migrations() : Db_Migrations { + return self::get_instance()->_get_migrations(); } - function _schema_version(bool $nocache = false) { - if (empty($this->schema_version) || $nocache) { - $row = Db::pdo()->query("SELECT schema_version FROM ttrss_version")->fetch(); - - $this->schema_version = (int) $row["schema_version"]; + private function _get_migrations() : Db_Migrations { + if (empty($this->migrations)) { + $this->migrations = new Db_Migrations(); + $this->migrations->initialize(dirname(__DIR__) . "/sql", "ttrss_version", true); } - return $this->schema_version; + return $this->migrations; + } + + static function is_migration_needed() : bool { + return self::get_migrations()->is_migration_needed(); + } + + static function get_schema_version() : int { + return self::get_migrations()->get_version(); } static function cast_to(string $value, int $type_hint) { diff --git a/classes/db/migrations.php b/classes/db/migrations.php index f85b4d7c7..e77904f60 100644 --- a/classes/db/migrations.php +++ b/classes/db/migrations.php @@ -10,6 +10,7 @@ class Db_Migrations { private $cached_version; private $cached_max_version; + private $max_version_override; function __construct() { $this->pdo = Db::pdo(); @@ -22,14 +23,17 @@ class Db_Migrations { $base_is_latest); } - function initialize(string $root_path, string $migrations_table, bool $base_is_latest = true) { + function initialize(string $root_path, string $migrations_table, bool $base_is_latest = true, int $max_version_override = 0) { $this->base_path = "$root_path/" . Config::get(Config::DB_TYPE); $this->migrations_path = $this->base_path . "/migrations"; $this->migrations_table = $migrations_table; $this->base_is_latest = $base_is_latest; + $this->max_version_override = $max_version_override; } private function set_version(int $version) { + Debug::log("Updating table {$this->migrations_table} with version ${version}...", Debug::LOG_EXTENDED); + $sth = $this->pdo->query("SELECT * FROM {$this->migrations_table}"); if ($res = $sth->fetch()) { @@ -43,7 +47,7 @@ class Db_Migrations { $this->cached_version = $version; } - private function get_version() : int { + function get_version() : int { if (isset($this->cached_version)) return $this->cached_version; @@ -68,10 +72,26 @@ class Db_Migrations { private function migrate_to(int $version) { try { + if ($version <= $this->get_version()) { + Debug::log("Refusing to apply version $version: current version is higher", Debug::LOG_VERBOSE); + return false; + } + + if ($version == 0) + Debug::log("Loading base database schema...", Debug::LOG_VERBOSE); + else + Debug::log("Starting migration to $version...", Debug::LOG_VERBOSE); + $this->pdo->beginTransaction(); foreach ($this->get_lines($version) as $line) { - $this->pdo->query($line); + Debug::log($line, Debug::LOG_EXTENDED); + try { + $this->pdo->query($line); + } catch (PDOException $e) { + Debug::log("Failed on line: $line"); + throw $e; + } } if ($version == 0 && $this->base_is_latest) @@ -80,7 +100,10 @@ class Db_Migrations { $this->set_version($version); $this->pdo->commit(); + Debug::log("Migration finished, current version: " . $this->get_version(), Debug::LOG_VERBOSE); + } catch (PDOException $e) { + Debug::log("Migration failed: " . $e->getMessage(), Debug::LOG_VERBOSE); try { $this->pdo->rollback(); } catch (PDOException $ie) { @@ -90,7 +113,10 @@ class Db_Migrations { } } - private function get_max_version() : int { + function get_max_version() : int { + if ($this->max_version_override > 0) + return $this->max_version_override; + if (isset($this->cached_max_version)) return $this->cached_max_version; @@ -108,17 +134,32 @@ class Db_Migrations { return $this->cached_max_version; } + function is_migration_needed() : bool { + return $this->get_version() != $this->get_max_version(); + } + function migrate() : bool { - for ($i = $this->get_version() + 1; $i <= $this->get_max_version(); $i++) + if ($this->get_version() == -1) { + try { + $this->migrate_to(0); + } catch (PDOException $e) { + user_error("Failed to load base schema for {$this->migrations_table}: " . $e->getMessage(), E_USER_WARNING); + return false; + } + } + + for ($i = $this->get_version() + 1; $i <= $this->get_max_version(); $i++) { try { $this->migrate_to($i); } catch (PDOException $e) { - user_error("Failed applying migration $i on table {$this->migrations_table}: " . $e->getMessage(), E_USER_WARNING); + user_error("Failed to apply migration ${i} for {$this->migrations_table}: " . $e->getMessage(), E_USER_WARNING); + return false; //throw $e; } + } - return $this->get_version() == $this->get_max_version(); + return !$this->is_migration_needed(); } private function get_lines(int $version) : array { @@ -134,11 +175,11 @@ class Db_Migrations { }); return array_filter(explode(";", implode("", $lines)), function ($line) { - return strlen(trim($line)) > 0; + return strlen(trim($line)) > 0 && !in_array(strtolower($line), ["begin", "commit"]); }); } else { - user_error(E_USER_ERROR, "[migrations] requested schema file ${filename} not found."); + user_error("Requested schema file ${filename} not found.", E_USER_ERROR); return []; } } diff --git a/classes/debug.php b/classes/debug.php index 3061c6893..a0dcac35b 100644 --- a/classes/debug.php +++ b/classes/debug.php @@ -1,5 +1,10 @@ get_max_version()); + + $migrations->migrate(); + + } else { + Debug::log("Database schema is already at latest version."); + } + + /*Debug::log("Checking for updates (" . Config::get(Config::DB_TYPE) . ")..."); $updater = new Db_Updater(Db::pdo(), Config::get(Config::DB_TYPE)); @@ -412,7 +435,7 @@ Debug::log("All done."); } else { Debug::log("Database schema is already at latest version."); - } + } */ }