1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: 995: 996: 997: 998: 999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142: 1143: 1144: 1145: 1146: 1147: 1148: 1149: 1150: 1151: 1152: 1153: 1154: 1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163: 1164: 1165: 1166: 1167: 1168: 1169: 1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: 1193: 1194: 1195: 1196: 1197: 1198: 1199: 1200: 1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208: 1209: 1210: 1211: 1212: 1213: 1214: 1215: 1216: 1217: 1218: 1219: 1220: 1221: 1222: 1223: 1224: 1225: 1226: 1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236: 1237: 1238: 1239: 1240: 1241: 1242: 1243: 1244: 1245: 1246: 1247: 1248: 1249: 1250: 1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263: 1264: 1265: 1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278: 1279: 1280: 1281: 1282: 1283: 1284: 1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292: 1293: 1294: 1295: 1296: 1297: 1298: 1299: 1300: 1301: 1302: 1303: 1304: 1305: 1306: 1307: 1308: 1309: 1310: 1311: 1312: 1313: 1314: 1315: 1316: 1317: 1318: 1319: 1320: 1321: 1322: 1323: 1324: 1325: 1326: 1327: 1328: 1329: 1330: 1331: 1332: 1333: 1334: 1335: 1336: 1337: 1338: 1339: 1340: 1341: 1342: 1343: 1344: 1345: 1346: 1347: 1348: 1349: 1350: 1351: 1352: 1353: 1354: 1355: 1356: 1357: 1358: 1359: 1360: 1361: 1362: 1363: 1364: 1365: 1366: 1367: 1368: 1369: 1370: 1371: 1372: 1373: 1374: 1375: 1376: 1377: 1378: 1379: 1380: 1381: 1382: 1383: 1384: 1385: 1386: 1387: 1388: 1389: 1390: 1391: 1392: 1393: 1394: 1395: 1396: 1397: 1398: 1399: 1400: 1401: 1402: 1403: 1404: 1405: 1406: 1407: 1408: 1409: 1410: 1411: 1412: 1413: 1414: 1415: 1416: 1417: 1418: 1419: 1420: 1421: 1422: 1423: 1424: 1425: 1426: 1427: 1428: 1429: 1430: 1431: 1432: 1433: 1434: 1435: 1436: 1437: 1438: 1439: 1440: 1441: 1442: 1443: 1444: 1445: 1446: 1447: 1448: 1449: 1450: 1451: 1452: 1453: 1454: 1455: 1456: 1457: 1458: 1459: 1460: 1461: 1462: 1463: 1464: 1465: 1466: 1467: 1468: 1469: 1470: 1471: 1472: 1473: 1474: 1475: 1476: 1477: 1478: 1479: 1480: 1481: 1482: 1483: 1484: 1485: 1486: 1487: 1488: 1489: 1490: 1491: 1492: 1493: 1494: 1495: 1496: 1497: 1498: 1499: 1500: 1501: 1502: 1503: 1504: 1505: 1506: 1507: 1508: 1509: 1510: 1511: 1512: 1513: 1514: 1515: 1516: 1517: 1518: 1519: 1520: 1521: 1522: 1523: 1524: 1525: 1526: 1527: 1528: 1529: 1530: 1531: 1532: 1533: 1534: 1535: 1536: 1537: 1538: 1539: 1540: 1541: 1542: 1543: 1544: 1545: 1546: 1547: 1548: 1549: 1550: 1551: 1552: 1553: 1554: 1555: 1556: 1557: 1558: 1559: 1560: 1561: 1562: 1563: 1564: 1565: 1566: 1567: 1568: 1569: 1570: 1571: 1572: 1573: 1574: 1575: 1576: 1577: 1578: 1579: 1580: 1581: 1582: 1583: 1584: 1585: 1586: 1587: 1588: 1589: 1590: 1591: 1592: 1593: 1594: 1595: 1596: 1597: 1598: 1599: 1600: 1601: 1602: 1603: 1604: 1605: 1606: 1607: 1608: 1609: 1610: 1611: 1612: 1613: 1614: 1615: 1616: 1617: 1618: 1619: 1620: 1621: 1622: 1623: 1624: 1625: 1626: 1627: 1628: 1629: 1630: 1631: 1632: 1633: 1634: 1635: 1636: 1637: 1638: 1639: 1640: 1641: 1642: 1643: 1644: 1645: 1646: 1647: 1648: 1649: 1650: 1651: 1652: 1653: 1654: 1655: 1656: 1657: 1658: 1659: 1660: 1661: 1662: 1663: 1664: 1665: 1666: 1667: 1668: 1669: 1670: 1671: 1672: 1673: 1674: 1675: 1676: 1677: 1678: 1679: 1680: 1681: 1682: 1683: 1684: 1685: 1686: 1687: 1688: 1689: 1690: 1691: 1692: 1693: 1694: 1695: 1696: 1697: 1698: 1699: 1700: 1701: 1702: 1703: 1704: 1705: 1706: 1707: 1708: 1709: 1710: 1711: 1712: 1713: 1714: 1715: 1716: 1717: 1718: 1719: 1720: 1721: 1722: 1723: 1724: 1725: 1726: 1727: 1728: 1729: 1730: 1731: 1732: 1733: 1734: 1735: 1736: 1737: 1738: 1739: 1740: 1741: 1742: 1743: 1744: 1745: 1746: 1747: 1748: 1749: 1750: 1751: 1752: 1753: 1754: 1755: 1756: 1757: 1758: 1759: 1760: 1761: 1762: 1763: 1764: 1765: 1766: 1767: 1768: 1769: 1770: 1771: 1772: 1773: 1774: 1775: 1776: 1777: 1778: 1779: 1780: 1781: 1782: 1783: 1784: 1785: 1786: 1787: 1788: 1789: 1790: 1791: 1792: 1793: 1794: 1795: 1796: 1797: 1798: 1799: 1800: 1801: 1802: 1803: 1804: 1805: 1806: 1807: 1808: 1809: 1810: 1811: 1812: 1813: 1814: 1815: 1816: 1817: 1818: 1819: 1820: 1821: 1822: 1823: 1824: 1825: 1826: 1827: 1828: 1829: 1830: 1831: 1832: 1833: 1834: 1835: 1836: 1837: 1838: 1839: 1840: 1841: 1842: 1843: 1844: 1845: 1846: 1847: 1848: 1849: 1850: 1851: 1852: 1853: 1854: 1855: 1856: 1857: 1858: 1859: 1860: 1861: 1862: 1863: 1864: 1865: 1866: 1867: 1868: 1869: 1870: 1871: 1872: 1873: 1874: 1875: 1876: 1877: 1878: 1879: 1880: 1881: 1882: 1883: 1884: 1885: 1886: 1887: 1888: 1889: 1890: 1891: 1892: 1893: 1894: 1895: 1896: 1897: 1898: 1899: 1900: 1901: 1902: 1903: 1904: 1905: 1906: 1907: 1908:
<?php
if ( ! class_exists( 'GFForms' ) ) {
die();
}
class GF_Upgrade {
private $versions = null;
private $manual_upgrade_versions = array();
private static $_instance = null;
public static function get_instance() {
if ( self::$_instance == null ) {
self::$_instance = new GF_Upgrade();
}
return self::$_instance;
}
public function maybe_display_wizard() {
$result = false;
if ( $this->requires_install_wizard() ) {
require_once( GFCommon::get_base_path() . '/includes/wizard/class-gf-installation-wizard.php' );
$wizard = new GF_Installation_Wizard;
$result = $wizard->display();
} elseif ( $this->requires_upgrade_wizard() ) {
require_once( GFCommon::get_base_path() . '/includes/wizard/class-gf-upgrade-wizard.php' );
$wizard = new GF_Upgrade_Wizard;
$result = $wizard->display();
}
return $result;
}
public function maybe_upgrade() {
$versions = $this->get_versions();
if ( $this->requires_install() ) {
$this->install();
if ( ! get_option( 'rg_gforms_key' ) ) {
update_option( 'gform_pending_installation', true );
}
} elseif ( $this->is_downgrading() ) {
GFForms::$background_upgrader->clear_queue( true );
$this->clear_previous_upgrade();
$this->update_db_version();
update_option( 'rg_form_version', GFForms::$version );
} elseif ( $this->requires_upgrade() && ! $this->requires_upgrade_wizard() ) {
$this->maybe_clear_previous_upgrade();
$this->upgrade();
}
}
public function is_downgrading() {
$versions = $this->get_versions();
$is_downgrading = version_compare( $versions['version'], $versions['current_version'], '<' );
if ( $is_downgrading ) {
$versions['current_version'] = $this->get_wp_option( 'rg_form_version' );
$is_downgrading = version_compare( $versions['version'], $versions['current_version'], '<' );
}
return $is_downgrading;
}
public function upgrade( $from_db_version = null, $force_upgrade = false ) {
if ( $force_upgrade ) {
$this->clear_previous_upgrade();
}
$versions = $this->get_versions();
if ( $from_db_version === null ) {
$from_db_version = empty( $versions['current_db_version'] ) ? $versions['current_version'] : $versions['current_db_version'];
if ( $from_db_version != $versions['previous_db_version'] ) {
update_option( 'gf_previous_db_version', $from_db_version );
$this->flush_versions();
}
}
if ( ! $this->set_upgrade_started( $from_db_version, $force_upgrade ) ) {
return false;
}
$this->pre_upgrade_schema( $from_db_version );
$this->upgrade_schema();
if ( $force_upgrade || ! ( defined( 'GFORM_AUTO_DB_MIGRATION_DISABLED' ) && GFORM_AUTO_DB_MIGRATION_DISABLED ) ) {
$this->post_upgrade_schema( $from_db_version, $force_upgrade );
}
return true;
}
public function install() {
$this->flush_versions();
update_option( 'gf_db_version', GFForms::$version );
update_option( 'rg_form_version', GFForms::$version );
$this->upgrade_schema();
update_option( 'gform_enable_background_updates', true );
$this->maybe_populate_keys();
$this->maybe_import_forms();
do_action( 'gform_post_install', GFForms::$version );
}
public function is_upgrading() {
global $wpdb;
$wpdb->flush();
$is_upgrading = $wpdb->get_var( "SELECT option_value FROM {$wpdb->options} WHERE option_name='gf_upgrade_lock'" );
return $is_upgrading ? true : false;
}
private function set_upgrade_started( $from_db_version = null, $force_upgrade = false ) {
global $wpdb;
$lock_params = $this->get_upgrade_lock();
if ( $lock_params && ! $force_upgrade ) {
GFCommon::log_debug( __METHOD__ . '(): Upgrade in process. Aborting' );
return false;
}
$insert = $lock_params === null;
$versions = $this->get_versions();
$lock_params = array(
'from_gf_version' => $versions['current_version'],
'to_version' => $versions['version'],
'from_db_version' => $from_db_version,
'force_upgrade' => $force_upgrade,
);
$lock_params_serialized = serialize( $lock_params );
if ( $insert ) {
$lock_params_serialized = serialize( $lock_params );
$sql = $wpdb->prepare( "INSERT INTO {$wpdb->options}(option_name, option_value) VALUES('gf_upgrade_lock', %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`)", $lock_params_serialized );
$wpdb->query( $sql );
GFCommon::log_debug( __METHOD__ . '(): Upgrade Locked.' );
} else {
$sql = $wpdb->prepare( "UPDATE {$wpdb->options} SET option_value=%s WHERE option_name='gf_upgrade_lock'", $lock_params_serialized );
$wpdb->query( $sql );
GFCommon::log_debug( __METHOD__ . '(): Upgrade Locked.' );
}
$system_status_link_open = sprintf( '<a href="%s">', admin_url( 'admin.php?page=gf_system_status' ) );
$system_status_link_close = '</a>';
$message = sprintf( esc_html__( 'Gravity Forms is currently upgrading the database to version %1$s. For sites with a large number of entries this may take a long time. Check the %2$sSystem Status%3$s page for further details.', 'gravityforms' ), GFForms::$version, $system_status_link_open, $system_status_link_close );
$key = sanitize_key( 'gravityforms_upgrading_' . $versions['version'] );
GFCommon::add_dismissible_message( $message, $key, 'warning', 'gform_full_access', true );
return true;
}
public function set_upgrade_ended() {
$lock_params = $this->get_upgrade_lock();
$this->clear_upgrade_lock();
$version = GFForms::$version;
$force_upgrade = (bool) $lock_params['force_upgrade'];
$from_db_version = $lock_params['from_db_version'];
do_action( 'gform_post_upgrade', $version, $from_db_version, $force_upgrade );
delete_option( 'gform_upgrade_status' );
update_option( 'rg_form_version', $version );
$this->flush_versions();
$key = sanitize_key( 'gravityforms_upgrading_' . GFForms::$version );
GFCommon::remove_dismissible_message( $key );
GFCache::flush( true );
$this->add_post_upgrade_admin_notices();
GFCommon::log_debug( __METHOD__ . '(): Upgrade Completed.' );
}
protected function pre_upgrade_schema( $from_db_version ) {
}
public function upgrade_schema() {
$schema = $this->get_db_schema();
foreach ( $schema as $table_name => $sql ) {
$this->dbDelta( $sql );
}
}
public function get_db_schema( $table_name = null ) {
global $wpdb;
$max_index_length = 191;
$tables = array();
$charset_collate = $wpdb->get_charset_collate();
$form_table_name = $wpdb->prefix . 'gf_form';
$tables[ $form_table_name ] =
'CREATE TABLE ' . $form_table_name . " (
id mediumint(8) unsigned not null auto_increment,
title varchar(150) not null,
date_created datetime not null,
date_updated datetime,
is_active tinyint(1) not null default 1,
is_trash tinyint(1) not null default 0,
PRIMARY KEY (id)
) $charset_collate;";
$meta_table_name = $wpdb->prefix . 'gf_form_meta';
$tables[ $meta_table_name ] = 'CREATE TABLE ' . $meta_table_name . " (
form_id mediumint(8) unsigned not null,
display_meta longtext,
entries_grid_meta longtext,
confirmations longtext,
notifications longtext,
PRIMARY KEY (form_id)
) $charset_collate;";
$form_view_table_name = $wpdb->prefix . 'gf_form_view';
$tables[ $form_view_table_name ] =
'CREATE TABLE ' . $form_view_table_name . " (
id bigint(20) unsigned not null auto_increment,
form_id mediumint(8) unsigned not null,
date_created datetime not null,
ip char(15),
count mediumint(8) unsigned not null default 1,
PRIMARY KEY (id),
KEY date_created (date_created),
KEY form_id (form_id)
) $charset_collate;";
$entry_table_name = GFFormsModel::get_entry_table_name();
$tables[ $entry_table_name ] =
'CREATE TABLE ' . $entry_table_name . " (
id int(10) unsigned not null auto_increment,
form_id mediumint(8) unsigned not null,
post_id bigint(20) unsigned,
date_created datetime not null,
date_updated datetime,
is_starred tinyint(1) not null default 0,
is_read tinyint(1) not null default 0,
ip varchar(39) not null,
source_url varchar(200) not null default '',
user_agent varchar(250) not null default '',
currency varchar(5),
payment_status varchar(15),
payment_date datetime,
payment_amount decimal(19,2),
payment_method varchar(30),
transaction_id varchar(50),
is_fulfilled tinyint(1),
created_by bigint(20) unsigned,
transaction_type tinyint(1),
status varchar(20) not null default 'active',
PRIMARY KEY (id),
KEY form_id (form_id),
KEY form_id_status (form_id,status)
) $charset_collate;";
$entry_notes_table_name = GFFormsModel::get_entry_notes_table_name();
$tables[ $entry_notes_table_name ] =
'CREATE TABLE ' . $entry_notes_table_name . " (
id int(10) unsigned not null auto_increment,
entry_id int(10) unsigned not null,
user_name varchar(250),
user_id bigint(20),
date_created datetime not null,
value longtext,
note_type varchar(50),
sub_type varchar(50),
PRIMARY KEY (id),
KEY entry_id (entry_id),
KEY entry_user_key (entry_id,user_id)
) $charset_collate;";
$entry_meta_table_name = GFFormsModel::get_entry_meta_table_name();
$tables[ $entry_meta_table_name ] =
'CREATE TABLE ' . $entry_meta_table_name . " (
id bigint(20) unsigned not null auto_increment,
form_id mediumint(8) unsigned not null default 0,
entry_id bigint(20) unsigned not null,
meta_key varchar(255),
meta_value longtext,
PRIMARY KEY (id),
KEY meta_key (meta_key($max_index_length)),
KEY entry_id (entry_id),
KEY meta_value (meta_value($max_index_length))
) $charset_collate;";
$draft_submissions_table_name = GFFormsModel::get_draft_submissions_table_name();
$tables[ $draft_submissions_table_name ] =
'CREATE TABLE ' . $draft_submissions_table_name . " (
uuid char(32) not null,
email varchar(255),
form_id mediumint(8) unsigned not null,
date_created datetime not null,
ip varchar(39) not null,
source_url longtext not null,
submission longtext not null,
PRIMARY KEY (uuid),
KEY form_id (form_id)
) $charset_collate;";
if ( $table_name ) {
return isset( $tables[ $table_name ] ) ? $tables[ $table_name ] : false;
} else {
return $tables;
}
}
public function check_table_schema( $table_name ) {
$schema = $this->get_db_schema( $table_name );
$to_update = $this->dbDelta( $schema, false );
if ( empty( $to_update ) ) {
return true;
} else {
return false;
}
}
public function dbDelta( $sql, $execute = true ) {
global $wpdb;
require_once( ABSPATH . '/wp-admin/includes/upgrade.php' );
add_filter( 'dbdelta_create_queries', array( $this, 'dbdelta_fix_case' ) );
$result = dbDelta( $sql, $execute );
remove_filter( 'dbdelta_create_queries', array( $this, 'dbdelta_fix_case' ) );
return $result;
}
protected function post_upgrade_schema( $from_db_version, $force_upgrade ) {
$versions = $this->get_versions();
$current_db_version = empty( $from_db_version ) ? $versions['current_version'] : $from_db_version;
$this->update_upgrade_status( esc_html__( 'Queued for upgrade.', 'gravityforms' ) );
if ( version_compare( $current_db_version, '2.0.4.7', '<' ) ) {
$this->post_upgrade_schema_2047();
}
if ( version_compare( $current_db_version, '2.3-dev-1', '<' ) ) {
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_block_submissions' ) );
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_230_migrate_forms' ) );
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_230_migrate_leads' ) );
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_230_migrate_incomplete_submissions' ) );
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_230_migrate_lead_notes' ) );
GFForms::$background_upgrader->push_to_queue( array( $this, 'gf_upgrade_release_submissions_block' ) );
}
if ( GFForms::$background_upgrader->get_data() ) {
GFForms::$background_upgrader->push_to_queue( array( $this, 'post_background_upgrade' ) );
GFForms::$background_upgrader->save();
if ( $force_upgrade ) {
GFForms::$background_upgrader->handle_cron_healthcheck();
} else {
GFForms::$background_upgrader->dispatch();
}
} else {
GFCommon::log_debug( __METHOD__ . '(): Background upgrade not necessary. Setting new version.' );
$this->update_db_version();
$this->set_upgrade_ended();
}
}
public function post_background_upgrade() {
$this->update_db_version();
GFCommon::log_debug( __METHOD__ . '(): Background upgrade complete' );
$this->set_upgrade_ended();
return false;
}
public function update_upgrade_status( $new_status ) {
update_option( 'gform_upgrade_status', $new_status );
}
public function gf_upgrade_block_submissions() {
$this->set_submissions_block();
return false;
}
public function gf_upgrade_release_submissions_block() {
$this->clear_submissions_block();
return false;
}
public function gf_upgrade_230_migrate_forms() {
global $wpdb;
$this->update_upgrade_status( esc_html__( 'Migrating forms.', 'gravityforms' ) );
$legacy_forms_table = $wpdb->prefix . 'rg_form';
$new_forms_table = $wpdb->prefix . 'gf_form';
$sql = "
INSERT INTO {$new_forms_table}
(id, title, date_created, date_updated, is_active, is_trash)
SELECT
id, title, date_created, null, is_active, is_trash
FROM
{$legacy_forms_table} lf
WHERE lf.id NOT IN
( SELECT id
FROM {$new_forms_table}
)";
$wpdb->query( $sql );
$legacy_form_meta_table = $wpdb->prefix . 'rg_form_meta';
$new_form_meta_table = $wpdb->prefix . 'gf_form_meta';
$sql = "
INSERT INTO {$new_form_meta_table}
(form_id, display_meta, entries_grid_meta, confirmations, notifications)
SELECT
form_id, display_meta, entries_grid_meta, confirmations, notifications
FROM
{$legacy_form_meta_table} lfm
WHERE lfm.form_id NOT IN
( SELECT form_id
FROM {$new_form_meta_table}
)";
$wpdb->query( $sql );
$legacy_form_view_table = $wpdb->prefix . 'rg_form_view';
$new_form_view_table = $wpdb->prefix . 'gf_form_view';
$sql = "
INSERT INTO {$new_form_view_table}
(id, form_id, date_created, ip, count)
SELECT
id, form_id, date_created, ip, count
FROM
{$legacy_form_view_table} lfv
WHERE lfv.id NOT IN
( SELECT id
FROM {$new_form_view_table}
)";
$wpdb->query( $sql );
$this->update_upgrade_status( esc_html__( 'Forms migrated.', 'gravityforms' ) );
return false;
}
public function gf_upgrade_230_migrate_leads() {
global $wpdb;
if ( defined( 'GFORM_DB_MIGRATION_BATCH_SIZE' ) ) {
$limit = GFORM_DB_MIGRATION_BATCH_SIZE;
} else {
$limit = 20000;
}
$lead_table = GFFormsModel::get_lead_table_name();
$entry_table = GFFormsModel::get_entry_table_name();
$time_start = microtime( true );
$lead_ids_sql = "SELECT l2.id
FROM {$lead_table} l2
WHERE l2.id NOT IN ( SELECT e.id FROM {$entry_table} e )
LIMIT {$limit}";
do {
$lead_ids = $wpdb->get_col( $lead_ids_sql );
if ( $wpdb->last_error ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Headers: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
if ( ! empty( $lead_ids ) ) {
$lead_ids = array_map( 'absint', $lead_ids );
$count_lead_ids = count( $lead_ids );
if ( ! empty( $count_lead_ids ) ) {
$lead_ids_in = join( ',', $lead_ids );
$sql = "
INSERT INTO $entry_table
(id, form_id, post_id, date_created, date_updated, is_starred, is_read, ip, source_url, user_agent, currency, payment_status, payment_date, payment_amount, payment_method, transaction_id, is_fulfilled, created_by, transaction_type, status)
SELECT
id, form_id, post_id, date_created, null, is_starred, is_read, ip, source_url, user_agent, currency, payment_status, payment_date, payment_amount, payment_method, transaction_id, is_fulfilled, created_by, transaction_type, status
FROM
$lead_table l
WHERE l.id IN ( {$lead_ids_in} )";
$wpdb->query( $sql );
if ( $wpdb->last_error ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Headers: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
$current_time = microtime( true );
$execution_time = ( $current_time - $time_start );
if ( $execution_time > 15 ) {
$sql_remaining = "SELECT COUNT(l2.id)
FROM {$lead_table} l2
WHERE l2.id NOT IN ( SELECT e.id FROM {$entry_table} e )";
$remaining = $wpdb->get_var( $sql_remaining );
if ( $remaining > 0 ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Migrating leads. Step 1/3 Migrating entry headers. %d rows remaining.', 'gravityforms' ), $remaining ) );
return true;
}
}
}
}
} while ( ! empty( $lead_ids ) );
$lead_details_table = GFFormsModel::get_lead_details_table_name();
$entry_meta_table = GFFormsModel::get_entry_meta_table_name();
$lead_detail_ids_sql = "
SELECT ld.id
FROM {$lead_details_table} ld
WHERE ld.id NOT IN ( SELECT em.id FROM {$entry_meta_table} em )
LIMIT {$limit}";
do {
$lead_detail_ids = $wpdb->get_col( $lead_detail_ids_sql );
if ( $wpdb->last_error ) {
error_log('error: ' . $wpdb->last_error );
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Details: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
if ( ! empty( $lead_detail_ids ) ) {
$lead_detail_ids = array_map( 'absint', $lead_detail_ids );
$lead_detail_ids_in = join( ',', $lead_detail_ids );
$sql = "
INSERT INTO {$entry_meta_table}
(id, entry_id, form_id, meta_key, meta_value)
SELECT
id, lead_id, form_id, CAST(field_number AS CHAR), value
FROM
{$lead_details_table} ld
WHERE ld.id IN ( {$lead_detail_ids_in} )";
$wpdb->query( $sql );
if ( $wpdb->last_error ) {
error_log('error: ' . $wpdb->last_error );
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Details: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
$current_time = microtime( true );
$execution_time = ( $current_time - $time_start );
if ( $execution_time > 15 ) {
$sql_remaining = "
SELECT COUNT(ld.id)
FROM {$lead_details_table} ld
WHERE ld.id NOT IN ( SELECT em.id FROM {$entry_meta_table} em )";
$remaining = $wpdb->get_var( $sql_remaining );
if ( $remaining > 0 ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Migrating leads. Step 2/3 Migrating entry details. %d rows remaining.', 'gravityforms' ), $remaining ) );
return true;
}
}
}
} while ( ! empty( $lead_detail_ids ) );
$lead_meta_table = GFFormsModel::get_lead_meta_table_name();
$entry_meta_table = GFFormsModel::get_entry_meta_table_name();
$charset_db = empty( $wpdb->charset ) ? 'utf8mb4' : $wpdb->charset;
$collate = ! empty( $wpdb->collate ) ? " COLLATE {$wpdb->collate}" : '';
$lead_meta_ids_sql = "
SELECT
id
FROM
{$lead_meta_table} lm
WHERE NOT EXISTS
(SELECT * FROM {$entry_meta_table} em WHERE em.entry_id = lm.lead_id AND CONVERT(em.meta_key USING {$charset_db}) = CONVERT(lm.meta_key USING {$charset_db}) {$collate})
LIMIT {$limit}";
do {
$lead_meta_ids = $wpdb->get_col( $lead_meta_ids_sql );
if ( $wpdb->last_error ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Meta: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
if ( ! empty( $lead_meta_ids ) ) {
$lead_meta_ids = array_map( 'absint', $lead_meta_ids );
$lead_meta_ids_in = join( ',', $lead_meta_ids );
$sql = "
INSERT INTO {$entry_meta_table}
(entry_id, form_id, meta_key, meta_value)
SELECT
lead_id, form_id, meta_key, meta_value
FROM
{$lead_meta_table} lm
WHERE lm.id IN ( {$lead_meta_ids_in} )";
$wpdb->query( $sql );
if ( $wpdb->last_error ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating Entry Meta: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
$current_time = microtime( true );
$execution_time = ( $current_time - $time_start );
if ( $execution_time > 15 ) {
$sql_remaining = "
SELECT COUNT(id)
FROM
{$lead_meta_table} lm
WHERE NOT EXISTS
(SELECT * FROM {$entry_meta_table} em WHERE em.entry_id = lm.lead_id AND CONVERT(em.meta_key USING {$charset_db}) = CONVERT(lm.meta_key USING {$charset_db}) {$collate})";
$remaining = $wpdb->get_var( $sql_remaining );
if ( $remaining > 0 ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Migrating leads. Step 3/3 Migrating entry meta. %d rows remaining.', 'gravityforms' ), $remaining ) );
return true;
}
}
}
} while ( ! empty( $lead_meta_ids ) );
$this->update_upgrade_status( esc_html__( 'Entry details migrated.', 'gravityforms' ) );
return false;
}
public function gf_upgrade_230_migrate_incomplete_submissions() {
global $wpdb;
$this->update_upgrade_status( esc_html__( 'Migrating incomplete submissions.', 'gravityforms' ) );
$incomplete_submissions_table = GFFormsModel::get_incomplete_submissions_table_name();
if ( ! GFCommon::table_exists( $incomplete_submissions_table ) ) {
return false;
}
$draft_submissions_table = GFFormsModel::get_draft_submissions_table_name();
$charset_db = empty( $wpdb->charset ) ? 'utf8mb4' : $wpdb->charset;
$collate = ! empty( $wpdb->collate ) ? " COLLATE {$wpdb->collate}" : '';
$sql = "
INSERT INTO {$draft_submissions_table}
SELECT *
FROM
{$incomplete_submissions_table} insub
WHERE CONVERT(insub.uuid USING {$charset_db}) {$collate} NOT IN
( SELECT uuid FROM {$draft_submissions_table} )";
$wpdb->query( $sql );
if ( $wpdb->last_error ) {
$this->update_upgrade_status( sprintf( esc_html__( 'Error Migrating incomplete submissions: %s', 'gravityforms' ), $wpdb->last_error ) );
exit;
}
return false;
}
public function gf_upgrade_230_migrate_lead_notes() {
global $wpdb;
$this->update_upgrade_status( esc_html__( 'Migrating entry notes.', 'gravityforms' ) );
$lead_notes_details_table = GFFormsModel::get_lead_notes_table_name();
$entry_notes_table = GFFormsModel::get_entry_notes_table_name();
$sql = "
INSERT INTO {$entry_notes_table}
(id, entry_id, user_name, user_id, date_created, value, note_type )
SELECT
id, lead_id, user_name, user_id, date_created, value, note_type
FROM
{$lead_notes_details_table} ln
WHERE ln.id NOT IN
( SELECT id
FROM {$entry_notes_table}
)";
$wpdb->query( $sql );
return false;
}
protected function maybe_populate_keys() {
global $gf_license_key;
$license_key = defined( 'GF_LICENSE_KEY' ) && empty( $gf_license_key ) ? GF_LICENSE_KEY : $gf_license_key;
if ( ! empty( $license_key ) ) {
RGFormsModel::save_key( $license_key );
GFCommon::cache_remote_message();
GFCommon::get_version_info( false );
}
global $gf_recaptcha_public_key, $gf_recaptcha_private_key;
$private_key = defined( 'GF_RECAPTCHA_PRIVATE_KEY' ) && empty( $gf_recaptcha_private_key ) ? GF_RECAPTCHA_PRIVATE_KEY : $gf_recaptcha_private_key;
if ( ! empty( $private_key ) ) {
update_option( 'rg_gforms_captcha_private_key', $private_key );
}
$public_key = defined( 'GF_RECAPTCHA_PUBLIC_KEY' ) && empty( $gf_recaptcha_public_key ) ? GF_RECAPTCHA_PUBLIC_KEY : $gf_recaptcha_public_key;
if ( ! empty( $public_key ) ) {
update_option( 'rg_gforms_captcha_public_key', $public_key );
}
}
protected function maybe_import_forms() {
if ( defined( 'GF_IMPORT_FILE' ) && ! get_option( 'gf_imported_file' ) ) {
require_once( GFCommon::get_base_path() . '/export.php' );
GFExport::import_file( GF_IMPORT_FILE );
update_option( 'gf_imported_file', true );
}
}
public function maybe_import_theme_forms() {
if ( defined( 'GF_THEME_IMPORT_FILE' ) ) {
$themes = get_option( 'gf_imported_theme_file' );
if ( ! is_array( $themes ) ) {
$themes = array();
}
$theme = get_template();
if ( ! isset( $themes[ $theme ] ) ) {
require_once( GFCommon::get_base_path() . '/export.php' );
GFExport::import_file( get_stylesheet_directory() . '/' . GF_THEME_IMPORT_FILE );
$themes[ $theme ] = true;
update_option( 'gf_imported_theme_file', $themes );
}
}
}
public function get_wp_option( $option_name ) {
global $wpdb;
return $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM {$wpdb->prefix}options WHERE option_name=%s", $option_name ) );
}
protected function post_upgrade_schema_2047() {
global $wpdb;
$versions = $this->get_versions();
$form_table_name = RGFormsModel::get_form_table_name();
$meta_table_name = RGFormsModel::get_meta_table_name();
$lead_meta_table_name = RGFormsModel::get_lead_meta_table_name();
$wpdb->query( 'DROP TABLE IF EXISTS A' . $form_table_name );
$this->drop_index( $meta_table_name, 'form_id' );
if ( version_compare( $versions['current_version'], '1.8.0.3', '<' ) ) {
delete_option( 'gform_version_info' );
}
if ( version_compare( $versions['current_version'], '1.8.3.1', '<' ) ) {
$this->fix_leading_and_trailing_spaces();
}
$long_table_name = GFFormsModel::get_lead_details_long_table_name();
$result = $wpdb->query( "SHOW TABLES LIKE '{$long_table_name}'" );
if ( $wpdb->num_rows !== 1 ) {
return;
}
if ( version_compare( $versions['current_version'], '1.9.8.12', '<' ) ) {
$this->drop_index( $lead_meta_table_name, 'meta_key' );
$this->drop_index( $lead_meta_table_name, 'form_id_meta_key' );
}
$this->fix_lead_meta_form_id_values();
$this->fix_checkbox_value();
$this->maybe_upgrade_lead_detail_table();
}
public function dbdelta_fix_case( $cqueries ) {
$queries = array();
foreach ( $cqueries as $table => $qry ) {
$table_name = $table;
if ( preg_match( '|CREATE TABLE ([^ ]*)|', $qry, $matches ) ) {
$query_table_name = trim( $matches[1], '`' );
if ( strtolower( $query_table_name ) == $table ) {
$table_name = $query_table_name;
}
}
$queries[ $table_name ] = $qry;
}
return $queries;
}
private function fix_leading_and_trailing_spaces() {
global $wpdb;
$meta_table_name = GFFormsModel::get_meta_table_name();
$lead_details_table = GFFormsModel::get_lead_details_table_name();
$result = $wpdb->query( "UPDATE {$lead_details_table} SET value = TRIM(value)" );
$results = $wpdb->get_results( "SELECT form_id, display_meta, confirmations, notifications FROM {$meta_table_name}", ARRAY_A );
foreach ( $results as &$result ) {
$form_id = $result['form_id'];
$form = GFFormsModel::unserialize( $result['display_meta'] );
$form_updated = false;
$form = GFFormsModel::trim_form_meta_values( $form, $form_updated );
if ( $form_updated ) {
GFFormsModel::update_form_meta( $form_id, $form );
}
$confirmations = GFFormsModel::unserialize( $result['confirmations'] );
$confirmations_updated = false;
$confirmations = GFFormsModel::trim_conditional_logic_values( $confirmations, $form, $confirmations_updated );
if ( $confirmations_updated ) {
GFFormsModel::update_form_meta( $form_id, $confirmations, 'confirmations' );
}
$notifications = GFFormsModel::unserialize( $result['notifications'] );
$notifications_updated = false;
$notifications = GFFormsModel::trim_conditional_logic_values( $notifications, $form, $notifications_updated );
if ( $notifications_updated ) {
GFFormsModel::update_form_meta( $form_id, $notifications, 'notifications' );
}
}
return $results;
}
private function fix_checkbox_value() {
global $wpdb;
$table_name = RGFormsModel::get_lead_details_table_name();
$sql = "select * from {$table_name} where value= '!'";
$results = $wpdb->get_results( $sql );
foreach ( $results as $result ) {
$form = RGFormsModel::get_form_meta( $result->form_id );
$field = RGFormsModel::get_field( $form, $result->field_number );
if ( $field->type == 'checkbox' ) {
$input = GFCommon::get_input( $field, $result->field_number );
$wpdb->update( $table_name, array( 'value' => $input['label'] ), array( 'id' => $result->id ) );
}
}
}
private function fix_lead_meta_form_id_values() {
global $wpdb;
$lead_meta_table_name = RGFormsModel::get_lead_meta_table_name();
$lead_table_name = RGFormsModel::get_lead_table_name();
$sql = "UPDATE $lead_meta_table_name lm,$lead_table_name l SET lm.form_id = l.form_id
WHERE lm.form_id=0 AND lm.lead_id = l.id;
";
$wpdb->get_results( $sql );
}
public function drop_index( $table, $index ) {
global $wpdb;
if ( ! GFFormsModel::is_valid_table( $table ) || ! GFFormsModel::is_valid_index( $index ) ) {
return;
}
$has_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) );
if ( $has_table ) {
$has_index = $wpdb->get_var( $wpdb->prepare( "SHOW INDEX FROM {$table} WHERE Key_name=%s", $index ) );
if ( $has_index ) {
$wpdb->query( "DROP INDEX {$index} ON {$table}" );
}
}
}
private function maybe_upgrade_lead_detail_table() {
global $wpdb;
$versions = $this->get_versions();
$current_version = $versions['current_version'];
GFCommon::log_debug( __METHOD__ . '(): Starting' );
if ( ! $this->can_upgrade_longtext() ) {
GFCommon::log_debug( __METHOD__ . '(): Bailing' );
return;
}
$result = $wpdb->query( "
UPDATE {$wpdb->prefix}rg_lead_detail d
INNER JOIN {$wpdb->prefix}rg_lead_detail_long l ON d.id = l.lead_detail_id
SET d.value = l.value"
);
GFCommon::remove_dismissible_message( 'gform_long_table_upgrade' );
GFCommon::log_debug( __METHOD__ . '(): result: ' . print_r( $result, true ) );
}
public function validate_upgrade( $do_upgrade, $hook_extra ) {
if ( rgar( $hook_extra, 'plugin' ) == 'gravityforms/gravityforms.php' && ! $this->has_database_permission( $error ) ) {
return new WP_Error( 'no_db_permission', $error );
}
return true;
}
public function has_database_permission( &$error ) {
global $wpdb;
$wpdb->hide_errors();
$has_permission = true;
$sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}rg_test ( col1 int PRIMARY KEY )";
$wpdb->query( $sql );
$error = 'Current database user does not have necessary permissions to create tables. Gravity Forms requires that the database user has CREATE and ALTER permissions. If you need assistance in changing database user permissions, contact your hosting provider.';
if ( ! empty( $wpdb->last_error ) ) {
$has_permission = false;
}
if ( $has_permission ) {
$sql = "ALTER TABLE {$wpdb->prefix}rg_test ADD COLUMN a" . uniqid() . ' int';
$wpdb->query( $sql );
$error = 'Current database user does not have necessary permissions to modify (ALTER) tables. Gravity Forms requires that the database user has CREATE and ALTER permissions. If you need assistance in changing database user permissions, contact your hosting provider.';
if ( ! empty( $wpdb->last_error ) ) {
$has_permission = false;
}
$sql = "DROP TABLE {$wpdb->prefix}rg_test";
$wpdb->query( $sql );
}
$wpdb->show_errors();
return $has_permission;
}
private function can_upgrade_longtext() {
global $wpdb;
$versions = $this->get_versions();
$current_version = $versions['current_version'];
if ( empty( $current_version ) ) {
return false;
}
$is_longtext_ready = (bool) get_option( 'gform_longtext_ready' );
if ( $is_longtext_ready ) {
return false;
}
$upgraded = (bool) get_option( 'gform_longtext_upgraded' );
if ( $upgraded ) {
return false;
}
$lead_detail_table_name = GFFormsModel::get_lead_details_table_name();
$is_longtext = $this->check_column( $lead_detail_table_name, 'value', 'longtext' );
$first_entry_value = $wpdb->get_results( "SELECT value FROM $lead_detail_table_name LIMIT 1" );
$col_type = $wpdb->get_col_info( 'type', 0 );
if ( ! $is_longtext ) {
if ( $col_type == '252' || $col_type == 'blob' ) {
$is_longtext = true;
} else {
$lead_detail_table = GFFormsModel::get_lead_details_table_name();
$result = $wpdb->query( "ALTER TABLE {$lead_detail_table} MODIFY `value` LONGTEXT;" );
if ( empty( $wpdb->last_error ) ) {
$is_longtext = true;
} else {
$wpdb->show_errors();
}
}
}
if ( ! $is_longtext ) {
GFCommon::log_debug( __METHOD__ . '(): lead detail value column issue' );
GFCommon::add_dismissible_message( esc_html__( 'There appears to be an issue with one of the Gravity Forms database tables. Please get in touch with support.', 'gravityforms' ), 'gform_long_table_upgrade', 'error', 'gform_full_access', true );
return false;
}
if ( empty( $first_entry_value ) ) {
GFCommon::remove_dismissible_message( 'gform_long_table_upgrade' );
return false;
}
$can_upgrade = false;
if ( version_compare( $current_version, '2.0-beta-3.2', '<' )
|| ( version_compare( $current_version, '2.0.2.6', '<' ) && ! method_exists( $wpdb, 'get_col_length' ) )
|| ( version_compare( $current_version, '2.0.2.6', '<' )
&& method_exists( $wpdb, 'get_col_length' )
&& $wpdb->get_col_length( $wpdb->prefix . 'rg_lead_detail', 'value' ) === false )
|| ( version_compare( $current_version, '2.0.4.6', '<' )
&& $col_type == 'blob' )
) {
$results = $wpdb->get_results( "
SELECT id
FROM {$wpdb->prefix}rg_lead_detail
GROUP BY id
HAVING count(*) > 1;" );
if ( count( $results ) == 0 ) {
$can_upgrade = true;
} else {
GFCommon::log_debug( __METHOD__ . '(): lead detail IDs issue' );
GFCommon::add_dismissible_message( esc_html__( 'There appears to be an issue with the data in the Gravity Forms database tables. Please get in touch with support.', 'gravityforms' ), 'gform_long_table_upgrade', 'error', 'gform_full_access', true );
}
}
GFCommon::log_debug( __METHOD__ . '(): can_upgrade: ' . $can_upgrade );
return $can_upgrade;
}
private function check_column( $table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null ) {
global $wpdb;
$diffs = 0;
$results = $wpdb->get_results( "DESC $table_name" );
foreach ( $results as $row ) {
if ( $row->Field == $col_name ) {
if ( ( $col_type != null ) && ( $row->Type != $col_type ) ) {
++ $diffs;
}
if ( ( $is_null != null ) && ( $row->Null != $is_null ) ) {
++ $diffs;
}
if ( ( $key != null ) && ( $row->Key != $key ) ) {
++ $diffs;
}
if ( ( $default != null ) && ( $row->Default != $default ) ) {
++ $diffs;
}
if ( ( $extra != null ) && ( $row->Extra != $extra ) ) {
++ $diffs;
}
if ( $diffs > 0 ) {
return false;
}
return true;
}
}
return false;
}
public function get_versions() {
if ( ! empty( $this->versions ) ) {
return $this->versions;
}
$previous_db_version = get_option( 'gf_previous_db_version' );
$this->versions = array(
'version' => GFForms::$version,
'current_version' => get_option( 'rg_form_version' ),
'current_db_version' => GFFormsModel::get_database_version(),
'previous_db_version' => empty( $previous_db_version ) ? '0' : $previous_db_version,
);
return $this->versions;
}
public function flush_versions() {
$this->versions = null;
wp_cache_flush();
}
public function requires_install() {
$versions = $this->get_versions();
$requires_install = rgempty( 'current_version', $versions );
return $requires_install;
}
public function requires_upgrade() {
if ( $this->requires_install() ) {
return false;
}
$versions = $this->get_versions();
$upgrade_required = version_compare( $versions['version'], $versions['current_version'], '>' );
if ( $upgrade_required ) {
$versions['current_version'] = $this->get_wp_option( 'rg_form_version' );
$upgrade_required = version_compare( $versions['version'], $versions['current_version'], '>' );
}
return $upgrade_required;
}
public function requires_install_wizard() {
if ( defined( 'GF_LICENSE_KEY' ) && is_multisite() && ! is_main_site() ) {
return false;
}
$pending_installation = get_option( 'gform_pending_installation' ) || isset( $_GET['gform_installation_wizard'] );
$install_wizard_required = $this->requires_install() || $pending_installation;
return $install_wizard_required;
}
public function requires_upgrade_wizard() {
if ( ! $this->requires_upgrade() ) {
return false;
}
$versions = $this->get_versions();
foreach ( $this->manual_upgrade_versions as $manually_upgraded_version ) {
if ( version_compare( $versions['current_db_version'], $manually_upgraded_version, '<' ) ) {
return true;
}
}
return false;
}
public function update_db_version( $version = null ) {
delete_option( 'gf_db_version' );
add_option( 'gf_db_version', is_null( $version ) ? GFForms::$version : $version );
}
public function maybe_clear_previous_upgrade() {
$lock_params = $this->get_upgrade_lock();
if ( $lock_params ) {
$to_version = rgar( $lock_params, 'to_version' );
$versions = $this->get_versions();
if ( $to_version != $versions['version'] ) {
$this->clear_previous_upgrade();
}
}
}
public function clear_previous_upgrade() {
GFForms::$background_upgrader->clear_queue();
update_option( 'gform_upgrade_status', false );
$lock_params = $this->get_upgrade_lock();
if ( $lock_params ) {
$to_version = rgar( $lock_params, 'to_gf_version' );
$key = sanitize_key( 'gravityforms_upgrading_' . $to_version );
GFCommon::remove_dismissible_message( $key );
}
$this->clear_upgrade_lock();
$this->clear_submissions_block();
}
public function clear_upgrade_lock() {
$result = update_option( 'gf_upgrade_lock', false );
return $result;
}
public function get_upgrade_lock() {
global $wpdb;
$lock_params_serialized = $wpdb->get_var( "SELECT option_value FROM {$wpdb->options} WHERE option_name='gf_upgrade_lock'" );
$lock_params = maybe_unserialize( $lock_params_serialized );
return $lock_params;
}
public function set_submissions_block() {
$result = update_option( 'gf_submissions_block', time() );
return $result;
}
public function clear_submissions_block() {
$result = update_option( 'gf_submissions_block', false );
return $result;
}
public function get_submissions_block() {
global $wpdb;
$timestamp = $wpdb->get_var( "SELECT option_value FROM {$wpdb->options} WHERE option_name='gf_submissions_block'" );
return $timestamp;
}
public function add_post_upgrade_admin_notices() {
$previous_db_version = get_option( 'gf_previous_db_version' );
$key = sanitize_key( 'gravityforms_outdated_addons_2.3' );
if ( version_compare( $previous_db_version, '2.3-beta-1', '>' ) ) {
GFCommon::remove_dismissible_message( $key );
return;
}
$add_ons = $this->get_min_addon_requirements();
$outdated = array();
foreach ( $add_ons as $plugin_slug => $add_on ) {
$plugin_path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_slug;
if ( ! file_exists( $plugin_path ) ) {
continue;
}
$plugin_data = get_plugin_data( $plugin_path, false, false );
$current_version = $plugin_data['Version'];
$add_on = $add_ons[ $plugin_slug ];
$min_version = $add_on['min_version'];
if ( version_compare( $current_version, $min_version, '<' ) ) {
$name = $add_on['name'];
$outdated[] = $name;
}
}
if ( empty( $outdated ) ) {
return;
}
$number_outdated = count( $outdated );
if ( $number_outdated == 1 ) {
$message = sprintf( esc_html__( 'The %s is not compatible with this version of Gravity Forms. See the plugins list for further details.', 'gravityforms' ), $outdated[0] );
} else {
$message = sprintf( esc_html__( 'There are %d add-ons installed that are not compatible with this version of Gravity Forms. See the plugins list for further details.', 'gravityforms' ), $number_outdated );
}
GFCommon::add_dismissible_message( $message, $key, 'error', 'gform_full_access', true, 'site-wide' );
}
public function get_min_addon_requirements() {
return array(
'gravityformspaypal/paypal.php' => array(
'name' => 'Gravity Forms PayPal Add-On',
'min_version' => '2.9',
),
'gravityformsauthorizenet/authorizenet.php' => array(
'name' => 'Gravity Forms Authorize.Net Add-On',
'min_version' => '2.4',
),
'gravityformspartialentries/partialentries.php' => array(
'name' => 'Gravity Forms Partial Entries Add-On',
'min_version' => '1.1',
),
'gravityformspaypalpaymentspro/paypalpaymentspro.php' => array(
'name' => 'Gravity Forms PayPal Payments Pro Add-On',
'min_version' => '2.3',
),
'gravityformssignature/signature.php' => array(
'name' => 'Gravity Forms Signature Add-On',
'min_version' => '3.4',
),
'gravityformsuserregistration/userregistration.php' => array(
'name' => 'Gravity Forms User Registration Add-On',
'min_version' => '3.9',
),
'gravityformspaypalpro/paypalpro.php' => array(
'name' => 'Gravity Forms PayPal Pro Add-On',
'min_version' => '1.8',
),
);
}
}