From 6c42b5af61e22cfbcb9e8828d8f0ac3de8a433b8 Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Sun, 27 Nov 2022 09:31:56 +0200 Subject: [PATCH] Rename some database classes, adds the core database classes. --- README.md | 8 +- admin/README.txt | 8 +- admin/sql/install.mysql.utf8.sql | 2 +- componentbuilder.xml | 2 +- .../Componentbuilder/Abstraction/Database.php | 108 +++++ .../src/Componentbuilder/Compiler/Factory.php | 6 +- .../Componentbuilder/Compiler/Field/Data.php | 2 +- .../src/Componentbuilder/Database/Insert.php | 306 ++++++++++++++ .../src/Componentbuilder/Database/Load.php | 380 ++++++++++++++++++ .../src/Componentbuilder/Database/index.html | 1 + ...toryinterface.php => FactoryInterface.php} | 8 +- .../Interfaces/InsertInterface.php | 57 +++ .../Interfaces/LoadInterface.php | 92 +++++ .../Interfaces/Tableinterface.php | 2 +- .../src/Componentbuilder/Search/Agent.php | 42 +- .../Search/Database/{Set.php => Insert.php} | 8 +- .../Search/Database/{Get.php => Load.php} | 180 +++++---- .../src/Componentbuilder/Search/Factory.php | 10 +- .../{SetInterface.php => InsertInterface.php} | 4 +- .../{GetInterface.php => LoadInterface.php} | 4 +- .../Search/Model/{Set.php => Insert.php} | 4 +- .../Search/Model/{Get.php => Load.php} | 4 +- .../Componentbuilder/Search/Service/Agent.php | 4 +- .../Search/Service/Database.php | 67 ++- .../Componentbuilder/Search/Service/Model.php | 28 +- .../src/Utilities/Component/Helper.php | 36 +- 26 files changed, 1180 insertions(+), 193 deletions(-) create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/Database.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Insert.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Load.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/index.html rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/{Factoryinterface.php => FactoryInterface.php} (82%) create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/InsertInterface.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/LoadInterface.php rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/{Set.php => Insert.php} (91%) rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/{Get.php => Load.php} (53%) rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/{SetInterface.php => InsertInterface.php} (93%) rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/{GetInterface.php => LoadInterface.php} (93%) rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/{Set.php => Insert.php} (92%) rename libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/{Get.php => Load.php} (92%) diff --git a/README.md b/README.md index 8d609f964..fb26a8745 100644 --- a/README.md +++ b/README.md @@ -140,14 +140,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 20th November, 2022 ++ *Last Build*: 27th November, 2022 + *Version*: 3.1.12 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **334395** ++ *Line count*: **335381** + *Field count*: **2004** -+ *File count*: **2186** -+ *Folder count*: **382** ++ *File count*: **2192** ++ *Folder count*: **383** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) diff --git a/admin/README.txt b/admin/README.txt index 8d609f964..fb26a8745 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -140,14 +140,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 20th November, 2022 ++ *Last Build*: 27th November, 2022 + *Version*: 3.1.12 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **334395** ++ *Line count*: **335381** + *Field count*: **2004** -+ *File count*: **2186** -+ *Folder count*: **382** ++ *File count*: **2192** ++ *Folder count*: **383** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql index 1e9dc692b..5fce006bc 100644 --- a/admin/sql/install.mysql.utf8.sql +++ b/admin/sql/install.mysql.utf8.sql @@ -1989,7 +1989,7 @@ INSERT INTO `#__componentbuilder_power` (`id`, `add_head`, `description`, `exten (20, '', 'Control the naming of a plugin\r\n\r\n@since 3.0.9', '', '', '3cf76fbf-fd95-4a33-878e-7aff6d36b7f6', '', '', '', '{}', 'CS8qKg0KCSAqIE1ha2luZyBwbHVnaW4gZm9sZGVyIG5hbWUgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAkY29kZU5hbWUgICBUaGUgbmFtZQ0KCSAqIEBpbnB1dAlzdHJpbmcgICAgJGdyb3VwICAgVGhlIGdyb3VwIG5hbWUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZUZvbGRlck5hbWUoJGNvZGVOYW1lLCAkZ3JvdXApDQoJew0KCQkvLyBlZGl0b3JzLXh0ZCBncm91cCBwbHVnaW5zIG11c3QgaGF2ZSBhIGNsYXNzIHdpdGggcGxnQnV0dG9uPFBsdWdpbk5hbWU+IHN0cnVjdHVyZQ0KCQlpZiAoJGdyb3VwID09PSAnZWRpdG9ycy14dGQnKQ0KCQl7DQoJCQkkZ3JvdXAgPSAnQnV0dG9uJzsNCgkJfQ0KDQoJCXJldHVybiAncGxnXycgLiBzdHJ0b2xvd2VyKCRncm91cCkgLiAnXycgLiBzdHJ0b2xvd2VyKA0KCQkJJGNvZGVOYW1lDQoJCSk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHBsdWdpbiBjbGFzcyBuYW1lIHNhZmUNCgkgKg0KCSAqIEBpbnB1dAlzdHJpbmcgICAgJGNvZGVOYW1lICAgVGhlIG5hbWUNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRncm91cCAgIFRoZSBncm91cCBuYW1lDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVDbGFzc05hbWUoJGNvZGVOYW1lLCAkZ3JvdXApDQoJew0KCQkvLyBlZGl0b3JzLXh0ZCBncm91cCBwbHVnaW5zIG11c3QgaGF2ZSBhIGNsYXNzIHdpdGggcGxnQnV0dG9uPFBsdWdpbk5hbWU+IHN0cnVjdHVyZQ0KCQlpZiAoJGdyb3VwID09PSAnZWRpdG9ycy14dGQnKQ0KCQl7DQoJCQkkZ3JvdXAgPSAnQnV0dG9uJzsNCgkJfQ0KDQoJCXJldHVybiAnUGxnJyAuIHVjZmlyc3QoJGdyb3VwKSAuIHVjZmlyc3QoDQoJCQkkY29kZU5hbWUNCgkJKTsNCgl9DQoNCgkvKioNCgkgKiBNYWtpbmcgcGx1Z2luIGluc3RhbGwgY2xhc3MgbmFtZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRjb2RlTmFtZSAgIFRoZSBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAkZ3JvdXAgICBUaGUgZ3JvdXAgbmFtZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlSW5zdGFsbENsYXNzTmFtZSgkY29kZU5hbWUsICRncm91cCkNCgl7DQoJCS8vIGVkaXRvcnMteHRkIGdyb3VwIHBsdWdpbnMgbXVzdCBoYXZlIGEgY2xhc3Mgd2l0aCBwbGdCdXR0b248UGx1Z2luTmFtZT4gc3RydWN0dXJlDQoJCWlmICgkZ3JvdXAgPT09ICdlZGl0b3JzLXh0ZCcpDQoJCXsNCgkJCSRncm91cCA9ICdCdXR0b24nOw0KCQl9DQoNCgkJcmV0dXJuICdwbGcnIC4gdWNmaXJzdCgkZ3JvdXApIC4gdWNmaXJzdCgNCgkJCSRjb2RlTmFtZQ0KCQkpIC4gJ0luc3RhbGxlclNjcmlwdCc7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGxhbmd1YWdlIHByZWZpeCBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRjb2RlTmFtZSAgIFRoZSBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAkZ3JvdXAgICBUaGUgZ3JvdXAgbmFtZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlTGFuZ1ByZWZpeCgkY29kZU5hbWUsICRncm91cCkNCgl7DQoJCS8vIGVkaXRvcnMteHRkIGdyb3VwIHBsdWdpbnMgbXVzdCBoYXZlIGEgY2xhc3Mgd2l0aCBwbGdCdXR0b248UGx1Z2luTmFtZT4gc3RydWN0dXJlDQoJCWlmICgkZ3JvdXAgPT09ICdlZGl0b3JzLXh0ZCcpDQoJCXsNCgkJCSRncm91cCA9ICdCdXR0b24nOw0KCQl9DQoNCgkJcmV0dXJuICdQTEdfJyAuIHN0cnRvdXBwZXIoJGdyb3VwKSAuICdfJyAuIHN0cnRvdXBwZXIoDQoJCQkkY29kZU5hbWUNCgkJKTsNCgl9DQo=', '{}', 'PluginHelper', 'VDM\\Joomla\\Utilities.String.PluginHelper', '1.0.0', '{}', 'String Plugin Helper', 'abstract class', '{}', '', 1, '2022-03-09 14:44:58', '2022-09-20 10:10:12', 14, 5), (21, 1, 'Global Unique ID Helper\r\n\r\n@since 3.0.9', '', '', '9c513baf-b279-43fd-ae29-a585c8cbc4f0', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIFJldHVybnMgYSBHVUlEdjQgc3RyaW5nDQoJICogDQoJICogVGhhbmtzIHRvIERhdmUgUGVhcnNvbiAoYW5kIG90aGVyKQ0KCSAqIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNvbS1jcmVhdGUtZ3VpZC5waHAjMTE5MTY4IA0KCSAqDQoJICogVXNlcyB0aGUgYmVzdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbWV0aG9kDQoJICogZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHdpdGggZmFsbGJhY2sgdG8gYW4gb2xkZXIsDQoJICogbGVzcyBzZWN1cmUgdmVyc2lvbi4NCgkgKg0KCSAqIEBwYXJhbSBib29sICR0cmltDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCR0cmltID0gdHJ1ZSkNCgl7DQoJCS8vIFdpbmRvd3MNCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnY29tX2NyZWF0ZV9ndWlkJykgPT09IHRydWUpDQoJCXsNCgkJCWlmICgkdHJpbSA9PT0gdHJ1ZSkNCgkJCXsNCgkJCQlyZXR1cm4gdHJpbShjb21fY3JlYXRlX2d1aWQoKSwgJ3t9Jyk7DQoJCQl9DQoJCQlyZXR1cm4gY29tX2NyZWF0ZV9ndWlkKCk7DQoJCX0NCg0KCQkvLyBzZXQgdGhlIGJyYWNlcyBpZiBuZWVkZWQNCgkJJGxicmFjZSA9ICR0cmltID8gIiIgOiBjaHIoMTIzKTsgICAgLy8gInsiDQoJCSRyYnJhY2UgPSAkdHJpbSA/ICIiIDogY2hyKDEyNSk7ICAgIC8vICJ9Ig0KDQoJCS8vIE9TWC9MaW51eA0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXMnKSA9PT0gdHJ1ZSkNCgkJew0KCQkJJGRhdGEgPSBvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXMoMTYpOw0KCQkJJGRhdGFbNl0gPSBjaHIoIG9yZCgkZGF0YVs2XSkgJiAweDBmIHwgMHg0MCk7ICAgIC8vIHNldCB2ZXJzaW9uIHRvIDAxMDANCgkJCSRkYXRhWzhdID0gY2hyKCBvcmQoJGRhdGFbOF0pICYgMHgzZiB8IDB4ODApOyAgICAvLyBzZXQgYml0cyA2LTcgdG8gMTANCgkJCXJldHVybiAkbGJyYWNlIC4gdnNwcmludGYoJyVzJXMtJXMtJXMtJXMtJXMlcyVzJywgc3RyX3NwbGl0KGJpbjJoZXgoJGRhdGEpLCA0KSkgLiAkbGJyYWNlOw0KCQl9DQoNCgkJLy8gRmFsbGJhY2sgKFBIUCA0LjIrKQ0KCQltdF9zcmFuZCgoZG91YmxlKSBtaWNyb3RpbWUoKSAqIDEwMDAwKTsNCgkJJGNoYXJpZCA9IHN0cnRvbG93ZXIoIG1kNSggdW5pcWlkKCByYW5kKCksIHRydWUpKSk7DQoJCSRoeXBoZW4gPSBjaHIoNDUpOyAgICAgICAgICAgICAgICAgIC8vICItIg0KCQkkZ3VpZHY0ID0gJGxicmFjZS4NCgkJCXN1YnN0cigkY2hhcmlkLCAgMCwgIDgpLiAkaHlwaGVuLg0KCQkJc3Vic3RyKCRjaGFyaWQsICA4LCAgNCkuICRoeXBoZW4uDQoJCQlzdWJzdHIoJGNoYXJpZCwgMTIsICA0KS4gJGh5cGhlbi4NCgkJCXN1YnN0cigkY2hhcmlkLCAxNiwgIDQpLiAkaHlwaGVuLg0KCQkJc3Vic3RyKCRjaGFyaWQsIDIwLCAxMikuDQoJCQkkcmJyYWNlOw0KCQlyZXR1cm4gJGd1aWR2NDsNCgl9DQoNCgkvKioNCgkgKiBWYWxpZGF0ZSB0aGUgR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIgKCBhbmQgY2hlY2sgaWYgdGFibGUgYWxyZWFkeSBoYXMgdGhpcyBpZGVudGlmaWVyKQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAgICAgICAkZ3VpZA0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlDQoJICogQHBhcmFtIGludCAgICAgICAgICAgICRpZA0KCSAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkY29tcG9uZW50DQoJICoNCgkgKiBAcmV0dXJuIGJvb2wNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkKCRndWlkLCAkdGFibGUgPSBudWxsLCAkaWQgPSAwLCAkY29tcG9uZW50ID0gbnVsbCkNCgl7DQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBzdHJpbmcNCgkJaWYgKHNlbGY6OnZhbGlkYXRlKCRndWlkKSkNCgkJew0KCQkJLy8gY2hlY2sgaWYgdGFibGUgYWxyZWFkeSBoYXMgdGhpcyBpZGVudGlmaWVyDQoJCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkdGFibGUpKQ0KCQkJew0KCQkJCS8vIGNoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgY29tcG9uZW50IGNvZGUgbmFtZQ0KCQkJCWlmICghaXNfc3RyaW5nKCRjb21wb25lbnQpKQ0KCQkJCXsNCgkJCQkJJGNvbXBvbmVudCA9IChzdHJpbmcpIEhlbHBlcjo6Z2V0Q29kZSgpOw0KCQkJCX0NCgkJCQkvLyBHZXQgdGhlIGRhdGFiYXNlIG9iamVjdCBhbmQgYSBuZXcgcXVlcnkgb2JqZWN0Lg0KCQkJCSRkYiA9IEZhY3Rvcnk6OmdldERibygpOw0KCQkJCSRxdWVyeSA9ICRkYi0+Z2V0UXVlcnkodHJ1ZSk7DQoJCQkJJHF1ZXJ5LT5zZWxlY3QoJ0NPVU5UKCopJykNCgkJCQkJLT5mcm9tKCcjX18nIC4gKHN0cmluZykgJGNvbXBvbmVudCAuICdfJyAuIChzdHJpbmcpICR0YWJsZSkNCgkJCQkJLT53aGVyZSgkZGItPnF1b3RlTmFtZSgnZ3VpZCcpIC4gJyA9ICcgLiAkZGItPnF1b3RlKCRndWlkKSk7DQoNCgkJCQkvLyByZW1vdmUgdGhpcyBpdGVtIGZyb20gdGhlIGxpc3QNCgkJCQlpZiAoJGlkID4gMCkNCgkJCQl7DQoJCQkJCSRxdWVyeS0+d2hlcmUoJGRiLT5xdW90ZU5hbWUoJ2lkJykgLiAnIDw+ICcgLiAoaW50KSAkaWQpOw0KCQkJCX0NCg0KCQkJCS8vIFNldCBhbmQgcXVlcnkgdGhlIGRhdGFiYXNlLg0KCQkJCSRkYi0+c2V0UXVlcnkoJHF1ZXJ5KTsNCgkJCQkkZHVwbGljYXRlID0gKGJvb2wpICRkYi0+bG9hZFJlc3VsdCgpOw0KDQoJCQkJaWYgKCRkdXBsaWNhdGUpDQoJCQkJew0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIGdldCB0aGUgaXRlbSBieSBndWlkIGluIGEgdGFibGUNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICRndWlkDQoJICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgJHRhYmxlDQoJICogQHBhcmFtIHN0cmluZy9hcnJheSAgJHdoYXQNCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgICAgJGNvbXBvbmVudA0KCSAqDQoJICogQHJldHVybiBtaXgNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGl0ZW0oJGd1aWQsICR0YWJsZSwgJHdoYXQgPSAnYS5pZCcsICRjb21wb25lbnQgPSBudWxsKQ0KCXsNCgkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIHN0cmluZw0KCQlpZiAoc2VsZjo6dmFsaWRhdGUoJGd1aWQpKQ0KCQl7DQoJCQkvLyBjaGVjayBpZiB0YWJsZSBhbHJlYWR5IGhhcyB0aGlzIGlkZW50aWZpZXINCgkJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCR0YWJsZSkpDQoJCQl7DQoJCQkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSBjb21wb25lbnQgY29kZSBuYW1lDQoJCQkJaWYgKCFpc19zdHJpbmcoJGNvbXBvbmVudCkpDQoJCQkJew0KCQkJCQkkY29tcG9uZW50ID0gKHN0cmluZykgSGVscGVyOjpnZXRDb2RlKCk7DQoJCQkJfQ0KCQkJCS8vIEdldCB0aGUgZGF0YWJhc2Ugb2JqZWN0IGFuZCBhIG5ldyBxdWVyeSBvYmplY3QuDQoJCQkJJGRiID0gRmFjdG9yeTo6Z2V0RGJvKCk7DQoJCQkJJHF1ZXJ5ID0gJGRiLT5nZXRRdWVyeSh0cnVlKTsNCg0KCQkJCWlmIChBcnJheUhlbHBlcjo6Y2hlY2soJHdoYXQpKQ0KCQkJCXsNCgkJCQkJJHF1ZXJ5LT5zZWxlY3QoJGRiLT5xdW90ZU5hbWUoJHdoYXQpKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHF1ZXJ5LT5zZWxlY3QoJHdoYXQpOw0KCQkJCX0NCg0KCQkJCSRxdWVyeS0+ZnJvbSgkZGItPnF1b3RlTmFtZSgnI19fJyAuIChzdHJpbmcpICRjb21wb25lbnQgLiAnXycgLiAoc3RyaW5nKSAkdGFibGUsICdhJykpDQoJCQkJCS0+d2hlcmUoJGRiLT5xdW90ZU5hbWUoJ2EuZ3VpZCcpIC4gJyA9ICcgLiAkZGItPnF1b3RlKCRndWlkKSk7DQoNCgkJCQkvLyBTZXQgYW5kIHF1ZXJ5IHRoZSBkYXRhYmFzZS4NCgkJCQkkZGItPnNldFF1ZXJ5KCRxdWVyeSk7DQoJCQkJJGRiLT5leGVjdXRlKCk7DQoNCgkJCQlpZiAoJGRiLT5nZXROdW1Sb3dzKCkpDQoJCQkJew0KCQkJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCR3aGF0KSB8fCAkd2hhdCA9PT0gJ2EuKicpDQoJCQkJCXsNCgkJCQkJCXJldHVybiAkZGItPmxvYWRPYmplY3QoKTsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCXJldHVybiAkZGItPmxvYWRSZXN1bHQoKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogVmFsaWRhdGUgdGhlIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyDQoJICoNCgkgKiBUaGFua3MgdG8gTGV3aWUNCgkgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTUxNTQ1Ni8xNDI5Njc3DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICRndWlkDQoJICoNCgkgKiBAcmV0dXJuIGJvb2wNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlKCRndWlkKQ0KCXsNCgkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIHN0cmluZw0KCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZ3VpZCkpDQoJCXsNCgkJCXJldHVybiBwcmVnX21hdGNoKCIvXihceyk/W2EtZlxkXXs4fSgtW2EtZlxkXXs0fSl7NH1bYS1mXGRdezh9KD8oMSlcfSkkL2kiLCAkZ3VpZCk7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg==', '{}', 'GuidHelper', 'VDM\\Joomla\\Utilities.GuidHelper', '1.0.0', '{}', 'Utilities GuidHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-12 01:27:10', '2022-09-20 09:51:22', 15, 9), (22, 1, 'File helper\r\n\r\n@since 3.0.9', '', '', 'a223b31e-ea1d-4cdf-92ae-5f9becffaff0', 'dXNlIEpvb21sYVxDTVNcVXJpXFVyaTsNCnVzZSBKb29tbGFcQ01TXEZhY3Rvcnk7DQp1c2UgSm9vbWxhXENNU1xMYW5ndWFnZVxUZXh0Ow0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxQYXRoOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGaWxlOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGb2xkZXI7DQp1c2UgSm9vbWxhXEFyY2hpdmVcQXJjaGl2ZTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"},\"load_selection2\":{\"load\":\"91004529-94a9-4590-b842-e7c6b624ecf5\"}}', 'CS8qKg0KCSAqIFRyaWdnZXIgZXJyb3Igbm90aWNlIG9ubHkgb25jZQ0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyAkY3VybEVycm9yID0gZmFsc2U7DQoNCgkvKioNCgkgKiBUaGUgemlwcGVyIG1ldGhvZA0KCSAqIA0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHdvcmtpbmdEaXJlY3RvcnkgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRlbXMgbXVzdCBiZSB6aXBwZWQNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlcGF0aCAgICAgICAgICBUaGUgcGF0aCB0byB3aGVyZSB0aGUgemlwIGZpbGUgbXVzdCBiZSBwbGFjZWQNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgdHJ1ZSAgIE9uIHN1Y2Nlc3MNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RpcmVjdG9yeSwgJiRmaWxlcGF0aCkNCgl7DQoJCS8vIHN0b3JlIHRoZSBjdXJyZW50IGpvb21sYSB3b3JraW5nIGRpcmVjdG9yeQ0KCQkkam9vbWxhID0gZ2V0Y3dkKCk7DQoNCgkJLy8gd2UgYXJlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgY29tcG9uZW50IHRlbXAgZm9sZGVyDQoJCWNoZGlyKCR3b3JraW5nRGlyZWN0b3J5KTsNCg0KCQkvLyB0aGUgZnVsbCBmaWxlIHBhdGggb2YgdGhlIHppcCBmaWxlDQoJCSRmaWxlcGF0aCA9IFBhdGg6OmNsZWFuKCRmaWxlcGF0aCk7DQoNCgkJLy8gZGVsZXRlIGFuIGV4aXN0aW5nIHppcCBmaWxlIChvciB1c2UgYW4gZXhjbHVzaW9uIHBhcmFtZXRlciBpbiBGb2xkZXI6OmZpbGVzKCkNCgkJRmlsZTo6ZGVsZXRlKCRmaWxlcGF0aCk7DQoNCgkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZSAoYWxzbyB0aGUgaGlkZGVuIGZpbGVzKQ0KCQkkZmlsZXMgPSBGb2xkZXI6OmZpbGVzKCcuJywgJycsIHRydWUsIHRydWUsIGFycmF5KCcuc3ZuJywgJ0NWUycsICcuRFNfU3RvcmUnLCAnX19NQUNPU1gnKSwgYXJyYXkoJy4qficpKTsNCg0KCQkkemlwQXJyYXkgPSBhcnJheSgpOw0KCQkvLyBzZXR1cCB0aGUgemlwIGFycmF5DQoJCWZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkNCgkJew0KCQkJJHRtcCA9IGFycmF5KCk7DQoJCQkkdG1wWyduYW1lJ10gPSBzdHJfcmVwbGFjZSgnLi8nLCAnJywgJGZpbGUpOw0KCQkJJHRtcFsnZGF0YSddID0gc2VsZjo6Z2V0Q29udGVudCgkZmlsZSk7DQoJCQkkdG1wWyd0aW1lJ10gPSBmaWxlbXRpbWUoJGZpbGUpOw0KCQkJJHppcEFycmF5W10gPSAkdG1wOw0KCQl9DQoNCgkJLy8gY2hhbmdlIGJhY2sgdG8gam9vbWxhIHdvcmtpbmcgZGlyZWN0b3J5DQoJCWNoZGlyKCRqb29tbGEpOw0KDQoJCS8vIGdldCB0aGUgemlwIGFkYXB0ZXINCgkJJGFkYXB0ZXIgPSBuZXcgQXJjaGl2ZSgpOw0KCQkkemlwID0gJGFkYXB0ZXItPmdldEFkYXB0ZXIoJ3ppcCcpOw0KDQoJCS8vY3JlYXRlIHRoZSB6aXAgZmlsZQ0KCQlpZiAoJHppcC0+Y3JlYXRlKCRmaWxlcGF0aCwgJHppcEFycmF5KSkNCgkJew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIGdldCB0aGUgY29udGVudCBvZiBhIGZpbGUNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkcGF0aCAgIFRoZSBwYXRoIHRvIHRoZSBmaWxlDQoJICogQHBhcmFtICBzdHJpbmcvYm9vbCAgICRub25lICAgVGhlIHJldHVybiB2YWx1ZSBpZiBubyBjb250ZW50IHdhcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nICAgT24gc3VjY2Vzcw0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudCgkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCRwYXRoKSkNCgkJew0KCQkJLy8gdXNlIGJhc2ljIGZpbGUgZ2V0IGNvbnRlbnQgZm9yIG5vdw0KCQkJaWYgKCgkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCkpICE9PSBGQUxTRSkNCgkJCXsNCgkJCQlyZXR1cm4gJGNvbnRlbnQ7DQoJCQl9DQoJCQkvLyB1c2UgY3VybCBpZiBhdmFpbGFibGUNCgkJCWVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkNCgkJCXsNCgkJCQkvLyBzdGFydCBjdXJsDQoJCQkJJGNoID0gY3VybF9pbml0KCk7DQoJCQkJLy8gc2V0IHRoZSBvcHRpb25zDQoJCQkJJG9wdGlvbnMgPSBhcnJheSgpOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfVVJMXSA9ICRwYXRoOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfVVNFUkFHRU5UXSA9ICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA2LjE7IGVuLVVTOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTInOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfUkVUVVJOVFJBTlNGRVJdID0gVFJVRTsNCgkJCQkkb3B0aW9uc1tDVVJMT1BUX1NTTF9WRVJJRllQRUVSXSA9IEZBTFNFOw0KCQkJCS8vIGxvYWQgdGhlIG9wdGlvbnMNCgkJCQljdXJsX3NldG9wdF9hcnJheSgkY2gsICRvcHRpb25zKTsNCgkJCQkvLyBnZXQgdGhlIGNvbnRlbnQNCgkJCQkkY29udGVudCA9IGN1cmxfZXhlYygkY2gpOw0KCQkJCS8vIGNsb3NlIHRoZSBjb25uZWN0aW9uDQoJCQkJY3VybF9jbG9zZSgkY2gpOw0KDQoJCQkJLy8gcmV0dXJuIGlmIGZvdW5kDQoJCQkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGNvbnRlbnQpKQ0KCQkJCXsNCgkJCQkJcmV0dXJuICRjb250ZW50Ow0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZiAoIXNlbGY6OiRjdXJsRXJyb3IpDQoJCQl7DQoJCQkJLy8gc2V0IHRoZSBub3RpY2UNCgkJCQlGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpLT5lbnF1ZXVlTWVzc2FnZShUZXh0OjpfKCc8aDI+Q3VybCBOb3QgRm91bmQhPC9oMj48cD5QbGVhc2Ugc2V0dXAgY3VybCBvbiB5b3VyIHN5c3RlbSwgb3IgPGI+W1tbY29tcG9uZW50XV1dPC9iPiB3aWxsIG5vdCBmdW5jdGlvbiBjb3JyZWN0bHkhPC9wPicpLCAnRXJyb3InKTsNCgkJCQkvLyBsb2FkIHRoaXMgbm90aWNlIG9ubHkgb25jZQ0KCQkJCXNlbGY6OiRjdXJsRXJyb3IgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkbm9uZTsNCgl9DQoNCgkvKioNCgkgKiBXcml0ZSBhIGZpbGUgdG8gdGhlIHNlcnZlcg0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAkcGF0aCAgICBUaGUgcGF0aCBhbmQgZmlsZSBuYW1lIHdoZXJlIHRvIHNhZmUgdGhlIGRhdGENCgkgKiBAcGFyYW0gIHN0cmluZyAgICRkYXRhICAgIFRoZSBkYXRhIHRvIHNhZmUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgdHJ1ZSAgIE9uIHN1Y2Nlc3MNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdyaXRlKCRwYXRoLCAkZGF0YSkNCgl7DQoJCSRrbGFhciA9IGZhbHNlOw0KCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZGF0YSkpDQoJCXsNCgkJCS8vIG9wZW4gdGhlIGZpbGUNCgkJCSRmaCA9IGZvcGVuKCRwYXRoLCAidyIpOw0KCQkJaWYgKCFpc19yZXNvdXJjZSgkZmgpKQ0KCQkJew0KCQkJCXJldHVybiAka2xhYXI7DQoJCQl9DQoJCQkvLyB3cml0ZSB0byB0aGUgZmlsZQ0KCQkJaWYgKGZ3cml0ZSgkZmgsICRkYXRhKSkNCgkJCXsNCgkJCQkvLyBoYXMgYmVlbiBkb25lDQoJCQkJJGtsYWFyID0gdHJ1ZTsNCgkJCX0NCgkJCS8vIGNsb3NlIGZpbGUuDQoJCQlmY2xvc2UoJGZoKTsNCgkJfQ0KCQlyZXR1cm4gJGtsYWFyOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhbGwgdGhlIGZpbGUgcGF0aHMgaW4gZm9sZGVyIGFuZCBzdWIgZm9sZGVycw0KCSAqIA0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGZvbGRlciAgICAgVGhlIGxvY2FsIHBhdGggdG8gcGFyc2UNCgkgKiBAcGFyYW0gICBhcnJheSAgICRmaWxlVHlwZXMgIFRoZSB0eXBlIG9mIGZpbGVzIHRvIGdldA0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGF0aHMoJGZvbGRlciwgJGZpbGVUeXBlcyA9IGFycmF5KCdcLnBocCcsICdcLmpzJywgJ1wuY3NzJywgJ1wubGVzcycpLCAkcmVjdXJzZSA9IHRydWUsICRmdWxsID0gdHJ1ZSkNCgl7DQoJCWlmIChGb2xkZXI6OmV4aXN0cygkZm9sZGVyKSkNCgkJew0KCQkJLy8gd2UgbXVzdCBmaXJzdCBzdG9yZSB0aGUgY3VycmVudCB3b2tpbmcgZGlyZWN0b3J5DQoJCQkkam9vbWxhID0gZ2V0Y3dkKCk7DQoJCQkvLyB3ZSBhcmUgY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBjb21wb25lbnQgcGF0aA0KCQkJY2hkaXIoJGZvbGRlcik7DQoNCgkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGZpbGUgdHlwZSBmaWx0ZXINCgkJCWlmIChBcnJheUhlbHBlcjo6Y2hlY2soJGZpbGVUeXBlcykpDQoJCQl7DQoJCQkJLy8gZ2V0IHRoZSBmaWxlcw0KCQkJCWZvcmVhY2ggKCRmaWxlVHlwZXMgYXMgJHR5cGUpDQoJCQkJew0KCQkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJCSRmaWxlc1tdID0gRm9sZGVyOjpmaWxlcygnLicsICR0eXBlLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZmlsZVR5cGVzKSkNCgkJCXsNCgkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJJGZpbGVzW10gPSBGb2xkZXI6OmZpbGVzKCcuJywgJGZpbGVUeXBlcywgJHJlY3Vyc2UsICRmdWxsKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJJGZpbGVzW10gPSBGb2xkZXI6OmZpbGVzKCcuJywgJy4nLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCQkJfQ0KDQoJCQkvLyBjaGFuZ2UgYmFjayB0byBKb29tbGEgd29ya2luZyBkaXJlY3RvcnkNCgkJCWNoZGlyKCRqb29tbGEpOw0KDQoJCQkvLyByZXR1cm4gYXJyYXkgb2YgZmlsZXMNCgkJCXJldHVybiBhcnJheV9tYXAoIGZ1bmN0aW9uKCRmaWxlKSB7IHJldHVybiBzdHJfcmVwbGFjZSgnLi8nLCAnLycsICRmaWxlKTsgfSwgKGFycmF5KSBBcnJheUhlbHBlcjo6bWVyZ2UoJGZpbGVzKSk7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCB0aGUgZmlsZSBwYXRoIG9yIHVybA0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAkdHlwZSAgICAgICAgICAgICAgVGhlICh1cmwvcGF0aCkgdHlwZSB0byByZXR1cm4NCgkgKiBAcGFyYW0gIHN0cmluZyAgICR0YXJnZXQgICAgICAgICAgICBUaGUgUGFyYW1zIFRhcmdldCBuYW1lIChpZiBzZXQpDQoJICogQHBhcmFtICBzdHJpbmcgICAkZmlsZVR5cGUgICAgICAgICAgVGhlIGtpbmQgb2YgZmlsZW5hbWUgdG8gZ2VuZXJhdGUgKGlmIG5vdCBzZXQgbm8gZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRrZXkgICAgICAgICAgICAgICBUaGUga2V5IHRvIGFkanVzdCB0aGUgZmlsZW5hbWUgKGlmIG5vdCBzZXQgaWdub3JlZCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRkZWZhdWx0ICAgICAgICAgICBUaGUgZGVmYXVsdCBwYXRoIGlmIG5vdCBzZXQgaW4gUGFyYW1zIChmYWxsYmFjayBwYXRoKQ0KCSAqIEBwYXJhbSAgYm9vbCAgICAgJGNyZWF0ZUlmTm90U2V0ICAgIFRoZSBzd2l0Y2ggdG8gY3JlYXRlIHRoZSBmb2xkZXIgaWYgbm90IGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICAgT24gc3VjY2VzcyB0aGUgcGF0aCBvciB1cmwgaXMgcmV0dXJuZWQgYmFzZWQgb24gdGhlIHR5cGUgcmVxdWVzdGVkDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQYXRoKCR0eXBlID0gJ3BhdGgnLCAkdGFyZ2V0ID0gJ2ZpbGVwYXRoJywgJGZpbGVUeXBlID0gbnVsbCwgJGtleSA9ICcnLCAkZGVmYXVsdCA9ICcnLCAkY3JlYXRlSWZOb3RTZXQgPSB0cnVlKQ0KCXsNCgkJLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBoYXZlIGEgc3RyaW5nL3BhdGgNCgkJaWYoIVN0cmluZ0hlbHBlcjo6Y2hlY2soJGRlZmF1bHQpKQ0KCQl7DQoJCQkkZGVmYXVsdCA9IEpQQVRIX1NJVEUgLiAnL2ltYWdlcy8nOw0KCQl9DQoNCgkJLy8gZ2V0IHRoZSBnbG9iYWwgc2V0dGluZ3MNCgkJJGZpbGVQYXRoID0gSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0YXJnZXQsICRkZWZhdWx0KTsNCg0KCQkvLyBjaGVjayB0aGUgZmlsZSBwYXRoIChyZXZlcnQgdG8gZGVmYXVsdCBvbmx5IG9mIG5vdCBhIGhpZGRlbiBmaWxlIHBhdGgpDQoJCWlmICgnaGlkZGVuZmlsZXBhdGgnICE9PSAkdGFyZ2V0ICYmIHN0cnBvcygkZmlsZVBhdGgsIEpQQVRIX1NJVEUpID09PSBmYWxzZSkNCgkJew0KCQkJJGZpbGVQYXRoID0gJGRlZmF1bHQ7DQoJCX0NCg0KCQkvLyBjcmVhdGUgdGhlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdA0KCQlpZiAoJGNyZWF0ZUlmTm90U2V0ICYmICFGb2xkZXI6OmV4aXN0cygkZmlsZVBhdGgpKQ0KCQl7DQoJCQlGb2xkZXI6OmNyZWF0ZSgkZmlsZVBhdGgpOw0KCQl9DQoNCgkJLy8gc2V0dXAgdGhlIGZpbGUgbmFtZQ0KCQkkZmlsZU5hbWUgPSAnJzsNCg0KCQkvLyBHZXQgYmFzaWMga2V5DQoJCSRiYXNpY2tleSA9ICdUaCFzX2lTX24wdF9zQWZlX2J1VF9iM3R0ZXJfdGhlbl9uMHRoaXVnJzsNCgkJLy8gZ2V0IHRoZSBjb21wb25lbnQgaGVscGVyDQoJCSRoZWxwZXIgPSBIZWxwZXI6OmdldCgpOw0KCQkvLyBjaGVjayBpZiBtZXRob2QgZXhpc3QgaW4gaGVscGVyIGNsYXNzDQoJCWlmICgkaGVscGVyICYmIEhlbHBlcjo6bWV0aG9kRXhpc3RzKCdnZXRDcnlwdEtleScpKSANCgkJew0KCQkJJGJhc2lja2V5ID0gJGhlbHBlcjo6Z2V0Q3J5cHRLZXkoJ2Jhc2ljJywgJGJhc2lja2V5KTsNCgkJfQ0KDQoJCS8vIGNoZWNrIHRoZSBrZXkNCgkJaWYgKCFTdHJpbmdIZWxwZXI6OmNoZWNrKCRrZXkpKQ0KCQl7DQoJCQkka2V5ID0gJ3ZEbSc7DQoJCX0NCg0KCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZmlsZVR5cGUpKQ0KCQl7DQoJCQkvLyBzZXQgdGhlIG5hbWUNCgkJCSRmaWxlTmFtZSA9IHRyaW0oIG1kNSgkdHlwZSAuICR0YXJnZXQgLiAkYmFzaWNrZXkgLiAka2V5KSAuICcuJyAuIHRyaW0oJGZpbGVUeXBlLCAnLicpKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRmaWxlTmFtZSA9IHRyaW0oIG1kNSgkdHlwZSAuICR0YXJnZXQgLiAkYmFzaWNrZXkgLiAka2V5KSkgLiAnLnR4dCc7DQoJCX0NCg0KCQkvLyByZXR1cm4gdGhlIHVybA0KCQlpZiAoJ3VybCcgPT09ICR0eXBlKQ0KCQl7DQoJCQlpZiAoXHN0cnBvcygkZmlsZVBhdGgsIEpQQVRIX1NJVEUpICE9PSBmYWxzZSkNCgkJCXsNCgkJCQkkZmlsZVBhdGggPSB0cmltKCBzdHJfcmVwbGFjZSggSlBBVEhfU0lURSwgJycsICRmaWxlUGF0aCksICcvJyk7DQoNCgkJCQlyZXR1cm4gVXJpOjpyb290KCkgLiAkZmlsZVBhdGggLiAnLycgLiAkZmlsZU5hbWU7DQoJCQl9DQoNCgkJCS8vIHNpbmNlIHRoZSBwYXRoIGlzIGJlaGluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIHNpdGUsIHJldHVybiBvbmx5IHRoZSByb290IHVybCAobWF5IGJlIHVzZWQgdG8gYnVpbGQgdGhlIGxpbmspDQoJCQlyZXR1cm4gVXJpOjpyb290KCk7DQoJCX0NCg0KCQkvLyBzYW5pdGl6ZSB0aGUgcGF0aA0KCQlyZXR1cm4gJy8nIC4gdHJpbSggJGZpbGVQYXRoLCAnLycgKSAuICcvJyAuICRmaWxlTmFtZTsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiBmaWxlIGV4aXN0DQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRwYXRoICAgVGhlIHVybC9wYXRoIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJuICBib29sICAgICAgSWYgZXhpc3QgdHJ1ZQ0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXhpc3RzKCRwYXRoKQ0KCXsNCgkJJGV4aXN0cyA9IGZhbHNlOw0KCQkvLyBpZiB0aGlzIGlzIGEgbG9jYWwgcGF0aA0KCQlpZiAoc3RycG9zKCRwYXRoLCAnaHR0cDonKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRwYXRoLCAnaHR0cHM6JykgPT09IGZhbHNlKQ0KCQl7DQoJCQlpZiAoZmlsZV9leGlzdHMoJHBhdGgpKQ0KCQkJew0KCQkJCSRleGlzdHMgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCS8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgY3VybA0KCQllbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykpDQoJCXsNCgkJCS8vIGluaXRpYXRlIGN1cmwNCgkJCSRjaCA9IGN1cmxfaW5pdCgkcGF0aCk7DQoJCQkvLyBDVVJMT1BUX05PQk9EWSAoZG8gbm90IHJldHVybiBib2R5KQ0KCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX05PQk9EWSwgdHJ1ZSk7DQoJCQkvLyBtYWtlIGNhbGwNCgkJCSRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCS8vIGNoZWNrIHJldHVybiB2YWx1ZQ0KCQkJaWYgKCRyZXN1bHQgIT09IGZhbHNlKQ0KCQkJew0KCQkJCS8vIGdldCB0aGUgaHR0cCBDT0RFDQoJCQkJJHN0YXR1c0NvZGUgPSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpOw0KCQkJCWlmICgkc3RhdHVzQ29kZSAhPT0gNDA0KQ0KCQkJCXsNCgkJCQkJJGV4aXN0cyA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb24NCgkJCWN1cmxfY2xvc2UoJGNoKTsNCgkJfQ0KCQllbHNlaWYgKCRoZWFkZXJzID0gQGdldF9oZWFkZXJzKCRwYXRoKSkNCgkJew0KCQkJaWYoaXNzZXQoJGhlYWRlcnNbMF0pICYmIGlzX3N0cmluZygkaGVhZGVyc1swXSkgJiYgc3RycG9zKCRoZWFkZXJzWzBdLCc0MDQnKSA9PT0gZmFsc2UpDQoJCQl7DQoJCQkJJGV4aXN0cyA9IHRydWU7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRleGlzdHM7DQoJfQ0K', '{}', 'FileHelper', 'VDM\\Joomla\\Utilities.FileHelper', '1.0.0', '{}', 'Utilities FileHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-12 02:09:18', '2022-09-20 09:51:18', 27, 9), -(23, 1, 'Some component helper\r\n\r\n@since 3.0.11', '', '', '640b5352-fb09-425f-a26e-cd44eda03f15', 'dXNlIEpvb21sYVxJbnB1dFxJbnB1dDsNCnVzZSBKb29tbGFcQ01TXENvbXBvbmVudFxDb21wb25lbnRIZWxwZXI7DQp1c2UgSm9vbWxhXFJlZ2lzdHJ5XFJlZ2lzdHJ5Ow==', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBjdXJyZW50IG9wdGlvbg0KCSAqDQoJICogQHZhciAgICBTdHJpbmcNCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljICRvcHRpb247DQoNCgkvKioNCgkgKiBUaGUgY29tcG9uZW50IHBhcmFtcyBsaXN0IGNhY2hlDQoJICoNCgkgKiBAdmFyICAgIFJlZ2lzdHJ5W10NCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRwYXJhbXMgPSBhcnJheSgpOw0KDQoJLyoqDQoJICogR2V0cyB0aGUgcGFyYW1ldGVyIG9iamVjdCBmb3IgdGhlIGNvbXBvbmVudA0KCSAqDQoJICogQHBhcmFtICAgU3RyaW5nICAgICAgICAgICAgICAgJG9wdGlvbiAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEByZXR1cm4gIFJlZ2lzdHJ5ICAgICAgICAgICAgQSBSZWdpc3RyeSBvYmplY3QuDQoJICoNCgkgKiBAc2VlICAgICBSZWdpc3RyeQ0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFyYW1zKCRvcHRpb24gPSBudWxsKQ0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQlpZiAoZW1wdHkoJG9wdGlvbikpDQoJCXsNCgkJCSRvcHRpb24gPSBzZWxmOjpnZXRPcHRpb24oKTsNCgkJfQ0KDQoJCS8vIGdldCBnbG9iYWwgdmFsdWUNCgkJaWYgKCFpc3NldChzZWxmOjokcGFyYW1zWyRvcHRpb25dKSB8fCAhc2VsZjo6JHBhcmFtc1skb3B0aW9uXSBpbnN0YW5jZW9mIFJlZ2lzdHJ5KQ0KCQl7DQoJCQlzZWxmOjokcGFyYW1zWyRvcHRpb25dID0gQ29tcG9uZW50SGVscGVyOjpnZXRQYXJhbXMoJG9wdGlvbik7DQoJCX0NCg0KCQlyZXR1cm4gc2VsZjo6JHBhcmFtc1skb3B0aW9uXTsNCgl9DQoNCgkvKioNCgkgKiBHZXRzIHRoZSBjb21wb25lbnQgb3B0aW9uDQoJICoNCgkgKiBAcGFyYW0gICBTdHJpbmd8Qm9vbCAgICAgICRkZWZhdWx0ICBUaGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgbm9uZSBpcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgU3RyaW5nfEJvb2wgICAgICBBIGNvbXBvbmVudCBvcHRpb24NCgkgKg0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0T3B0aW9uKCRkZWZhdWx0ID0gJ2VtcHR5JykNCgl7DQoJCWlmIChlbXB0eShzZWxmOjokb3B0aW9uKSkNCgkJew0KCQkJLy8gZ2V0IHRoZSBvcHRpb24gZnJvbSB0aGUgdXJsIGlucHV0DQoJCQlzZWxmOjokb3B0aW9uID0gKG5ldyBJbnB1dCktPmdldFN0cmluZygnb3B0aW9uJywgZmFsc2UpOw0KCQl9DQoNCgkJaWYgKHNlbGY6OiRvcHRpb24pDQoJCXsNCgkJCSByZXR1cm4gc2VsZjo6JG9wdGlvbjsNCgkJfQ0KDQoJCXJldHVybiAkZGVmYXVsdDsNCgl9DQoNCgkvKioNCgkgKiBHZXRzIHRoZSBjb21wb25lbnQgY29kZSBuYW1lDQoJICoNCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICAgICAgICAgICRvcHRpb24gIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICogQHBhcmFtICAgU3RyaW5nfEJvb2wgICAgICAkZGVmYXVsdCAgVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIG5vbmUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIFN0cmluZ3xNaXhlZCAgICAgIEEgY29tcG9uZW50IGNvZGUgbmFtZQ0KCSAqDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb2RlKCRvcHRpb24gPSBudWxsLCAkZGVmYXVsdCA9IG51bGwpDQoJew0KCQkvLyBjaGVjayB0aGF0IHdlIGhhdmUgYW4gb3B0aW9uDQoJCWlmIChlbXB0eSgkb3B0aW9uKSkNCgkJew0KCQkJJG9wdGlvbiA9IHNlbGY6OmdldE9wdGlvbigpOw0KCQl9DQoJCS8vIG9wdGlvbiB3aXRoIGNvbV8NCgkJaWYgKGlzX3N0cmluZygkb3B0aW9uKSAmJiBzdHJwb3MoJG9wdGlvbiwgJ2NvbV8nKSA9PT0gMCkNCgkJew0KCQkJcmV0dXJuIHN0cnRvbG93ZXIodHJpbShzdWJzdHIoJG9wdGlvbiwgNCkpKTsNCgkJfQ0KDQoJCXJldHVybiAkZGVmYXVsdDsNCgl9DQoNCgkvKioNCgkgKiBHZXRzIHRoZSBjb21wb25lbnQgYWJzdHJhY3QgaGVscGVyIGNsYXNzDQoJICoNCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICAgICAgICAgICRvcHRpb24gIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICogQHBhcmFtICAgU3RyaW5nfEJvb2wgICAgICAkZGVmYXVsdCAgVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIG5vbmUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIFN0cmluZ3xNaXhlZCAgICAgIEEgY29tcG9uZW50IGhlbHBlciBuYW1lDQoJICoNCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkb3B0aW9uID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKQ0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQkvLyBhbmQgZ2V0IHRoZSBjb2RlIG5hbWUgZnJvbSBpdA0KCQlpZiAoKCRjb2RlX25hbWUgPSBzZWxmOjpnZXRDb2RlKCRvcHRpb24sIGZhbHNlKSkgIT09IGZhbHNlKQ0KCQl7DQoJCQkvLyB3ZSBidWlsZCB0aGUgaGVscGVyIGNsYXNzIG5hbWUNCgkJCSRoZWxwZXJfbmFtZSA9ICdcXCcgLiBcdWNmaXJzdCgkY29kZV9uYW1lKSAuICdIZWxwZXInOw0KCQkJLy8gY2hlY2sgaWYgY2xhc3MgZXhpc3QNCgkJCWlmIChjbGFzc19leGlzdHMoJGhlbHBlcl9uYW1lKSkNCgkJCXsNCgkJCQlyZXR1cm4gJGhlbHBlcl9uYW1lOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuICRkZWZhdWx0Ow0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIHRoZSBoZWxwZXIgY2xhc3Mgb2YgdGhpcyBjb21wb25lbnQgaGFzIGEgbWV0aG9kDQoJICoNCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICAgJG1ldGhvZCAgVGhlIG1ldGhvZCBuYW1lIHRvIHNlYXJjaCBmb3INCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICAgJG9wdGlvbiAgICBUaGUgb3B0aW9uIGZvciB0aGUgY29tcG9uZW50Lg0KCSAqDQoJICogQHJldHVybiAgYm9vbCAgICAgICAgICB0cnVlIGlmIG1ldGhvZCBleGlzdA0KCSAqDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtZXRob2RFeGlzdHMoJG1ldGhvZCwgJG9wdGlvbiA9IG51bGwpDQoJew0KCQkvLyBnZXQgdGhlIGhlbHBlciBjbGFzcw0KCQlpZiAoKCRoZWxwZXIgPSBzZWxmOjpnZXQoJG9wdGlvbiwgZmFsc2UpKSAhPT0gZmFsc2UpDQoJCXsNCgkJCWlmIChtZXRob2RfZXhpc3RzKCRoZWxwZXIsICRtZXRob2QpKQ0KCQkJew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg==', '{}', 'Helper', 'VDM\\Joomla\\Utilities.Component.Helper', '1.0.0', '{}', 'Utilities Component Helper', 'abstract class', '{}', '', 1, '2022-05-13 05:36:32', '2022-09-20 09:51:14', 20, 7), +(23, 1, 'Some component helper\r\n\r\n@since 3.0.11', '', '', '640b5352-fb09-425f-a26e-cd44eda03f15', 'dXNlIEpvb21sYVxJbnB1dFxJbnB1dDsNCnVzZSBKb29tbGFcQ01TXENvbXBvbmVudFxDb21wb25lbnRIZWxwZXI7DQp1c2UgSm9vbWxhXFJlZ2lzdHJ5XFJlZ2lzdHJ5Ow==', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBjdXJyZW50IG9wdGlvbg0KCSAqDQoJICogQHZhciAgICBzdHJpbmcNCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljICRvcHRpb247DQoNCgkvKioNCgkgKiBUaGUgY29tcG9uZW50IHBhcmFtcyBsaXN0IGNhY2hlDQoJICoNCgkgKiBAdmFyICAgIFJlZ2lzdHJ5W10NCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRwYXJhbXMgPSBhcnJheSgpOw0KDQoJLyoqDQoJICogR2V0cyB0aGUgcGFyYW1ldGVyIG9iamVjdCBmb3IgdGhlIGNvbXBvbmVudA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICRvcHRpb24gIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICoNCgkgKiBAcmV0dXJuICBSZWdpc3RyeSAgICAgQSBSZWdpc3RyeSBvYmplY3QuDQoJICoNCgkgKiBAc2VlICAgICBSZWdpc3RyeQ0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFyYW1zKCRvcHRpb24gPSBudWxsKTogUmVnaXN0cnkNCgl7DQoJCS8vIGNoZWNrIHRoYXQgd2UgaGF2ZSBhbiBvcHRpb24NCgkJaWYgKGVtcHR5KCRvcHRpb24pKQ0KCQl7DQoJCQkkb3B0aW9uID0gc2VsZjo6Z2V0T3B0aW9uKCk7DQoJCX0NCg0KCQkvLyBnZXQgZ2xvYmFsIHZhbHVlDQoJCWlmICghaXNzZXQoc2VsZjo6JHBhcmFtc1skb3B0aW9uXSkgfHwgIXNlbGY6OiRwYXJhbXNbJG9wdGlvbl0gaW5zdGFuY2VvZiBSZWdpc3RyeSkNCgkJew0KCQkJc2VsZjo6JHBhcmFtc1skb3B0aW9uXSA9IENvbXBvbmVudEhlbHBlcjo6Z2V0UGFyYW1zKCRvcHRpb24pOw0KCQl9DQoNCgkJcmV0dXJuIHNlbGY6OiRwYXJhbXNbJG9wdGlvbl07DQoJfQ0KDQoJLyoqDQoJICogR2V0cyB0aGUgY29tcG9uZW50IG9wdGlvbg0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgICAkZGVmYXVsdCAgVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIG5vbmUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZ3xudWxsICAgICAgQSBjb21wb25lbnQgb3B0aW9uDQoJICoNCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE9wdGlvbigkZGVmYXVsdCA9ICdlbXB0eScpOiA/c3RyaW5nDQoJew0KCQlpZiAoZW1wdHkoc2VsZjo6JG9wdGlvbikpDQoJCXsNCgkJCS8vIGdldCB0aGUgb3B0aW9uIGZyb20gdGhlIHVybCBpbnB1dA0KCQkJc2VsZjo6JG9wdGlvbiA9IChuZXcgSW5wdXQpLT5nZXRTdHJpbmcoJ29wdGlvbicsIGZhbHNlKTsNCgkJfQ0KDQoJCWlmIChzZWxmOjokb3B0aW9uKQ0KCQl7DQoJCQkgcmV0dXJuIHNlbGY6OiRvcHRpb247DQoJCX0NCg0KCQlyZXR1cm4gJGRlZmF1bHQ7DQoJfQ0KDQoJLyoqDQoJICogR2V0cyB0aGUgY29tcG9uZW50IGNvZGUgbmFtZQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICAgJG9wdGlvbiAgIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgJGRlZmF1bHQgIFRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBub25lIGlzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmd8bnVsbCAgICBBIGNvbXBvbmVudCBjb2RlIG5hbWUNCgkgKg0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29kZSgkb3B0aW9uID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKTogP3N0cmluZw0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQlpZiAoZW1wdHkoJG9wdGlvbikpDQoJCXsNCgkJCSRvcHRpb24gPSBzZWxmOjpnZXRPcHRpb24oKTsNCgkJfQ0KCQkvLyBvcHRpb24gd2l0aCBjb21fDQoJCWlmIChpc19zdHJpbmcoJG9wdGlvbikgJiYgc3RycG9zKCRvcHRpb24sICdjb21fJykgPT09IDApDQoJCXsNCgkJCXJldHVybiBzdHJ0b2xvd2VyKHRyaW0oc3Vic3RyKCRvcHRpb24sIDQpKSk7DQoJCX0NCg0KCQlyZXR1cm4gJGRlZmF1bHQ7DQoJfQ0KDQoJLyoqDQoJICogR2V0cyB0aGUgY29tcG9uZW50IGFic3RyYWN0IGhlbHBlciBjbGFzcw0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgJG9wdGlvbiAgIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgJGRlZmF1bHQgIFRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBub25lIGlzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmd8bnVsbCAgICBBIGNvbXBvbmVudCBoZWxwZXIgbmFtZQ0KCSAqDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXQoJG9wdGlvbiA9IG51bGwsICRkZWZhdWx0ID0gbnVsbCk6ID9zdHJpbmcNCgl7DQoJCS8vIGNoZWNrIHRoYXQgd2UgaGF2ZSBhbiBvcHRpb24NCgkJLy8gYW5kIGdldCB0aGUgY29kZSBuYW1lIGZyb20gaXQNCgkJaWYgKCgkY29kZV9uYW1lID0gc2VsZjo6Z2V0Q29kZSgkb3B0aW9uLCBmYWxzZSkpICE9PSBmYWxzZSkNCgkJew0KCQkJLy8gd2UgYnVpbGQgdGhlIGhlbHBlciBjbGFzcyBuYW1lDQoJCQkkaGVscGVyX25hbWUgPSAnXFwnIC4gXHVjZmlyc3QoJGNvZGVfbmFtZSkgLiAnSGVscGVyJzsNCgkJCS8vIGNoZWNrIGlmIGNsYXNzIGV4aXN0DQoJCQlpZiAoY2xhc3NfZXhpc3RzKCRoZWxwZXJfbmFtZSkpDQoJCQl7DQoJCQkJcmV0dXJuICRoZWxwZXJfbmFtZTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiAkZGVmYXVsdDsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiB0aGUgaGVscGVyIGNsYXNzIG9mIHRoaXMgY29tcG9uZW50IGhhcyBhIG1ldGhvZA0KCSAqDQoJICogQHBhcmFtICAgU3RyaW5nICAgICAkbWV0aG9kICBUaGUgbWV0aG9kIG5hbWUgdG8gc2VhcmNoIGZvcg0KCSAqIEBwYXJhbSAgIFN0cmluZyAgICAgJG9wdGlvbiAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgICAgdHJ1ZSBpZiBtZXRob2QgZXhpc3QNCgkgKg0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWV0aG9kRXhpc3RzKCRtZXRob2QsICRvcHRpb24gPSBudWxsKQ0KCXsNCgkJLy8gZ2V0IHRoZSBoZWxwZXIgY2xhc3MNCgkJaWYgKCgkaGVscGVyID0gc2VsZjo6Z2V0KCRvcHRpb24sIGZhbHNlKSkgIT09IGZhbHNlKQ0KCQl7DQoJCQlpZiAobWV0aG9kX2V4aXN0cygkaGVscGVyLCAkbWV0aG9kKSkNCgkJCXsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQo=', '{}', 'Helper', 'VDM\\Joomla\\Utilities.Component.Helper', '1.0.0', '{}', 'Utilities Component Helper', 'abstract class', '{}', '', 1, '2022-05-13 05:36:32', '2022-12-16 16:32:00', 22, 7), (24, 1, 'Image helper\r\n\r\n@since 3.0.11', '', '', '962b15d8-915f-4cd7-aea6-7cf82afdc20b', 'dXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGaWxlOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGb2xkZXI7DQp1c2UgSm9vbWxhXENNU1xVcmlcVXJpOw0KdXNlIEpvb21sYVxDTVNcSW1hZ2VcSW1hZ2U7', '', '', '{\"load_selection0\":{\"load\":\"91004529-94a9-4590-b842-e7c6b624ecf5\"},\"load_selection1\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"}}', 'CS8qKg0KCSAqIFJlc2l6ZSBhbiBpbWFnZQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICRmdWxsUGF0aCAgIFRoZSBmdWxsIHBhdGggdG8gdGhlIGltYWdlDQoJICogQHBhcmFtICAgc3RyaW5nICAgICR0eXBlICAgICAgICBUaGUgdHlwZSBvZiBpbWFnZQ0KCSAqDQoJICogQHJldHVybiBib29sDQoJICogQHNpbmNlIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzaXplKHN0cmluZyAkZnVsbFBhdGgsIHN0cmluZyAkdHlwZSkNCgl7DQoJCS8vIGZpcnN0IGNoZWNrIGlmIHdlIHNob3VsZCByZXNpemUgdGhpcyB0YXJnZXQNCgkJaWYgKDEgPT0gSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0eXBlIC4gJ19yZXNpemUnLCAwKSkNCgkJew0KCQkJLy8gbG9hZCB0aGUgc2l6ZSB0byBiZSBzZXQNCgkJCSRoZWlnaHQgPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJHR5cGUgLiAnX2hlaWdodCcsICdub3Rfc2V0Jyk7DQoJCQkkd2lkdGggPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJHR5cGUgLiAnX3dpZHRoJywgJ25vdF9zZXQnKTsNCg0KCQkJLy8gR2V0IGZpbGUgZXh0ZW5zaW9uL2Zvcm1hdA0KCQkJJGZpbGVfZm9ybWF0ID0gTWltZUhlbHBlcjo6ZXh0ZW5zaW9uKCRmdWxsUGF0aCk7DQoNCgkJCS8vIGdldCBpbWFnZSBwcm9wZXJ0aWVzDQoJCQkkaW1hZ2UgPSBzZWxmOjpnZXRQcm9wZXJ0aWVzKCRmdWxsUGF0aCk7DQoNCgkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIG9iamVjdA0KCQkJaWYgKE9iamVjdEhlbHBlcjo6Y2hlY2soJGltYWdlKSAmJiBpc19zdHJpbmcoJGZpbGVfZm9ybWF0KSkNCgkJCXsNCgkJCQlpZiAoJHdpZHRoICE9PSAnbm90X3NldCcgJiYgJGhlaWdodCAhPT0gJ25vdF9zZXQnICYmICgkaW1hZ2UtPndpZHRoICE9ICR3aWR0aCB8fCAkaW1hZ2UtPmhlaWdodCAhPSAkaGVpZ2h0KSkNCgkJCQl7DQoJCQkJCS8vIGlmIGltYWdlIGlzIGh1Z2UgYW5kIHNob3VsZCBvbmx5IGJlIHNjYWxlZCwgcmVzaXplIGl0IG9uIHRoZSBmbHkNCgkJCQkJaWYoKCRpbWFnZS0+d2lkdGggPiA5MDAgfHwgJGltYWdlLT5oZWlnaHQgPiA3MDApICYmICgkaGVpZ2h0ID09IDAgfHwgJHdpZHRoID09IDApKQ0KCQkJCQl7DQoJCQkJCQkvLyBzZWxlY3QgdGhlIGltYWdlICJnZXR0ZXIiIGJhc2VkIG9uIGZvcm1hdA0KCQkJCQkJaWYoJGZpbGVfZm9ybWF0ID09ICJqcGciIHx8ICRmaWxlX2Zvcm1hdCA9PSAianBlZyIgKQ0KCQkJCQkJew0KCQkJCQkJCSRzcmMgPSBpbWFnZWNyZWF0ZWZyb21qcGVnKCRmdWxsUGF0aCk7DQoJCQkJCQl9DQoJCQkJCQllbHNlaWYoJGZpbGVfZm9ybWF0ID09ICJwbmciKQ0KCQkJCQkJew0KCQkJCQkJCSRzcmMgPSBpbWFnZWNyZWF0ZWZyb21wbmcoJGZ1bGxQYXRoKTsNCgkJCQkJCX0NCgkJCQkJCWVsc2VpZigkZmlsZV9mb3JtYXQgPT0gImdpZiIpDQoJCQkJCQl7DQoJCQkJCQkJJHNyYyA9IGltYWdlY3JlYXRlZnJvbWdpZigkZnVsbFBhdGgpOw0KCQkJCQkJfQ0KCQkJCQkJLy8gd2Ugb25seSBzdXBwb3J0IHRoZSBhYm92ZSB0aHJlZSBmb3JtYXRzIGZvciBub3cNCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIHdvcmtvdXQgdGhlIHJhdGlvIGlmIHdlIGhhdmUgaGVpZ2h0DQoJCQkJCQlpZiAoJGhlaWdodCAhPSAwKQ0KCQkJCQkJew0KCQkJCQkJCSRoZWlnaHRfcmF0aW8gPSAkaW1hZ2UtPmhlaWdodCAvICRoZWlnaHQ7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIHdvcmtvdXQgdGhlIHJhdGlvIGlmIHdlIGhhdmUgd2lkdGgNCgkJCQkJCWlmICgkd2lkdGggIT0gMCkNCgkJCQkJCXsNCgkJCQkJCQkkd2lkdGhfcmF0aW8gPSAkaW1hZ2UtPndpZHRoIC8gJHdpZHRoOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBzZXQgbWF4IHJhdGlvIGJhc2VkIG9uIGJvdGgNCgkJCQkJCWlmIChpc3NldCgkaGVpZ2h0X3JhdGlvKSAmJiBpc3NldCgkd2lkdGhfcmF0aW8pKQ0KCQkJCQkJew0KCQkJCQkJCSRtYXhfcmF0aW8JPSBtYXgoJHdpZHRoX3JhdGlvLCAkaGVpZ2h0X3JhdGlvKTsNCgkJCQkJCX0NCgkJCQkJCS8vIHNldCBtYXggcmF0aW8gYmFzZWQgb24gd2lkdGgNCgkJCQkJCWVsc2VpZiAoaXNzZXQoJHdpZHRoX3JhdGlvKSkNCgkJCQkJCXsNCgkJCQkJCQkkbWF4X3JhdGlvCT0gJHdpZHRoX3JhdGlvOw0KCQkJCQkJfQ0KCQkJCQkJLy8gc2V0IG1heCByYXRpbyBiYXNlZCBvbiBoZWlnaHQNCgkJCQkJCWVsc2VpZiAoaXNzZXQoJGhlaWdodF9yYXRpbykpDQoJCQkJCQl7DQoJCQkJCQkJJG1heF9yYXRpbwk9ICRoZWlnaHRfcmF0aW87DQoJCQkJCQl9DQoNCgkJCQkJCS8vIGlmIHdlIGhhdmUgcmF0aW8gZG8gdGhlIGNvbnZlcnNpb24NCgkJCQkJCWlmICgkbWF4X3JhdGlvID4gMSkNCgkJCQkJCXsNCgkJCQkJCQkkbmV3X3dpZHRoCT0gJGltYWdlLT53aWR0aCAvICRtYXhfcmF0aW87DQoJCQkJCQkJJG5ld19oZWlnaHQJPSAkaW1hZ2UtPmhlaWdodCAvICRtYXhfcmF0aW87DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJJG5ld193aWR0aAk9ICRpbWFnZS0+d2lkdGg7DQoJCQkJCQkJJG5ld19oZWlnaHQJPSAkaW1hZ2UtPmhlaWdodDsNCgkJCQkJCX0NCg0KCQkJCQkJJHRtcAkJCT0gaW1hZ2VjcmVhdGV0cnVlY29sb3IoJG5ld193aWR0aCwgJG5ld19oZWlnaHQpOw0KCQkJCQkJJGJhY2tncm91bmRfY29sb3IJPSBpbWFnZWNvbG9yYWxsb2NhdGUoJHRtcCwgMjU1LCAyNTUsIDI1NSk7DQoNCgkJCQkJCWltYWdlZmlsbCgkdG1wLCAwLCAwLCAkYmFja2dyb3VuZF9jb2xvcik7DQoJCQkJCQlpbWFnZWNvcHlyZXNhbXBsZWQoJHRtcCwgJHNyYywgMCwgMCwgMCwgMCwkbmV3X3dpZHRoLCAkbmV3X2hlaWdodCwgJGltYWdlLT53aWR0aCwgJGltYWdlLT5oZWlnaHQpOw0KCQkJCQkJaW1hZ2VqcGVnKCR0bXAsICRmdWxsUGF0aCwgMTAwKTsNCgkJCQkJCWltYWdlZGVzdHJveSgkc3JjKTsNCgkJCQkJCWltYWdlZGVzdHJveSgkdG1wKTsNCgkJCQkJfQ0KCQkJCQkvLyB3ZSBvbmx5IGNyb3AgaWYgYm90aCBoZWlnaHQgYW5kIHdpZHRoIGlzIHNldCB0byBjcm9wDQoJCQkJCWlmICgkaGVpZ2h0ICE9IDAgJiYgJHdpZHRoICE9IDApDQoJCQkJCXsNCgkJCQkJCS8vIGdldCB0aGUgY3VycmVudCBjb21wb25lbnQgY29kZSBuYW1lDQoJCQkJCQlpZiAoKCRjb21wb25lbnRfY29kZV9uYW1lID0gSGVscGVyOjpnZXRDb2RlKG51bGwsIGZhbHNlKSkgPT09IGZhbHNlKQ0KCQkJCQkJew0KCQkJCQkJCS8vIGlmIHdlIGNhbid0IGdldCB0aGUgY29tcG9uZW50IGNvZGUgbmFtZSB3ZSBzaG91bGQgYnJlYWsgcHV0IG5vdw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJCS8vIEluY2x1ZGUgd2lkZWltYWdlIC0gaHR0cDovL3dpZGVpbWFnZS5zb3VyY2Vmb3JnZS5uZXQgVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL3Ntb3R0dC9XaWRlSW1hZ2UNCgkJCQkJCXJlcXVpcmVfb25jZShKUEFUSF9BRE1JTklTVFJBVE9SIC4gJy9jb21wb25lbnRzL2NvbV8nIC4gJGNvbXBvbmVudF9jb2RlX25hbWUgLiAnL2hlbHBlcnMvd2lkZWltYWdlL1dpZGVJbWFnZS5waHAnKTsNCgkJCQkJCS8vIGxvYWQgdGhlIGltYWdlIGludG8gdGhlIGJ1aWxkZXINCgkJCQkJCSRidWlsZGVyID0gXFdpZGVJbWFnZTo6bG9hZCgkZnVsbFBhdGgpOw0KCQkJCQkJLy8gcmVzaXplIHRoZSBpbWFnZQ0KCQkJCQkJJHJlc2l6ZWQgPSAkYnVpbGRlci0+cmVzaXplKCR3aWR0aCwgJGhlaWdodCwgJ291dHNpZGUnKS0+Y3JvcCgnY2VudGVyJywgJ21pZGRsZScsICR3aWR0aCwgJGhlaWdodCk7DQoJCQkJCQkvLyBzYXZlIHRoZSBuZXcgaW1hZ2UgdG8gZnVsbCBmaWxlIHBhdGgNCgkJCQkJCSRyZXNpemVkLT5zYXZlVG9GaWxlKCRmdWxsUGF0aCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBJbWFnZSBQcm9wZXJ0aWVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgJGZ1bGxQYXRoICAgVGhlIGZ1bGwgcGF0aCB0byB0aGUgaW1hZ2UNCgkgKg0KCSAqIEByZXR1cm4gYm9vbHxzdGRDbGFzcw0KCSAqIEBzaW5jZSAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByb3BlcnRpZXMoJGZ1bGxQYXRoKQ0KCXsNCgkJLy8gY2hlY2sgdGhhdCB0aGUgZmlsZSBleGlzdA0KCQlpZiAoRmlsZTo6ZXhpc3RzKCRmdWxsUGF0aCkpDQoJCXsNCgkJCSRwcm9wZXJ0aWVzID0gSW1hZ2U6OmdldEltYWdlRmlsZVByb3BlcnRpZXMoJGZ1bGxQYXRoKTsNCgkJCS8vIGNoZWNrIGlmIHdlIGhhdmUgcHJvcGVydGllcw0KCQkJaWYgKE9iamVjdEhlbHBlcjo6Y2hlY2soJHByb3BlcnRpZXMpKQ0KCQkJew0KCQkJCS8vIGdldCBpbWFnZSBmaWxlIG5hbWUNCgkJCQkkbmFtZSA9IGJhc2VuYW1lKCRmdWxsUGF0aCk7DQoJCQkJLy8gcmVtb3ZlIGZpbGUgbmFtZSBmcm9tIHBhdGgNCgkJCQkkZGlyX25hbWUgPSBwYXRoaW5mbygkZnVsbFBhdGgsIFBBVEhJTkZPX0RJUk5BTUUpOw0KCQkJCS8vIHJlbW92ZSB0aGUgc2VydmVyIHBhdGgNCgkJCQkkaW1hZ2VfcHVibGljX3BhdGggPSB0cmltKHN0cl9yZXBsYWNlKEpQQVRIX1NJVEUsICcnLCAkZGlyX25hbWUpLCAnLycpIC4gJy8nIC4gJG5hbWU7DQoJCQkJLy8gbm93IGFkZCB0aGUgc3JjIHBhdGggdG8gc2hvdyB0aGUgaW1hZ2UNCgkJCQkkcHJvcGVydGllcy0+c3JjID0gVXJpOjpyb290KCkgLiAkaW1hZ2VfcHVibGljX3BhdGg7DQoJCQkJLy8gcmV0dXJuIHRoZSBpbWFnZSBwcm9wZXJ0aWVzDQoJCQkJcmV0dXJuICRwcm9wZXJ0aWVzOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQo=', '{}', 'ImageHelper', 'VDM\\Joomla\\Utilities.ImageHelper', '1.0.0', '{}', 'Utilities ImageHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-05-16 10:59:17', '2022-09-20 09:51:10', 21, 9), (25, 1, 'Upload Helper\r\n\r\n@since 3.0.11', '', '', 'd7600b43-771a-4747-9f5d-952765721799', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTsNCnVzZSBKb29tbGFcQ01TXExhbmd1YWdlXFRleHQ7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZpbGU7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZvbGRlcjsNCnVzZSBKb29tbGFcQ01TXEZpbGVzeXN0ZW1cUGF0aDs=', '', '', '{\"load_selection0\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIFRydWUgdG8gdXNlIHN0cmVhbXMNCgkgKg0KCSAqIEB2YXIgICAgYm9vbA0KCSAqDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljICR1c2VTdHJlYW1zID0gZmFsc2U7DQoNCgkvKioNCgkgKiBBbGxvdyB0aGUgdXBsb2FkIG9mIHVuc2FmZSBmaWxlcw0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJGFsbG93VW5zYWZlID0gZmFsc2U7DQoNCgkvKioNCgkgKiBPcHRpb25zIHRvIElucHV0RmlsdGVyOjppc1NhZmVGaWxlDQoJICoNCgkgKiBAdmFyICAgIGFycmF5DQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJHNhZmVGaWxlT3B0aW9ucyA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBTZXQgdGhlIGVycm9yIGJlaGF2aW9yDQoJICoNCgkgKiBAdmFyICAgIGJvb2wNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyAkZW5xdWV1ZUVycm9yID0gdHJ1ZTsNCg0KCS8qKg0KCSAqIEVycm9ycw0KCSAqDQoJICogQHZhciAgICBhcnJheQ0KCSAqDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRlcnJvcnMgPSBhcnJheSgpOw0KDQoJLyoqDQoJICogR2V0IGZpbGUvZmlsZXMgZnJvbSBhIEhUVFAgdXBsb2FkLg0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJGZpZWxkICAgICAgICBUaGUgaW5wdXQgZmllbGQgbmFtZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICR0eXBlICAgICAgICBUaGUgZmlsZSB0eXBlDQoJICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRmaWx0ZXIgICAgICAgIFRoZSBmaWx0ZXIgdG8gdXNlIHdoZW4gdXBsb2FkaW5nIHRoZSBmaWxlDQoJICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRwYXRoICAgICAgICBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbWFnZSBtdXN0IGJlIHBsYWNlZA0KCSAqDQoJICogQHJldHVybiAgbWl4ZWQgICBGaWxlIGRldGFpbHMgb3IgZmFsc2Ugb24gZmFpbHVyZS4NCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkZmllbGQsIHN0cmluZyAkdHlwZSwgc3RyaW5nICRmaWx0ZXIgPSBudWxsLCBzdHJpbmcgJHBhdGggPSBudWxsKQ0KCXsNCgkJLy8gR2V0IHRoZSB1cGxvYWRlZCBmaWxlIGluZm9ybWF0aW9uLg0KCQkkaW5wdXQgICAgPSBGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpLT5pbnB1dDsNCg0KCQkvLyBzZXQgdGhlIGRlZmF1bHQgZmlsdGVyDQoJCWlmIChlbXB0eSgkZmlsdGVyKSkNCgkJew0KCQkJJGZpbHRlciA9ICdhcnJheSc7DQoJCX0NCgkJLy8gaWYgcmF3IHRoZW4gYWxzbyB1bnNhZmUNCgkJLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vam9vbWxhL2pvb21sYS1jbXMvYmxvYi80LjEtZGV2L2FkbWluaXN0cmF0b3IvY29tcG9uZW50cy9jb21faW5zdGFsbGVyL3NyYy9Nb2RlbC9JbnN0YWxsTW9kZWwucGhwI0wyNTkNCgkJZWxzZWlmICgkZmlsdGVyID09PSAncmF3JykNCgkJew0KCQkJc2VsZjo6JGFsbG93VW5zYWZlID0gdHJ1ZTsNCgkJfQ0KDQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBmaWxlIGRlc3RpbmF0aW9uIG5hbWUgaW4gdGhlIGZpZWxkIG5hbWUNCgkJJG5hbWUgPSBudWxsOw0KCQlpZiAoc3RycG9zKCRmaWVsZCwgJzonKSAhPT0gZmFsc2UpDQoJCXsNCgkJCWxpc3QoJGZpZWxkLCAkbmFtZSkgPSBleHBsb2RlKCc6JywgJGZpZWxkKTsNCgkJfQ0KDQoJCS8vIFNlZSBKSW5wdXRGaWxlczo6Z2V0Lg0KCQkkdXNlcmZpbGUgPSAkaW5wdXQtPmZpbGVzLT5nZXQoJGZpZWxkLCBudWxsLCAkZmlsdGVyKTsNCg0KCQkvLyBNYWtlIHN1cmUgdGhhdCBmaWxlIHVwbG9hZHMgYXJlIGVuYWJsZWQgaW4gcGhwLg0KCQlpZiAoIShib29sKSBpbmlfZ2V0KCdmaWxlX3VwbG9hZHMnKSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnV2FybmluZywgdXBsb2FkIGVycm9yLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gSWYgdGhlcmUgaXMgbm8gdXBsb2FkZWQgZmlsZSwgd2UgaGF2ZSBhIHByb2JsZW0uLi4NCgkJaWYgKCFpc19hcnJheSgkdXNlcmZpbGUpKQ0KCQl7DQoJCQlzZWxmOjpzZXRFcnJvcihUZXh0OjpfKCdObyB1cGxvYWQgc2VsZWN0ZWQnKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIElzIHRoZSBQSFAgdG1wIGRpcmVjdG9yeSBtaXNzaW5nPw0KCQlpZiAoJHVzZXJmaWxlWydlcnJvciddICYmICgkdXNlcmZpbGVbJ2Vycm9yJ10gPT0gVVBMT0FEX0VSUl9OT19UTVBfRElSKSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnVGhlcmUgd2FzIGFuIGVycm9yIHVwbG9hZGluZyB0byB0aGUgc2VydmVyLicpIC4gJzxicj4nIC4gVGV4dDo6XygnVGhlIFBIUCB0ZW1wb3JhcnkgZm9sZGVyIGlzIG5vdCBzZXQuJykpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvLyBJcyB0aGUgbWF4IHVwbG9hZCBzaXplIHRvbyBzbWFsbCBpbiBwaHAuaW5pPw0KCQlpZiAoJHVzZXJmaWxlWydlcnJvciddICYmICgkdXNlcmZpbGVbJ2Vycm9yJ10gPT0gVVBMT0FEX0VSUl9JTklfU0laRSkpDQoJCXsNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGxvYWRpbmcgdG8gdGhlIHNlcnZlci4nKSAuICc8YnI+JyAuIFRleHQ6Ol8oJ1lvdXIgZmlsZSB3YXMgaXMgbGFyZ2VyIHRoYW4gdGhlIGFsbG93ZWQgc2l6ZS4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIGRpZmZlcmVudCBwcm9ibGVtIHVwbG9hZGluZyB0aGUgZmlsZS4NCgkJaWYgKCR1c2VyZmlsZVsnZXJyb3InXSB8fCAkdXNlcmZpbGVbJ3NpemUnXSA8IDEpDQoJCXsNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGxvYWRpbmcgdG8gdGhlIHNlcnZlci4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIGNoZWNrIGlmIGEgcGF0aCB3YXMgcGFzc2VkIGFuZCBleGlzdA0KCQlpZiAoaXNfc3RyaW5nKCRwYXRoKSAmJiBGb2xkZXI6OmNyZWF0ZSgkcGF0aCkpDQoJCXsNCgkJCS8vIHNldCB0aGUgcGF0aA0KCQkJJHVzZXJmaWxlWydwYXRoJ10gPSAkcGF0aDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIGdldCB0aGUgSm9vbWxhIGNvbmZpZyBjbGFzcw0KCQkJJGNvbmZpZyA9IEZhY3Rvcnk6OmdldENvbmZpZygpOw0KCQkJLy8gc2V0IHRoZSBwYXRoDQoJCQkkdXNlcmZpbGVbJ3BhdGgnXSA9ICRjb25maWctPmdldCgndG1wX3BhdGgnKTsNCgkJfQ0KDQoJCS8vIHNldCB0aGUgcmFuZG9tIHBhcnQgb2YgdGhlIG5hbWUNCgkJJHVzZXJmaWxlWydyYW5kb20nXSA9IFN0cmluZ0hlbHBlcjo6cmFuZG9tKDEyKTsNCg0KCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQlpZiAoZW1wdHkoJG5hbWUpKQ0KCQl7DQoJCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQkJJHVzZXJmaWxlWydmaWxlX25hbWUnXSA9ICR1c2VyZmlsZVsncmFuZG9tJ10gLiAkdXNlcmZpbGVbJ25hbWUnXTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIGNoZWNrIHRoYXQgaGlzIG5hbWUgaGFzIGZpbGUgZm9ybWF0DQoJCQlpZiAoaXNfc3RyaW5nKCRuYW1lKSAmJiBzdHJwb3MoJG5hbWUsICcuJykgPT09IGZhbHNlKQ0KCQkJew0KCQkJCSRuYW1lID0gJG5hbWUgLiAnLicgLiBNaW1lSGVscGVyOjpleHRlbnNpb24obnVsbCwgJHVzZXJmaWxlWyd0eXBlJ10pOw0KCQkJfQ0KCQkJJHVzZXJmaWxlWydmaWxlX25hbWUnXSA9ICRuYW1lOw0KCQl9DQoNCgkJLy8gc2V0IGZ1bGwgcGF0aA0KCQkkdXNlcmZpbGVbJ2Z1bGxfcGF0aCddID0gJHVzZXJmaWxlWydwYXRoJ10gLiAnLycgLiAkdXNlcmZpbGVbJ2ZpbGVfbmFtZSddOw0KDQoJCS8vIFVwbG9hZCB0aGUgZmlsZS4NCgkJaWYgKEZpbGU6OnVwbG9hZCgkdXNlcmZpbGVbJ3RtcF9uYW1lJ10sICR1c2VyZmlsZVsnZnVsbF9wYXRoJ10sIHNlbGY6OiR1c2VTdHJlYW1zLCBzZWxmOjokYWxsb3dVbnNhZmUpKQ0KCQl7DQoJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgYSB2YWxpZCBmaWxlDQoJCQlyZXR1cm4gc2VsZjo6Y2hlY2soJHVzZXJmaWxlLCAkdHlwZSk7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCB0aGUgZXJyb3JzDQoJICoNCgkgKiBAcGFyYW0gIGJvb2wgICAgICAgICAkdG9TdHJpbmcgICAgICBUaGUgb3B0aW9uIHRvIHJldHVybiBlcnJvcnMgYXMgYSBzdHJpbmcNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5DQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEVycm9yKCR0b1N0cmluZyA9IGZhbHNlKQ0KCXsNCgkJaWYgKCR0b1N0cmluZykNCgkJew0KCQkJcmV0dXJuIGltcGxvZGUoJyAnIC4gUEhQX0VPTCwgc2VsZjo6JGVycm9ycyk7DQoJCX0NCgkJcmV0dXJuIHNlbGY6OiRlcnJvcnM7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgYSBmaWxlIGFuZCB2ZXJpZmllcyBpdCBhcyBhIGFsbG93ZWQgZmlsZSBmb3JtYXQgZmlsZQ0KCSAqDQoJICogQHBhcmFtICBhcnJheSAgICAgICAgICR1cGxvYWQgICAgICBUaGUgdXBsb2FkZWQgZGV0YWlscyBhcnJheQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkdHlwZSAgICAgICAgICBUaGUgZmlsZSB0eXBlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheSAgb2YgZWxlbWVudHMNCgkgKg0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY2hlY2soYXJyYXkgJHVwbG9hZCwgc3RyaW5nICR0eXBlKQ0KCXsNCgkJLy8gRGVmYXVsdCBmb3JtYXRzDQoJCSRmb3JtYXRzID0gTWltZUhlbHBlcjo6ZXh0ZW5zaW9ucygkdHlwZSk7DQoNCgkJLy8gQ2xlYW4gdGhlIHBhdGgNCgkJJHVwbG9hZF9wYXRoID0gUGF0aDo6Y2xlYW4oJHVwbG9hZFsnZnVsbF9wYXRoJ10pOw0KDQoJCS8vIEdldCBmaWxlIGV4dGVuc2lvbi9mb3JtYXQNCgkJJGZvcm1hdCA9IE1pbWVIZWxwZXI6OmV4dGVuc2lvbigkdXBsb2FkX3BhdGgpOw0KDQoJCS8vIExlZ2FsIGZpbGUgZm9ybWF0cw0KCQkkbGVnYWwgPSBhcnJheSgpOw0KDQoJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGZvcm1hdCBpcyBldmVuIGluIHRoZSBsaXN0DQoJCWlmIChpbl9hcnJheSgkZm9ybWF0LCAkZm9ybWF0cykpDQoJCXsNCgkJCS8vIGdldCBhbGxvd2VkIGZvcm1hdHMNCgkJCSRsZWdhbCA9IChhcnJheSkgSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0eXBlIC4gJ19mb3JtYXRzJywgYXJyYXkoKSk7DQoJCX0NCg0KCQkvLyBjaGVjayB0aGUgZXh0ZW5zaW9uDQoJCWlmICghaW5fYXJyYXkoJGZvcm1hdCwgJGxlZ2FsKSkNCgkJew0KCQkJLy8gQ2xlYW51cCB0aGUgaW1wb3J0IGZpbGUNCgkJCXNlbGY6OnJlbW92ZSgkdXBsb2FkWydmdWxsX3BhdGgnXSk7DQoNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1VwbG9hZCBpcyBub3QgYSB2YWxpZCB0eXBlLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJcmV0dXJuICR1cGxvYWQ7DQoJfQ0KDQoJLyoqDQoJICogQ2xlYW4gdXAgdGVtcG9yYXJ5IHVwbG9hZGVkIGZpbGUNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGZ1bGxQYXRoICAgIFRoZSBmdWxsIHBhdGggb2YgdGhlIHVwbG9hZGVkIGZpbGUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2xlYW4gIFRydWUgb24gc3VjY2Vzcw0KCSAqDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiByZW1vdmUoJGZ1bGxQYXRoKQ0KCXsNCgkJLy8gSXMgdGhlIHBhY2thZ2UgZmlsZSBhIHZhbGlkIGZpbGU/DQoJCWlmIChpc19maWxlKCRmdWxsUGF0aCkpDQoJCXsNCgkJCUZpbGU6OmRlbGV0ZSgkZnVsbFBhdGgpOw0KCQl9DQoJCWVsc2VpZiAoaXNfZmlsZShQYXRoOjpjbGVhbigkZnVsbFBhdGgpKSkNCgkJew0KCQkJLy8gSXQgbWlnaHQgYWxzbyBiZSBqdXN0IGEgYmFzZSBmaWxlbmFtZQ0KCQkJRmlsZTo6ZGVsZXRlKFBhdGg6OmNsZWFuKCRmdWxsUGF0aCkpOw0KCQl9DQoJfQ0KDQoJLyoqDQoJICogU2V0IHRoZSBlcnJvcnMNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkbWVzc2FnZSAgIFRoZSBlcnJvciBtZXNzYWdlDQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHNldEVycm9yKCRtZXNzYWdlKQ0KCXsNCgkJaWYgKHNlbGY6OiRlbnF1ZXVlRXJyb3IpDQoJCXsNCgkJCUZhY3Rvcnk6OmdldEFwcGxpY2F0aW9uKCktPmVucXVldWVNZXNzYWdlKCRtZXNzYWdlLCAnZXJyb3InKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXNlbGY6OiRlcnJvcnNbXSA9ICRtZXNzYWdlOw0KCQl9DQoJfQ0K', '{}', 'UploadHelper', 'VDM\\Joomla\\Utilities.UploadHelper', '1.0.0', '{}', 'Utilities UploadHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-05-16 13:20:50', '2022-09-20 10:10:51', 37, 9), (26, '', 'Mime Helper\r\n\r\n@since 3.0.11', '', '', 'f11dc790-713e-4706-9a85-a318ed3ad56e', '', '', '', '{}', 'W0VYVEVSTkFMQ09ERT1odHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xsZXdlbGx5bnZkbS83NGJlMzczMzU3ZTEzMWI4Nzc1YTc1ODJjM2RlNTA4Yi9yYXcvbWltZV90eXBlcy5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2dldC5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2V4dGVuc2lvbnMucGhwXQ==', '{}', 'MimeHelper', 'VDM\\Joomla\\Utilities.MimeHelper', '1.0.0', '{}', 'Utilities MimeHelper', 'abstract class', '{}', '', 1, '2022-05-16 14:27:38', '2022-09-20 09:51:01', 6, 9), diff --git a/componentbuilder.xml b/componentbuilder.xml index 890501578..a2bf0cca9 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,7 +1,7 @@ COM_COMPONENTBUILDER - 20th November, 2022 + 27th November, 2022 Llewellyn van der Merwe joomla@vdm.io https://dev.vdm.io diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/Database.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/Database.php new file mode 100644 index 000000000..cb2588f12 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/Database.php @@ -0,0 +1,108 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Abstraction; + + +use Joomla\CMS\Factory as JoomlaFactory; +use VDM\Joomla\Utilities\Component\Helper; + + +/** + * Database + * + * @since 3.2.0 + */ +abstract class Database +{ + /** + * Database object to query local DB + * + * @var \JDatabaseDriver + * @since 3.2.0 + */ + protected \JDatabaseDriver $db; + + /** + * Core Component Table Name + * + * @var string + * @since 3.2.0 + */ + protected string $table; + + /** + * Constructor + * + * @param \JDatabaseDriver|null $db The database driver + * + * @throws \Exception + * @since 3.2.0 + */ + public function __construct(?\JDatabaseDriver $db = null) + { + $this->db = $db ?: JoomlaFactory::getDbo(); + + // set the component table + $this->table = '#__' . Helper::getCode(); + } + + /** + * Set a value based on data type + * + * @param mixed $value The value to set + * + * @return mixed + * @since 3.2.0 + **/ + protected function quote($value) + { + if (is_numeric($value)) + { + if (filter_var($value, FILTER_VALIDATE_INT)) + { + return (int) $value; + } + elseif (filter_var($value, FILTER_VALIDATE_FLOAT)) + { + return (float) $value; + } + } + elseif (is_bool($value)) + { + return (int) $value; + } + + // default just escape it + return $this->db->quote($value); + } + + /** + * Set a table name, adding the + * core component as needed + * + * @param string $table The table string + * + * @return string + * @since 3.2.0 + **/ + protected function getTable(string $table): string + { + if (strpos($table, '#__') === false) + { + return $this->table . '_' . $table; + } + + return $table; + } + +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php index eb7a0ceff..eef69a8a3 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php @@ -23,7 +23,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Service\Power; use VDM\Joomla\Componentbuilder\Compiler\Service\Component; use VDM\Joomla\Componentbuilder\Compiler\Service\Extension; use VDM\Joomla\Componentbuilder\Compiler\Service\Field; -use VDM\Joomla\Componentbuilder\Interfaces\Factoryinterface; +use VDM\Joomla\Componentbuilder\Interfaces\FactoryInterface; /** @@ -31,7 +31,7 @@ use VDM\Joomla\Componentbuilder\Interfaces\Factoryinterface; * * @since 3.2.0 */ -abstract class Factory implements Factoryinterface +abstract class Factory implements FactoryInterface { /** * Global Compiler Container @@ -81,7 +81,7 @@ abstract class Factory implements Factoryinterface } /** - * Get a the global compiler container + * Get the global compiler container * * @return Container * @since 3.2.0 diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Field/Data.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Field/Data.php index 94b703647..f2f170f03 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Field/Data.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Field/Data.php @@ -272,7 +272,7 @@ class Data ) ); } - // set the field modeling + // set the field modelling $field->model_field['save'] = explode( PHP_EOL, $this->placeholder->update( $this->customcode->update( diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Insert.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Insert.php new file mode 100644 index 000000000..73a8f9cae --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Insert.php @@ -0,0 +1,306 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Database; + + +use Joomla\CMS\Date\Date; +use VDM\Joomla\Utilities\ArrayHelper; +use VDM\Joomla\Componentbuilder\Interfaces\InsertInterface; +use VDM\Joomla\Componentbuilder\Abstraction\Database; + + +/** + * Database Insert Class + * + * @since 3.2.0 + */ +class Insert extends Database implements InsertInterface +{ + /** + * Switch to set the defaults + * + * @var bool + * @since 1.2.0 + **/ + public bool $defaults = true; + + /** + * Set rows to the database + * + * @param array $data Dataset to store in database [array of arrays (key => value)] + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function rows(array $data, string $table): bool + { + // get a query object + $query = $this->db->getQuery(true); + + // get the first row + $row = array_values($data)[0]; + + // set the insert columns + if (!ArrayHelper::check($row)) + { + return false; + } + + $columns = array_keys($row); + + // set joomla default columns + $add_created = false; + $add_version = false; + $add_published = false; + + // check if we should load the defaults + if ($this->defaults) + { + // get the date + $date = (new Date())->toSql(); + + if (!in_array('created', $columns)) + { + $columns[] = 'created'; + $add_created = true; + } + if (!in_array('version', $columns)) + { + $columns[] = 'version'; + $add_version = true; + } + if (!in_array('published', $columns)) + { + $columns[] = 'published'; + $add_published = true; + } + } + + // set the query targets + $query->insert($this->db->quoteName($table))->columns($this->db->quoteName($columns)); + + // limiting factor on the amount of rows to insert before we reset the query + $limit = 300; + + // set the insert values + foreach ($data as $set) + { + // check the limit + if ($limit <= 1) + { + // execute and reset the query + $this->db->setQuery($query); + $this->db->execute(); + + // reset limit + $limit = 300; + + // get a query object + $query = $this->db->getQuery(true); + + // set the query targets + $query->insert($this->db->quoteName($table))->columns($this->db->quoteName($columns)); + } + + $row = []; + foreach ($set as $value) + { + $row[] = $this->quote($value); + } + + // set joomla default columns + if ($add_created) + { + $row[] = $this->db->quote($date); + } + if ($add_version) + { + $row[] = 1; + } + if ($add_published) + { + $row[] = 1; + } + + // add to query + $query->values(implode(',', $row)); + + // decrement the limiter + $limit--; + } + + // execute the final query + $this->db->setQuery($query); + $this->db->execute(); + + // always reset the default switch + $this->defaults = true; + + return true; + } + + /** + * Set items to the database + * + * @param array $data Data to store in database (array of objects) + * @param array $columns Data columns + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function items(array $data, array $columns, string $table): bool + { + // get a query object + $query = $this->db->getQuery(true); + + // set the query targets + $query->insert($this->db->quoteName($table))->columns($this->db->quoteName(array_keys($columns))); + + // limiting factor on the amount of rows to insert before we reset the query + $limit = 400; + + // set the insert values + foreach ($data as $nr => $value) + { + // check the limit + if ($limit <= 1) + { + // execute and reset the query + $this->db->setQuery($query); + $this->db->execute(); + + // reset limit + $limit = 400; + + // get a query object + $query = $this->db->getQuery(true); + + // set the query targets + $query->insert($this->db->quoteName($table))->columns($this->db->quoteName(array_keys($columns))); + } + + $row = []; + // load only what is part of the columns set + foreach ($columns as $key) + { + if (isset($value->{$key})) + { + $row[] = $this->quote($value->{$key}); + } + else + { + $row[] = ''; + } + } + + // add to query + $query->values(implode(',', $row)); + + // decrement the limiter + $limit--; + + // clear the data from memory + unset($data[$nr]); + } + + // execute the final query + $this->db->setQuery($query); + $this->db->execute(); + + return true; + } + + /** + * Set row to the database + * + * @param array $data Dataset to store in database (key => value) + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function row(array $data, string $table): bool + { + // get a query object + $query = $this->db->getQuery(true); + + $columns = array_keys($data); + + // set joomla default columns + $add_created = false; + $add_version = false; + $add_published = false; + + // check if we should load the defaults + if ($this->defaults) + { + // get the date + $date = (new Date())->toSql(); + + if (!in_array('created', $columns)) + { + $columns[] = 'created'; + $add_created = true; + } + if (!in_array('version', $columns)) + { + $columns[] = 'version'; + $add_version = true; + } + if (!in_array('published', $columns)) + { + $columns[] = 'published'; + $add_published = true; + } + } + + // set the query targets + $query->insert($this->db->quoteName($table))->columns($this->db->quoteName($columns)); + + // set the insert values + $row = []; + foreach ($data as $value) + { + $row[] = $this->quote($value); + } + + // set joomla default columns + if ($add_created) + { + $row[] = $this->db->quote($date); + } + if ($add_version) + { + $row[] = 1; + } + if ($add_published) + { + $row[] = 1; + } + + // add to query + $query->values(implode(',', $row)); + + // execute the final query + $this->db->setQuery($query); + $this->db->execute(); + + // always reset the default switch + $this->defaults = true; + + return true; + } + +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Load.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Load.php new file mode 100644 index 000000000..fe83d8b91 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/Load.php @@ -0,0 +1,380 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Database; + + +use VDM\Joomla\Utilities\ArrayHelper; +use VDM\Joomla\Componentbuilder\Interfaces\LoadInterface; +use VDM\Joomla\Componentbuilder\Abstraction\Database; + + +/** + * Database Load + * + * @since 3.2.0 + */ +class Load extends Database implements LoadInterface +{ + /** + * Load data rows as an array of associated arrays + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return array|null + * @since 3.2.0 + **/ + public function rows(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): ?array + { + // set key if found + $key = ''; + if (isset($select['key'])) + { + if (is_string($select['key'])) + { + $key = $select['key']; + } + unset($select['key']); + } + + // check if we can get many rows + if ($this->many($select, $tables, $where, $order, $limit)) + { + // return associated arrays from the table records + return $this->db->loadAssocList($key); + } + + // data does not exist + return null; + } + + /** + * Load data rows as an array of objects + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return array|null + * @since 3.2.0 + **/ + public function items(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): ?array + { + // set key if found + $key = ''; + if (isset($select['key'])) + { + if (is_string($select['key'])) + { + $key = $select['key']; + } + unset($select['key']); + } + + // check if we can get many rows + if ($this->many($select, $tables, $where, $order, $limit)) + { + // return associated arrays from the table records + return $this->db->loadObjectList($key); + } + + // data does not exist + return null; + } + + /** + * Load data row as an associated array + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return array|null + * @since 3.2.0 + **/ + public function row(array $select, array $tables, ?array $where = null, ?array $order = null): ?array + { + // check if we can get one row + if ($this->one($select, $tables, $where, $order)) + { + return $this->db->loadAssoc(); + } + + // data does not exist + return null; + } + + /** + * Load data row as an object + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return object|null + * @since 3.2.0 + **/ + public function item(array $select, array $tables, ?array $where = null, ?array $order = null): ?object + { + // check if we can get one row + if ($this->one($select, $tables, $where, $order)) + { + return $this->db->loadObject(); + } + + // data does not exist + return null; + } + + /** + * Load one value from a row + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return mixed + * @since 3.2.0 + **/ + public function value(array $select, array $tables, ?array $where = null, ?array $order = null) + { + // check if we can get one value + if ($this->one($select, $tables, $where, $order)) + { + return $this->db->loadResult(); + } + + // data does not exist + return null; + } + + /** + * Load many + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return bool + * @since 3.2.0 + **/ + protected function many(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): bool + { + // only do check if we have the table set + if (isset($tables['a'])) + { + // get the query + $query = $this->query($select, $tables, $where, $order); + + // Load the items + $this->db->setQuery($query); + $this->db->execute(); + + // check if we have values + if ($this->db->getNumRows()) + { + return true; + } + } + + // data does not exist + return false; + } + + /** + * Load one + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return bool + * @since 3.2.0 + **/ + protected function one(array $select, array $tables, ?array $where = null, ?array $order = null): bool + { + // only do check if we have the table set + if (isset($tables['a'])) + { + // get the query + $query = $this->query($select, $tables, $where, $order); + + // Load the item + $this->db->setQuery($query, 0, 1); + $this->db->execute(); + + // check if we have values + if ($this->db->getNumRows()) + { + return true; + } + } + + // data does not exist + return false; + } + + /** + * Get the query object + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return object|null The query object (DatabaseQuery) + * @since 3.2.0 + **/ + protected function query(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): ?object + { + $query = $this->db->getQuery(true); + + // check if we have an all selection set + if (isset($select['all'])) + { + // all selection example array: ['all' => ['a.*', 'b.*']] + if (ArrayHelper::check($select['all'])) + { + foreach ($select['all'] as $select_all) + { + // set target selection + $query->select( + $select_all + ); + } + } + // all selection example string: ['all' =>'a.*'] + elseif (is_string($select['all'])) + { + // set target selection + $query->select( + $select['all'] + ); + } + unset($select['all']); + } + + // load the table where join + if (ArrayHelper::check($select)) + { + // set target selection + $query->select( + $this->db->quoteName( + array_keys($select), + array_values($select) + ) + ); + } + + // set main table + $query->from($this->db->quoteName($this->getTable($tables['a']), 'a')); + + // remove main table + unset($tables['a']); + + // load the table where join + if (ArrayHelper::check($tables)) + { + foreach ($tables as $as => $table) + { + $query->join( + 'LEFT', $this->db->quoteName( + $this->getTable($table['name']), $as + ) . ' ON (' . $this->db->quoteName($table['join_on']) + . ' = ' . $this->db->quoteName($table['as_on']) . ')' + ); + } + } + + // load the table where getters + if (ArrayHelper::check($where)) + { + foreach ($where as $key => $value) + { + if (ArrayHelper::check($value)) + { + if (isset($value['value']) && isset($value['operator'])) + { + if (ArrayHelper::check($value['value'])) + { + // add the where by array + $query->where($this->db->quoteName($key) . ' ' . + $value['operator'] . ' (' . + implode(',', + array_map(function ($val) { + return $this->quote($val); + }, $value['value']) + ) + . ')' + ); + } + else + { + // add the where + $query->where($this->db->quoteName($key) . ' ' . + $value['operator'] . ' ' . $this->quote($value['value'])); + } + } + else + { + // we should through an exception + // for security we just return nothing for now + return null; + } + } + else + { + // add the where + $query->where($this->db->quoteName($key) . + ' = ' . $this->quote($value)); + } + } + } + + // load the row ordering + if (ArrayHelper::check($order)) + { + foreach ($order as $key => $direction) + { + // add the ordering + $query->order($this->db->quoteName($key) . + ' ' . $direction); + } + } + + // only return a limited number + if (is_numeric($limit)) + { + $query->setLimit($limit); + } + + return $query; + } + +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/index.html b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/index.html new file mode 100644 index 000000000..fa6d84e80 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Database/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Factoryinterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/FactoryInterface.php similarity index 82% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Factoryinterface.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/FactoryInterface.php index ae9bc0ab1..2ea589c1a 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Factoryinterface.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/FactoryInterface.php @@ -16,12 +16,12 @@ use Joomla\DI\Container; /** - * The Basic Factory Interface + * The Container Factory Interface */ -interface Factoryinterface +interface FactoryInterface { /** - * Get any class from the compiler container + * Get any class from the container * * @param string $key The container class key * @@ -31,7 +31,7 @@ interface Factoryinterface public static function _(string $key); /** - * Get a the global compiler container + * Get the global container * * @return Container * @since 3.2.0 diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/InsertInterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/InsertInterface.php new file mode 100644 index 000000000..dc05284ca --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/InsertInterface.php @@ -0,0 +1,57 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Interfaces; + + +/** + * Database Insert Interface + * + * @since 3.2.0 + */ +interface InsertInterface +{ + /** + * Set rows to the database + * + * @param array $data Dataset to store in database [array of arrays (key => value)] + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function rows(array $data, string $table): bool; + + /** + * Set items to the database + * + * @param array $data Data to store in database (array of objects) + * @param array $columns Data columns + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function items(array $data, array $columns, string $table): bool; + + /** + * Set row to the database + * + * @param array $data Dataset to store in database (key => value) + * @param string $table The table where the data is being added + * + * @return bool + * @since 3.2.0 + **/ + public function row(array $data, string $table): bool; + +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/LoadInterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/LoadInterface.php new file mode 100644 index 000000000..4da8975ea --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/LoadInterface.php @@ -0,0 +1,92 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Interfaces; + + +/** + * Database Load Interface + * + * @since 3.2.0 + */ +interface LoadInterface +{ + /** + * Load data rows as an array of associated arrays + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return array|null + * @since 3.2.0 + **/ + public function rows(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): ?array; + + /** + * Load data rows as an array of objects + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * @param int|null $limit Limit the number of values returned + * + * @return array|null + * @since 3.2.0 + **/ + public function items(array $select, array $tables, ?array $where = null, + ?array $order = null, ?int $limit = null): ?array; + + /** + * Load data row as an associated array + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return array|null + * @since 3.2.0 + **/ + public function row(array $select, array $tables, ?array $where = null, ?array $order = null): ?array; + + /** + * Load data row as an object + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return object|null + * @since 3.2.0 + **/ + public function item(array $select, array $tables, ?array $where = null, ?array $order = null): ?object; + + /** + * Load one value from a row + * + * @param array $select Array of selection keys + * @param array $tables Array of tables to search + * @param array|null $where Array of where key=>value match exist + * @param array|null $order Array of how to order the data + * + * @return mixed + * @since 3.2.0 + **/ + public function value(array $select, array $tables, ?array $where = null, ?array $order = null); + +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Tableinterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Tableinterface.php index 8acb8b163..c4e344404 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Tableinterface.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Interfaces/Tableinterface.php @@ -13,7 +13,7 @@ namespace VDM\Joomla\Componentbuilder\Interfaces; /** - * The Table Interface + * The Core JCB Table Interface */ interface Tableinterface { diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Agent.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Agent.php index 6eebb94e3..6a8865955 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Agent.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Agent.php @@ -15,8 +15,8 @@ namespace VDM\Joomla\Componentbuilder\Search; use Joomla\CMS\Language\Text; use VDM\Joomla\Componentbuilder\Search\Factory; use VDM\Joomla\Componentbuilder\Search\Config; -use VDM\Joomla\Componentbuilder\Search\Database\Get; -use VDM\Joomla\Componentbuilder\Search\Database\Set; +use VDM\Joomla\Componentbuilder\Search\Database\Load; +use VDM\Joomla\Componentbuilder\Search\Database\Insert; use VDM\Joomla\Componentbuilder\Search\Agent\Find; use VDM\Joomla\Componentbuilder\Search\Agent\Replace; use VDM\Joomla\Componentbuilder\Search\Agent\Search; @@ -40,20 +40,20 @@ class Agent protected Config $config; /** - * Search Get Database + * Search Load Database * - * @var Get + * @var Load * @since 3.2.0 */ - protected Get $get; + protected Load $load; /** - * Search Set Database + * Search Insert Database * - * @var Set + * @var Insert * @since 3.2.0 */ - protected Set $set; + protected Insert $insert; /** * Search Find @@ -123,8 +123,8 @@ class Agent * Constructor * * @param Config|null $config The search config object. - * @param Get|null $get The search get database object. - * @param Set|null $set The search get database object. + * @param Load|null $load The search load database object. + * @param Insert|null $insert The search insert database object. * @param Find|null $find The search find object. * @param Replace|null $replace The search replace object. * @param Search|null $search The search object. @@ -133,13 +133,13 @@ class Agent * * @since 3.2.0 */ - public function __construct(?Config $config = null, ?Get $get = null, - ?Set$set = null, ?Find $find = null, ?Replace $replace = null, + public function __construct(?Config $config = null, ?Load $load = null, + ?Insert $insert = null, ?Find $find = null, ?Replace $replace = null, ?Search $search = null, ?Update $update = null, ?Table $table = null) { $this->config = $config ?: Factory::_('Config'); - $this->get = $get ?: Factory::_('Get.Database'); - $this->set = $set ?: Factory::_('Set.Database'); + $this->load = $load ?: Factory::_('Load.Database'); + $this->insert = $insert ?: Factory::_('Insert.Database'); $this->find = $find ?: Factory::_('Agent.Find'); $this->replace = $replace ?: Factory::_('Agent.Replace'); $this->search = $search ?: Factory::_('Agent.Search'); @@ -156,11 +156,11 @@ class Agent * @param string|null $table The table * @param bool $update The switch to triger an update (default is false) * - * @return string + * @return string|null * @since 3.2.0 */ public function getValue(int $id, string $field, $line = null, - ?string $table = null, bool $update = false): string + ?string $table = null, bool $update = false): ?string { // set the table name if (empty($table)) @@ -168,7 +168,7 @@ class Agent $table = $this->config->table_name; } - if (($value = $this->get->value($id, $field, $table)) !== null) + if (($value = $this->load->value($id, $field, $table)) !== null) { // we only return strings that can load in an editor if (is_string($value)) @@ -207,7 +207,7 @@ class Agent $table = $this->config->table_name; } - return $this->set->value($value, $id, $field, $table); + return $this->insert->value($value, $id, $field, $table); } /** @@ -271,7 +271,7 @@ class Agent $set = 1; // continue loading items until all are searched - while(($items = $this->get->items($table, $set)) !== null) + while(($items = $this->load->items($table, $set)) !== null) { $this->find->items($items, $table); $set++; @@ -300,7 +300,7 @@ class Agent $replaced = 0; // continue loading items until all was loaded - while(($items = $this->get->items($table, $set)) !== null) + while(($items = $this->load->items($table, $set)) !== null) { // search for items $this->find->items($items, $table); @@ -309,7 +309,7 @@ class Agent $this->replace->items($this->find->get($table), $table); // update the database - if ($this->set->items($this->replace->get($table), $table)) + if ($this->insert->items($this->replace->get($table), $table)) { $replaced++; } diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Set.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Insert.php similarity index 91% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Set.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Insert.php index 326a6f36f..667bb81df 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Set.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Insert.php @@ -16,9 +16,9 @@ use Joomla\CMS\Factory as JoomlaFactory; use VDM\Joomla\Componentbuilder\Search\Factory; use VDM\Joomla\Componentbuilder\Search\Config; use VDM\Joomla\Componentbuilder\Table; -use VDM\Joomla\Componentbuilder\Search\Model\Set as Model; +use VDM\Joomla\Componentbuilder\Search\Model\Insert as Model; use VDM\Joomla\Utilities\ArrayHelper; -use VDM\Joomla\Componentbuilder\Search\Interfaces\SetInterface; +use VDM\Joomla\Componentbuilder\Search\Interfaces\InsertInterface; /** @@ -26,7 +26,7 @@ use VDM\Joomla\Componentbuilder\Search\Interfaces\SetInterface; * * @since 3.2.0 */ -class Set implements SetInterface +class Insert implements InsertInterface { /** * Search Config @@ -75,7 +75,7 @@ class Set implements SetInterface { $this->config = $config ?: Factory::_('Config'); $this->table = $table ?: Factory::_('Table'); - $this->model = $model ?: Factory::_('Set.Model'); + $this->model = $model ?: Factory::_('Insert.Model'); $this->db = $db ?: JoomlaFactory::getDbo(); } diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Get.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Load.php similarity index 53% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Get.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Load.php index 02686ac43..6bb7eba15 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Get.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Database/Load.php @@ -16,16 +16,17 @@ use Joomla\CMS\Factory as JoomlaFactory; use VDM\Joomla\Componentbuilder\Search\Factory; use VDM\Joomla\Componentbuilder\Search\Config; use VDM\Joomla\Componentbuilder\Table; -use VDM\Joomla\Componentbuilder\Search\Model\Get as Model; -use VDM\Joomla\Componentbuilder\Search\Interfaces\GetInterface; +use VDM\Joomla\Componentbuilder\Search\Model\Load as Model; +use VDM\Joomla\Componentbuilder\Database\Load as Database; +use VDM\Joomla\Componentbuilder\Search\Interfaces\LoadInterface; /** - * Search Database Get + * Search Database Load * * @since 3.2.0 */ -class Get implements GetInterface +class Load implements LoadInterface { /** * Bundle Size @@ -60,39 +61,39 @@ class Get implements GetInterface protected Model $model; /** - * Database object to query local DB + * Database load class * - * @var \JDatabaseDriver + * @var Database * @since 3.2.0 **/ - protected \JDatabaseDriver $db; + protected Database $load; /** * Constructor * - * @param Config|null $config The search config object. - * @param Table|null $table The search table object. - * @param Model|null $model The search get model object. - * @param \JDatabaseDriver|null $db The database object. + * @param Config|null $config The search config object. + * @param Table|null $table The search table object. + * @param Model|null $model The search get model object. + * @param Database|null $load The database object. * * @since 3.2.0 */ public function __construct(?Config $config = null, ?Table $table = null, - ?Model $model = null, ?\JDatabaseDriver $db = null) + ?Model $model = null, ?Database $load = null) { $this->config = $config ?: Factory::_('Config'); $this->table = $table ?: Factory::_('Table'); - $this->model = $model ?: Factory::_('Get.Model'); - $this->db = $db ?: JoomlaFactory::getDbo(); + $this->model = $model ?: Factory::_('Load.Model'); + $this->load = $load ?: Factory::_('Load'); } /** * Get a value from a given table * Example: $this->value(23, 'value_key', 'table_name'); * - * @param int $id The item ID - * @param string $field The field key - * @param string|null $table The table + * @param int $id The item ID + * @param string $field The field key + * @param string|null $table The table * * @return mixed * @since 3.2.0 @@ -105,30 +106,19 @@ class Get implements GetInterface $table = $this->config->table_name; } - // check if this is a valid field and table - if ($id > 0 && ($name = $this->table->get($table, $field, 'name')) !== null) + // check if this is a valid table + if ($id > 0 && $this->table->exist($table, $field) && + ($value = $this->load->value( + ["a.${field}" => $field], // select + ['a' => $table], // tables + ['a.id' => $id] // where + )) !== null) { - // Create a new query object. - $query = $this->db->getQuery(true); - - // Order it by the ordering field. - $query->select($this->db->quoteName($name)); - $query->from($this->db->quoteName('#__componentbuilder_' . $table)); - - // get by id - $query->where($this->db->quoteName('id') . " = " . (int) $id); - - // Reset the query using our newly populated query object. - $this->db->setQuery($query); - $this->db->execute(); - - // check if we have any values - if ($this->db->getNumRows()) - { - // return found values - return $this->model->value($this->db->loadResult(), $name, $table); - } + return $this->model->value( + $value, $field, $table + ); } + return null; } @@ -136,8 +126,8 @@ class Get implements GetInterface * Get values from a given table * Example: $this->item(23, 'table_name'); * - * @param int $id The item ID - * @param string| null $table The table + * @param int $id The item ID + * @param string| null $table The table * * @return object|null * @since 3.2.0 @@ -151,32 +141,17 @@ class Get implements GetInterface } // check if this is a valid table - if ($id > 0 && ($fields = $this->table->fields($table)) !== null) + if ($id > 0 && ($fields = $this->getFields($table)) !== null && + ($item = $this->load->item( + $fields, // select + ['a' => $table], // tables + ['a.id' => $id] // where + )) !== null) { - // add the ID - array_unshift($fields , 'id'); - - // Create a new query object. - $query = $this->db->getQuery(true); - - // Order it by the ordering field. - $query->select($this->db->quoteName($fields)); - $query->from($this->db->quoteName('#__componentbuilder_' . $table)); - - // get by id - $query->where($this->db->quoteName('id') . " = " . $id); - - // Reset the query using our newly populated query object. - $this->db->setQuery($query); - $this->db->execute(); - - // check if we have any values - if ($this->db->getNumRows()) - { - // return found values - return $this->model->item($this->db->loadObject(), $table); - } + // return found values + return $this->model->item($item, $table); } + return null; } @@ -199,43 +174,46 @@ class Get implements GetInterface } // check if this is a valid table - if (($fields = $this->table->fields($table)) !== null) + if ( ($fields = $this->getFields($table)) !== null) { - // add the ID - array_unshift($fields , 'id'); - + // add a key to the selection return set + $fields['key'] = 'id'; // get the title value $title = $this->table->titleName($table); - - // Create a new query object. - $query = $this->db->getQuery(true); - - // Order it by the ordering field. - $query->select($this->db->quoteName($fields)); - $query->from($this->db->quoteName('#__componentbuilder_' . $table)); - $query->order($title .' ASC'); + // set order + $order = [$title => 'ASC']; + // select all + $where = null; + // no limit + $limit = null; // add limitation and pagination if ($bundle > 0) { // get the incremental number - $query->where($this->db->quoteName('id') . " >= " . $this->next($table, $bundle)); + $where = ['a.id' => [ + 'operator' => '>=', + 'value' => $this->next($table, $bundle) + ] + ]; // only return a limited number - $query->setLimit($this->bundle); + $limit = $this->bundle; } - // Reset the query using our newly populated query object. - $this->db->setQuery($query); - $this->db->execute(); - - // check if we have any values - if ($this->db->getNumRows()) + if (($items = $this->load->items( + $fields, // select + ['a' => $table], // tables + $where, + $order, + $limit + )) !== null) { // return found values - return $this->model->items($this->db->loadObjectList('id'), $table); + return $this->model->items($items, $table); } } + return null; } @@ -290,6 +268,36 @@ class Get implements GetInterface **/ return (($bundle * $this->bundle) - $this->bundle) + 1; } + + /** + * Get Fields ready to use in database call + * + * @param string $table The table which fields we want to get + * + * @return array|null + * @since 3.2.0 + */ + protected function getFields(string $table, string $key = 'a', bool $addId = true): ?array + { + if (($fields = $this->table->fields($table)) !== null) + { + // add the ID + if ($addId) + { + array_unshift($fields , 'id'); + } + + $bucket = []; + foreach ($fields as $field) + { + $bucket[$key . '.' . $field] = $field; + } + + return $bucket; + } + + return null; + } } diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Factory.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Factory.php index c4bad5d4f..fa2066ef9 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Factory.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Factory.php @@ -17,7 +17,7 @@ use VDM\Joomla\Componentbuilder\Search\Service\Search; use VDM\Joomla\Componentbuilder\Search\Service\Model; use VDM\Joomla\Componentbuilder\Search\Service\Database; use VDM\Joomla\Componentbuilder\Search\Service\Agent; -use VDM\Joomla\Componentbuilder\Interfaces\Factoryinterface; +use VDM\Joomla\Componentbuilder\Interfaces\FactoryInterface; /** @@ -25,10 +25,10 @@ use VDM\Joomla\Componentbuilder\Interfaces\Factoryinterface; * * @since 3.2.0 */ -abstract class Factory implements Factoryinterface +abstract class Factory implements FactoryInterface { /** - * Global Compiler Container + * Global Search Container * * @var Container * @since 3.2.0 @@ -36,7 +36,7 @@ abstract class Factory implements Factoryinterface protected static $container = null; /** - * Get any class from the compiler container + * Get any class from the search container * * @param string $key The container class key * @@ -49,7 +49,7 @@ abstract class Factory implements Factoryinterface } /** - * Get a the global compiler container + * Get the global search container * * @return Container * @since 3.2.0 diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/SetInterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/InsertInterface.php similarity index 93% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/SetInterface.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/InsertInterface.php index a2e4b8ace..c00df007e 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/SetInterface.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/InsertInterface.php @@ -13,11 +13,11 @@ namespace VDM\Joomla\Componentbuilder\Search\Interfaces; /** - * Search Database Set Interface + * Search Database Insert Interface * * @since 3.2.0 */ -interface SetInterface +interface InsertInterface { /** * Set values to a given table diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/GetInterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/LoadInterface.php similarity index 93% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/GetInterface.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/LoadInterface.php index 5816ba6ff..548a67a56 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/GetInterface.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Interfaces/LoadInterface.php @@ -13,11 +13,11 @@ namespace VDM\Joomla\Componentbuilder\Search\Interfaces; /** - * Search Database Get Interface + * Search Database Load Interface * * @since 3.2.0 */ -interface GetInterface +interface LoadInterface { /** * Get a value from a given table diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Set.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Insert.php similarity index 92% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Set.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Insert.php index c35764ed5..ebde3c5e2 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Set.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Insert.php @@ -17,11 +17,11 @@ use VDM\Joomla\Componentbuilder\Search\Abstraction\Model; /** - * Search Set Model + * Search Insert Model * * @since 3.2.0 */ -class Set extends Model implements ModelInterface +class Insert extends Model implements ModelInterface { /** * Model the value diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Get.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Load.php similarity index 92% rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Get.php rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Load.php index 3d42856c3..75eccec8e 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Get.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Model/Load.php @@ -19,11 +19,11 @@ use VDM\Joomla\Componentbuilder\Search\Abstraction\Model; /** - * Search Get Model + * Search Load Model * * @since 3.2.0 */ -class Get extends Model implements ModelInterface +class Load extends Model implements ModelInterface { /** * Model the value diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Agent.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Agent.php index 79d85163b..62899ea25 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Agent.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Agent.php @@ -66,8 +66,8 @@ class Agent implements ServiceProviderInterface { return new SearchAgent( $container->get('Config'), - $container->get('Get.Database'), - $container->get('Set.Database'), + $container->get('Load.Database'), + $container->get('Insert.Database'), $container->get('Agent.Find'), $container->get('Agent.Replace'), $container->get('Agent.Search'), diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Database.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Database.php index 429a009e7..252b9e02b 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Database.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Database.php @@ -14,8 +14,10 @@ namespace VDM\Joomla\Componentbuilder\Search\Service; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; -use VDM\Joomla\Componentbuilder\Search\Database\Get as GetDatabase; -use VDM\Joomla\Componentbuilder\Search\Database\Set as SetDatabase; +use VDM\Joomla\Componentbuilder\Database\Load; +use VDM\Joomla\Componentbuilder\Search\Database\Load as LoadDatabase; +use VDM\Joomla\Componentbuilder\Database\Insert; +use VDM\Joomla\Componentbuilder\Search\Database\Insert as InsertDatabase; /** @@ -35,44 +37,77 @@ class Database implements ServiceProviderInterface */ public function register(Container $container) { - $container->alias(GetDatabase::class, 'Get.Database') - ->share('Get.Database', [$this, 'getDatabaseGet'], true); + $container->alias(Load::class, 'Load') + ->share('Load', [$this, 'getLoad'], true); - $container->alias(SetDatabase::class, 'Set.Database') - ->share('Set.Database', [$this, 'getDatabaseSet'], true); + $container->alias(LoadDatabase::class, 'Load.Database') + ->share('Load.Database', [$this, 'getDatabaseLoad'], true); + + $container->alias(Insert::class, 'Insert') + ->share('Insert', [$this, 'getInsert'], true); + + $container->alias(InsertDatabase::class, 'Insert.Database') + ->share('Insert.Database', [$this, 'getDatabaseInsert'], true); } /** - * Get the Get Database + * Get the Core Load Database * * @param Container $container The DI container. * - * @return GetDatabase + * @return Load * @since 3.2.0 */ - public function getDatabaseGet(Container $container): GetDatabase + public function getLoad(Container $container): Load { - return new GetDatabase( + return new Load(); + } + + /** + * Get the Load Database + * + * @param Container $container The DI container. + * + * @return LoadDatabase + * @since 3.2.0 + */ + public function getDatabaseLoad(Container $container): LoadDatabase + { + return new LoadDatabase( $container->get('Config'), $container->get('Table'), - $container->get('Get.Model') + $container->get('Load.Model'), + $container->get('Load') ); } /** - * Get the Set Database + * Get the Core Insert Database * * @param Container $container The DI container. * - * @return SetDatabase + * @return Insert * @since 3.2.0 */ - public function getDatabaseSet(Container $container): SetDatabase + public function getInsert(Container $container): Insert { - return new SetDatabase( + return new Insert(); + } + + /** + * Get the Insert Database + * + * @param Container $container The DI container. + * + * @return InsertDatabase + * @since 3.2.0 + */ + public function getDatabaseInsert(Container $container): InsertDatabase + { + return new InsertDatabase( $container->get('Config'), $container->get('Table'), - $container->get('Set.Model') + $container->get('Insert.Model') ); } diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Model.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Model.php index 6a53aced4..1af1977a2 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Model.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Search/Service/Model.php @@ -14,8 +14,8 @@ namespace VDM\Joomla\Componentbuilder\Search\Service; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; -use VDM\Joomla\Componentbuilder\Search\Model\Get; -use VDM\Joomla\Componentbuilder\Search\Model\Set; +use VDM\Joomla\Componentbuilder\Search\Model\Load; +use VDM\Joomla\Componentbuilder\Search\Model\Insert; /** @@ -35,40 +35,40 @@ class Model implements ServiceProviderInterface */ public function register(Container $container) { - $container->alias(Get::class, 'Get.Model') - ->share('Get.Model', [$this, 'getModelGet'], true); + $container->alias(Load::class, 'Load.Model') + ->share('Load.Model', [$this, 'getModelLoad'], true); - $container->alias(Set::class, 'Set.Model') - ->share('Set.Model', [$this, 'getModelSet'], true); + $container->alias(Insert::class, 'Insert.Model') + ->share('Insert.Model', [$this, 'getModelInsert'], true); } /** - * Get the Get Model + * Get the Load Model * * @param Container $container The DI container. * - * @return Get + * @return Load * @since 3.2.0 */ - public function getModelGet(Container $container): Get + public function getModelLoad(Container $container): Load { - return new Get( + return new Load( $container->get('Config'), $container->get('Table') ); } /** - * Get the Set Model + * Get the Insert Model * * @param Container $container The DI container. * - * @return Set + * @return Insert * @since 3.2.0 */ - public function getModelSet(Container $container): Set + public function getModelInsert(Container $container): Insert { - return new Set( + return new Insert( $container->get('Config'), $container->get('Table') ); diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/Component/Helper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/Component/Helper.php index 0ab0e6d1d..acea30587 100644 --- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/Component/Helper.php +++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/Component/Helper.php @@ -27,7 +27,7 @@ abstract class Helper /** * The current option * - * @var String + * @var string * @since 3.0.11 */ public static $option; @@ -43,14 +43,14 @@ abstract class Helper /** * Gets the parameter object for the component * - * @param String $option The option for the component. + * @param string $option The option for the component. * - * @return Registry A Registry object. + * @return Registry A Registry object. * * @see Registry * @since 3.0.11 */ - public static function getParams($option = null) + public static function getParams($option = null): Registry { // check that we have an option if (empty($option)) @@ -70,13 +70,13 @@ abstract class Helper /** * Gets the component option * - * @param String|Bool $default The default return value if none is found + * @param string|null $default The default return value if none is found * - * @return String|Bool A component option + * @return string|null A component option * * @since 3.0.11 */ - public static function getOption($default = 'empty') + public static function getOption($default = 'empty'): ?string { if (empty(self::$option)) { @@ -95,14 +95,14 @@ abstract class Helper /** * Gets the component code name * - * @param String $option The option for the component. - * @param String|Bool $default The default return value if none is found + * @param string $option The option for the component. + * @param string|null $default The default return value if none is found * - * @return String|Mixed A component code name + * @return string|null A component code name * * @since 3.0.11 */ - public static function getCode($option = null, $default = null) + public static function getCode($option = null, $default = null): ?string { // check that we have an option if (empty($option)) @@ -121,14 +121,14 @@ abstract class Helper /** * Gets the component abstract helper class * - * @param String $option The option for the component. - * @param String|Bool $default The default return value if none is found + * @param string|null $option The option for the component. + * @param string|null $default The default return value if none is found * - * @return String|Mixed A component helper name + * @return string|null A component helper name * * @since 3.0.11 */ - public static function get($option = null, $default = null) + public static function get($option = null, $default = null): ?string { // check that we have an option // and get the code name from it @@ -149,10 +149,10 @@ abstract class Helper /** * Check if the helper class of this component has a method * - * @param String $method The method name to search for - * @param String $option The option for the component. + * @param String $method The method name to search for + * @param String $option The option for the component. * - * @return bool true if method exist + * @return bool true if method exist * * @since 3.0.11 */