diff --git a/docs/upgrades/upgrade_7.4.40-7.5.16.pl b/docs/upgrades/upgrade_7.4.40-7.5.16.pl index 1350d2a84..1cb2e02d5 100644 --- a/docs/upgrades/upgrade_7.4.40-7.5.16.pl +++ b/docs/upgrades/upgrade_7.4.40-7.5.16.pl @@ -20,7 +20,18 @@ use Getopt::Long; use WebGUI::Session; use WebGUI::Storage; use WebGUI::Asset; - +use WebGUI::ProfileField; +use File::Find; +use File::Spec; +use WebGUI::User; +use WebGUI::DateTime; +use WebGUI::Asset::Sku::Product; +use WebGUI::Asset::Wobject::EventManagementSystem; +use WebGUI::Workflow; +use WebGUI::Utility; +use WebGUI::Pluggable; +use File::Path; +use JSON; my $toVersion = "7.5.16"; # make this match what version you're going to my $quiet; # this line required @@ -28,19 +39,3935 @@ my $quiet; # this line required my $session = start(); # this line required -# upgrade functions go here - +addIsExportable($session); +addUrlAndContentHandlers($session); +addFriendsNetwork($session); +addSearchWithContainers($session); +addGroupToEditPost($session); +installGalleryAsset($session); +installGalleryAlbumAsset($session); +installPhotoAsset($session); +createEvent_relatedlinkTable($session); +updateRelatedLinkData($session); +alterEventTableForSequence($session); +populateSequenceNumbers($session); +removeOldPhotoGallery($session); +speedUp($session); +addViewsColumnToPhoto( $session ); +addListViewToCalendar( $session ); +addIcalPageSize( $session ); +addGalleryEditCommentTemplate( $session ); +addGalleryRichEditAlbum( $session ); +migrateToGalleryFile( $session ); +convertCacheToBinary($session); +repairDBCharset($session); +addLayoutOrderSetting( $session ); +installThingyAsset($session); +removeOldGalleryColumns( $session ); +moveColumnsToGalleryFile( $session ); +moveCommentsToGalleryFile( $session ); +addRichEditInlinePopup($session); +addRichEditMedia( $session ); +updateRichEditorButtons($session); +privatizeVisitor($session); +ucfirstThingyFieldTypes($session); +changeRealtimeWorkflows($session); +addReferralHandler( $session ); +addCalendarEventWorkflow( $session ); +addPurgeOldInboxActivity( $session ); +addingInStoreCredit($session); +insertCommerceTaxTable($session); +migrateOldTaxTable($session); +insertCommerceShipDriverTable($session); +migrateToNewCart($session); +createSkuAsset($session); +createDonationAsset($session); +addShippingDrivers($session); +addShoppingHandler($session); +addAddressBook($session); +insertCommercePayDriverTable($session); +addPaymentDrivers($session); +convertTransactionLog($session); +upgradeEMS($session); +migrateOldProduct($session); +mergeProductsWithCommerce($session); +deleteOldProductTemplates($session); +addCaptchaToDataForm( $session ); +addArchiveEnabledToCollaboration( $session ); +addShelf( $session ); +addCoupon( $session ); +addVendors($session); +modifyThingyPossibleValues( $session ); +removeLegacyTable($session); +addVersionStartEndDates($session); +migrateSubscriptions( $session ); +updateUsersOfCommerceMacros($session); +addDBLinkAccessToSQLMacro($session); +addAssetManager( $session ); +removeSqlForm($session); +migratePaymentPlugins( $session ); +removeRecurringPaymentActivity( $session ); +addLoginMessage( $session ); +addNewApprovalActivities( $session ); +addUserListWobject( $session ); +addInheritUrlFromParent( $session ); +addDefaultFilesPerPage( $session ); +fixAdminConsoleTemplateTitles( $session ); +makeLongerAssetMetadataValues( $session ); +removeOldCommerceCode($session); +convertDataForm( $session ); +addSelectableProfileTemplates($session); +addCouponThankYouMessage($session); +cleanUpOldSubscriptionTable( $session); +deleteBadReceiptEmailTemplate($session); +unlockShelfAssets($session); +removeOldGalleryImport($session); +addMissingWorkflowActivities($session); finish($session); # this line required +#----------------------------------------------------------- +sub addMissingWorkflowActivities { + my $session = shift; + print "\tAdding Request Approval and Wait Until workflow activities to config..." unless $quiet; + $session->config->addToArray("workflowActivities/WebGUI::VersionTag", "WebGUI::Workflow::Activity::RequestApprovalForVersionTag::ByCommitterGroup"); + $session->config->addToArray("workflowActivities/WebGUI::VersionTag", "WebGUI::Workflow::Activity::RequestApprovalForVersionTag::ByLineage"); + $session->config->addToArray("workflowActivities/WebGUI::VersionTag", "WebGUI::Workflow::Activity::WaitUntil"); + print " Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub removeOldGalleryImport { + my $session = shift; + print "\tRemoving old gallery import mechanism... " unless $quiet; + unlink "../../sbin/migrateCollabToGallery.pl"; + unlink "../../sbin/migrateFolderToGallery.pl"; + rmtree "../../lib/WebGUI/Utility"; + rmtree "../../t/Utility/Gallery"; + print "DONE!\n" unless $quiet; +} + +sub unlockShelfAssets { + my $session = shift; + print "\tUnlocking assets from improper Shelf package import..." unless $quiet; + for my $id (qw(4e-_rNs6mSWedZhQ_V5kJA 6tK47xsaIH-ELw0IBo0uRQ XNd7a_g_cTvJVYrVHcx2Mw _bZJ9LA_KNekZiFPaP2SeQ nFen0xjkZn8WkpM93C9ceQ)) { + my $asset = WebGUI::Asset->new($session, $id); + if ($asset && $asset->get('isLockedBy')) { + my $tagId = $asset->get('tagId'); + my $versionTag = WebGUI::VersionTag->new($session, $tagId); + if (! $versionTag->get('isLocked')) { + $asset->commit; + } + } + } + print "Done.\n" unless $quiet; +} + + +sub deleteBadReceiptEmailTemplate { + my $session = shift; + print "\tDeleting bad Shop Email Receipt template... " unless $quiet; + my $badTemplate = WebGUI::Asset->newByDynamicClass($session, 'BMzuE91-XB8E-XGll1zpvA'); + if (defined $badTemplate) { + $badTemplate->purge; + } + print "DONE!\n" unless $quiet; +} + #---------------------------------------------------------------------------- -# Describe what our function does -#sub exampleFunction { -# my $session = shift; -# print "\tWe're doing some stuff here that you should know about... " unless $quiet; -# # and here's our code -# print "DONE!\n" unless $quiet; -#} +sub cleanUpOldSubscriptionTable { + my $session = shift; + print "\tClean up the old subscription table.\n" unless $quiet; + my $db = $session->db; + $db->write("DROP TABLE Subscription_OLD"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addSelectableProfileTemplates { + my $session = shift; + print "\tAdd selectable user profile templates.\n" unless $quiet; + my $tmpl = $session->setting->get('viewUserProfileTemplate') || 'PBtmpl0000000000000052'; + $session->setting->remove('viewUserProfileTemplate'); + $session->setting->add('viewUserProfileTemplate', $tmpl); + $tmpl = $session->setting->get('editUserProfileTemplate') || 'PBtmpl0000000000000051'; + $session->setting->remove('editUserProfileTemplate'); + $session->setting->add('editUserProfileTemplate', $tmpl); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addCouponThankYouMessage { + my $session = shift; + print "\tAdding Thank You Message to Coupon table...\n" unless $quiet; + $session->db->write('alter table FlatDiscount add column thankYouMessage mediumtext'); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub convertDataForm { + my $session = shift; + print "\tConverting DataForm configuration and data to JSON..." unless $quiet; + $session->db->write( + q{ ALTER TABLE `DataForm` ADD COLUMN storeData INT(1) DEFAULT 1 }, + ); + $session->db->write( + q{ ALTER TABLE `DataForm` ADD COLUMN fieldConfiguration TEXT }, + ); + $session->db->write( + q{ ALTER TABLE `DataForm` ADD COLUMN tabConfiguration TEXT }, + ); + $session->db->write( + q{ ALTER TABLE `DataForm_entry` ADD COLUMN entryData TEXT }, + ); + my @dataforms = $session->db->buildArray("SELECT `assetId` FROM `asset` WHERE className='WebGUI::Asset::Wobject::DataForm'"); + for my $assetId (@dataforms) { + my $dataForm = WebGUI::Asset->newPending($session, $assetId); + my @tabConfigs; + my $tabs = $session->db->read("SELECT * FROM DataForm_tab WHERE assetId=? ORDER BY sequenceNumber", [$assetId]); + while (my $tabData = $tabs->hashRef) { + my $newConfig = { + label => $tabData->{label}, + subtext => $tabData->{subtext}, + tabId => $tabData->{DataForm_tabId}, + }; + push @tabConfigs, $newConfig; + } + $tabs->finish; + my $tabJSON = encode_json( \@tabConfigs ); + + my @fieldConfigs; + my %fieldMapping; + + my $fields = $session->db->read("SELECT * FROM `DataForm_field` WHERE assetId=? ORDER BY sequenceNumber", [$assetId]); + while (my $fieldData = $fields->hashRef) { + my $newConfig = { + name => $fieldData->{name}, + status => $fieldData->{status}, + type => "\u$fieldData->{type}", + options => $fieldData->{possibleValues}, + defaultValue => $fieldData->{defaultValue}, + width => $fieldData->{width}, + subtext => $fieldData->{subtext}, + rows => $fieldData->{rows}, + isMailField => $fieldData->{isMailField}, + label => $fieldData->{label}, + tabId => $fieldData->{DataForm_tabId} || undef, + vertical => $fieldData->{vertical}, + extras => $fieldData->{extras}, + }; + $fieldMapping{ $fieldData->{DataForm_fieldId} } = $newConfig->{name}; + push @fieldConfigs, $newConfig; + } + $fields->finish; + my $fieldJSON = encode_json( \@fieldConfigs ); + my $entries = $session->db->read("SELECT * FROM `DataForm_entry` WHERE assetId=?", [$assetId]); + while (my $entryData = $entries->hashRef) { + my $newEntryFieldData = {}; + my $entryFields = $session->db->read("SELECT * FROM `DataForm_entryData` WHERE assetId=? AND DataForm_entryId=?", [$assetId, $entryData->{DataForm_entryId}]); + while (my $entryFieldData = $entryFields->hashRef) { + $newEntryFieldData->{ $fieldMapping{ $entryFieldData->{DataForm_fieldId} } } = $entryFieldData->{value}; + } + $entryFields->finish; + my $entryJSON = encode_json($newEntryFieldData); + $session->db->write("UPDATE `DataForm_entry` SET entryData=? WHERE assetId=? AND DataForm_entryId=?", [$entryJSON, $assetId, $entryData->{DataForm_entryId}]); + } + $entries->finish; + $dataForm->addRevision({fieldConfiguration => $fieldJSON, tabConfiguration => $tabJSON}); + } + $session->db->write( + q{ ALTER TABLE `DataForm_entry` ADD COLUMN newDate DATETIME }, + ); + $session->db->write( + q{ UPDATE `DataForm_entry` SET newDate = FROM_UNIXTIME(submissionDate) }, + ); + $session->db->write( + q{ ALTER TABLE `DataForm_entry` DROP COLUMN submissionDate }, + ); + $session->db->write( + q{ ALTER TABLE `DataForm_entry` CHANGE COLUMN newDate submissionDate DATETIME }, + ); + $session->db->write( + q{ DROP TABLE `DataForm_tab` }, + ); + $session->db->write( + q{ DROP TABLE `DataForm_field` }, + ); + $session->db->write( + q{ DROP TABLE `DataForm_entryData` }, + ); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add default files per page to the Gallery +sub addDefaultFilesPerPage { + my $session = shift; + print "\tAdding Default Files Per Page to Gallery... " unless $quiet; + $session->db->write( + "ALTER TABLE Gallery ADD COLUMN defaultFilesPerPage INT" + ); + $session->db->write( + "UPDATE Gallery SET defaultFilesPerPage=24" + ); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add two new approval activities +sub addNewApprovalActivities { + my $session = shift; + print "\tAdding new approval activities... " unless $quiet; + + my $activities = $session->config->get( "workflowActivities" ); + push @{ $activities->{ 'WebGUI::VersionTag' } }, + 'WebGUI::Workflow::Activity::RequestApprovalForVersionTag::ByCommitterGroup', + 'WebGUI::Workflow::Activity::RequestApprovalForVersionTag::ByLineage', + ; + + $session->config->set( "workflowActivities", $activities ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the necessary settings and profile fields for the new login message +sub addLoginMessage { + my $session = shift; + print "\tAdding Login Message... " unless $quiet; + + # Add some settings + my %settings = ( + showMessageOnLogin => '0', + showMessageOnLoginTimes => '0', + showMessageOnLoginBody => '', + ); + for my $setting ( keys %settings ) { + $session->setting->add( $setting, $settings{ $setting } ); + } + + # Add a profile field + WebGUI::ProfileField->create( $session, + 'showMessageOnLoginSeen', + { + fieldType => 'integer', + dataDefault => '0', + visible => '0', + editable => '0', + protected => '1', + required => '0', + label => 'WebGUI::International::get("showMessageOnLoginSeen","Auth");', + }, + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub removeSqlForm { + my $session = shift; + print "\tOptionally removing SQL Form...\n" unless $quiet; + my $db = $session->db; + unless ($db->quickScalar("select count(*) from asset where className='WebGUI::Asset::Wobject::SQLForm'")) { + print "\t\tNot using it, so we're uninstalling it.\n" unless $quiet; + $session->config->deleteFromArray("assets","WebGUI::Asset::Wobject::SQLForm"); + my @ids = $db->buildArray("select distinct assetId from template where namespace like 'SQLForm%'"); + push @ids, qw(GnrXtoFFeXia3vDQuSHojw k8vxD4fuKKf5cGwNTw0sLw); + foreach my $id (@ids) { + my $asset = WebGUI::Asset->newByDynamicClass($session, $id); + if (defined $asset) { + $asset->purge; + } + } + foreach my $table (qw(SQLForm_fieldDefinitions SQLForm SQLForm_fieldTypes SQLForm_regexes)) { + $db->write("drop table $table"); + } + unlink ( $webguiRoot . '/lib/WebGUI/Asset/Wobject/SQLForm.pm' ); + unlink ( $webguiRoot . '/lib/WebGUI/Help/Asset_SQLForm.pm' ); + unlink ( $webguiRoot . '/lib/WebGUI/i18n/English/Asset_SQLForm.pm' ); + unlink ( $webguiRoot . '/t/Asset/Wobject/SQLForm.t' ); + } + else { + print "\t\tThis site uses SQL Form, so we won't uninstall it.\n" unless $quiet; + } +} + +#---------------------------------------------------------------------------- +sub changeRealtimeWorkflows { + my $session = shift; + print "\tMaking realtime workflows seamless... " unless $quiet; + $session->db->write(q{update WorkflowInstance set workflowId='pbworkflow000000000003' where workflowId='realtimeworkflow-00001'}); + $session->db->write(q{update Workflow set mode='parallel' where mode='realtime'}); + if ($session->setting->get('defaultVersionTagWorkflow') eq 'realtimeworkflow-00001') { + $session->setting->set("defaultVersionTagWorkflow","pbworkflow000000000003"); + } + my $realtime = WebGUI::Workflow->new($session,'realtimeworkflow-00001'); + if (defined $realtime) { + $realtime->delete; + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the Asset Manager content handler to the list +# Must go before the Operation content handler (since we use ?op=assetManager) +sub addAssetManager { + my $session = shift; + print "\tAdding new Asset Manager ..." unless $quiet; + + my $config = $session->config; + my @handlers = (); + foreach my $element (@{$config->get("contentHandlers")}) { + if ($element eq "WebGUI::Content::Operation") { + push @handlers, "WebGUI::Content::AssetManager"; + } + push @handlers, $element; + } + $config->set("contentHandlers", \@handlers); + + print "DONE! \n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addCoupon { + my $session = shift; + print "\tAdding Coupons... " unless $quiet; + + $session->db->write(q{ + create table FlatDiscount ( + assetId varchar(22) binary not null, + revisionDate bigint, + templateId varchar(22) binary not null default '63ix2-hU0FchXGIWkG3tow', + mustSpend float not null default 0, + percentageDiscount int(3) not null default 0, + priceDiscount float not null default 0, + primary key (assetId,revisionDate) + ) + }); + $session->config->addToArray("assets","WebGUI::Asset::Sku::FlatDiscount"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addVendors { + my $session = shift; + print "\tAdding vendors... " unless $quiet; + + $session->db->write(q{ + create table vendor ( + vendorId varchar(22) binary not null primary key, + dateCreated datetime, + name varchar(255), + userId varchar(22) binary not null default '3', + preferredPaymentType varchar(255), + paymentInformation text, + paymentAddressId varchar(22) binary, + index userId (userId) + ) + }); + $session->db->write(q{ + insert into vendor (vendorId,name,dateCreated) values ('defaultvendor000000000','Default Vendor',now()) + }); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the archiveEnabled field to Collaboration assets +sub addArchiveEnabledToCollaboration { + my $session = shift; + print "\tAdding archiveEnabled to Collaboration... " unless $quiet; + + $session->db->write( + q{ ALTER TABLE Collaboration ADD COLUMN archiveEnabled INT(1) DEFAULT 1 } + ); + + print "DONE!\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +sub addShelf { + my $session = shift; + print "\tAdding Shelves... " unless $quiet; + + $session->db->write(q{ + create table Shelf ( + assetId varchar(22) binary not null, + revisionDate bigint, + templateId varchar(22) binary not null default 'nFen0xjkZn8WkpM93C9ceQ', + primary key (assetId,revisionDate) + ) + }); + $session->config->addToArray("assetContainers","WebGUI::Asset::Wobject::Shelf"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the useCaptcha field to DataForm assets +sub addCaptchaToDataForm { + my $session = shift; + print "\tAdding CAPTCHA to DataForm... " unless $quiet; + + $session->db->write( + q{ ALTER TABLE DataForm ADD COLUMN useCaptcha INT(1) DEFAULT 0 } + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addReferralHandler { + my $session = shift; + print "\tAdding a referral handler." unless $quiet; + my $config = $session->config; + my @handlers = (); + foreach my $element (@{$config->get("contentHandlers")}) { + if ($element eq "WebGUI::Content::Operation") { + push @handlers, "WebGUI::Content::Referral"; + } + push @handlers, $element; + } + $config->set("contentHandlers", \@handlers); + print "DONE!\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +# Add the database column to select the workflow to approve Calendar Events +sub addCalendarEventWorkflow { + my $session = shift; + print "\tAdding Calendar Event Workflow field..." unless $quiet; + + $session->db->write( + qq{ ALTER TABLE Calendar ADD COLUMN workflowIdCommit VARCHAR(22) BINARY }, + ); + + # Add a nice default value + $session->db->write( + qq{ UPDATE Calendar SET workflowIdCommit = ? }, + [ $session->setting->get('defaultVersionTagWorkflow') ], + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the new PurgeOldInboxMessages activity to the config file +sub addPurgeOldInboxActivity { + my $session = shift; + print "\tAdding Purge Old Inbox Messages workflow activity... " unless $quiet; + + my $activity = $session->config->get( "workflowActivities" ); + push @{ $activity->{"None"} }, 'WebGUI::Workflow::Activity::PurgeOldInboxMessages'; + $session->config->set( "workflowActivities", $activity ); + + print "DONE!\n" unless $quiet; +} + +#------------------------------------------------- +sub addingInStoreCredit { + my $session = shift; + print "\tAdding refunds and in-store credit.\n" unless ($quiet); + $session->db->write("create table shopCredit ( + creditId varchar(22) binary not null primary key, + userId varchar(22) binary not null, + amount float not null default 0.00, + comment text, + dateOfAdjustment datetime, + index userId (userId) + )"); +} + +#------------------------------------------------- +sub upgradeEMS { + my $session = shift; + print "\tUpgrading Event Manager\n" unless ($quiet); + my $db = $session->db; + print "\t\tDeleting unused files in the extras directory.\n" unless ($quiet); + rmtree ( $webguiRoot . '/www/extras/wobject/EventManagementSystem' ); + + print "\t\tGetting rid of old templates.\n" unless ($quiet); + foreach my $namespace (qw(EventManagementSystem EventManagementSystem_checkout EventManagementSystem_managePurchas EventManagementSystem_product EventManagementSystem_viewPurchase EventManagementSystem_search emsbadgeprint emsticketprint)) { + my $templates = $db->read("select assetId from template where namespace=?",[$namespace]); + while (my ($id) = $templates->array) { + my $asset = WebGUI::Asset->new($session, $id,'WebGUI::Asset::Template'); + if (defined $asset) { + $asset->purge; + } + } + } + print "\t\tAltering table structures.\n" unless ($quiet); + $db->write("alter table EventManagementSystem drop column globalMetadata"); + $db->write("alter table EventManagementSystem drop column globalPrerequisites"); + $db->write("alter table EventManagementSystem drop column displayTemplateId"); + $db->write("alter table EventManagementSystem drop column checkoutTemplateId"); + $db->write("alter table EventManagementSystem drop column managePurchasesTemplateId"); + $db->write("alter table EventManagementSystem drop column viewPurchaseTemplateId"); + $db->write("alter table EventManagementSystem drop column searchTemplateId"); + $db->write("alter table EventManagementSystem drop column paginateAfter"); + $db->write("alter table EventManagementSystem drop column groupToAddEvents"); + $db->write("alter table EventManagementSystem drop column badgePrinterTemplateId"); + $db->write("alter table EventManagementSystem drop column ticketPrinterTemplateId"); + $db->write("alter table EventManagementSystem add column timezone varchar(30) not null default 'America/Chicago'"); + $db->write("alter table EventManagementSystem add column templateId varchar(22) binary not null default '2rC4ErZ3c77OJzJm7O5s3w'"); + $db->write("alter table EventManagementSystem add column badgeBuilderTemplateId varchar(22) binary not null default 'BMybD3cEnmXVk2wQ_qEsRQ'"); + $db->write("alter table EventManagementSystem add column lookupRegistrantTemplateId varchar(22) binary not null default 'OOyMH33plAy6oCj_QWrxtg'"); + $db->write("alter table EventManagementSystem add column printBadgeTemplateId varchar(22) binary not null default 'PsFn7dJt4wMwBa8hiE3hOA'"); + $db->write("alter table EventManagementSystem add column printTicketTemplateId varchar(22) binary not null default 'yBwydfooiLvhEFawJb0VTQ'"); + $db->write("alter table EventManagementSystem add column badgeInstructions mediumtext"); + $db->write("alter table EventManagementSystem add column ribbonInstructions mediumtext"); + $db->write("alter table EventManagementSystem add column ticketInstructions mediumtext"); + $db->write("alter table EventManagementSystem add column tokenInstructions mediumtext"); + $db->write("alter table EventManagementSystem add column registrationStaffGroupId varchar(22) binary not null default '3'"); + $db->write("alter table EventManagementSystem_metaField rename EMSEventMetaField"); + $db->write("alter table EMSEventMetaField drop column autoSearch"); + $db->write("alter table EMSEventMetaField drop column name"); + + print "\t\tCreating new tables.\n" unless ($quiet); + $db->write("create table EMSRegistrant ( + badgeId varchar(22) binary not null primary key, + userId varchar(22) binary, + badgeNumber int not null auto_increment unique, + badgeAssetId varchar(22) binary not null, + emsAssetId varchar(22) binary not null, + name varchar(35) binary not null, + address1 varchar(35), + address2 varchar(35), + address3 varchar(35), + city varchar(35), + state varchar(35), + zipcode varchar(35), + country varchar(35), + phoneNumber varchar(35), + organization varchar(35), + email varchar(255), + notes mediumtext, + purchaseComplete boolean, + hasCheckedIn boolean, + transactionItemId varchar(22) binary, + index badgeAssetId_purchaseComplete (badgeAssetId,purchaseComplete) + )"); + $db->write("create table EMSRegistrantTicket ( + badgeId varchar(22) binary not null, + ticketAssetId varchar(22) binary not null, + purchaseComplete boolean, + transactionItemId varchar(22) binary, + primary key (badgeId, ticketAssetId), + index ticketAssetId_purchaseComplete (ticketAssetId,purchaseComplete) + )"); + $db->write("create table EMSRegistrantToken ( + badgeId varchar(22) binary not null, + tokenAssetId varchar(22) binary not null, + quantity int, + transactionItemIds text binary, + primary key (badgeId,tokenAssetId) + )"); + $db->write("create table EMSRegistrantRibbon ( + badgeId varchar(22) binary not null, + ribbonAssetId varchar(22) binary not null, + transactionItemId varchar(22) binary, + primary key (badgeId,ribbonAssetId) + )"); + $db->write("create table EMSBadgeGroup ( + badgeGroupId varchar(22) binary not null primary key, + emsAssetId varchar(22) binary not null, + name varchar(100) + )"); + $db->write("create table EMSBadge ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + price float not null default 0.00, + seatsAvailable int not null default 100, + relatedBadgeGroups mediumtext, + primary key (assetId, revisionDate) + )"); + $db->write("create table EMSTicket ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + price float not null default 0.00, + seatsAvailable int not null default 100, + startDate datetime, + duration float not null default 1.0, + eventNumber int, + location varchar(100), + relatedBadgeGroups mediumtext, + relatedRibbons mediumtext, + eventMetaData mediumtext, + primary key (assetId, revisionDate) + )"); + $db->write("create table EMSToken ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + price float not null default 0.00, + primary key (assetId, revisionDate) + )"); + $db->write("create table EMSRibbon ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + percentageDiscount float not null default 10.0, + price float not null default 0.00, + primary key (assetId, revisionDate) + )"); + + print "\t\tMigrating workflow activities.\n" unless ($quiet); + $session->config->addToArray("workflowActivities/None","WebGUI::Workflow::Activity::ExpireEmsCartItems"); + $db->write("delete from WorkflowActivity where workflowId=?",['EMSworkflow00000000001']); # file no longer exists so must get rid of this entry manually + my $workflow = WebGUI::Workflow->new($session, 'EMSworkflow00000000001'); + if (defined $workflow) { + $workflow->delete; + } + unlink($session->config->getWebguiRoot.'/lib/WebGUI/Workflow/Activity/CacheEMSPrereqs.pm'); + + print "\t\tMigrating old EMS data.\n" unless ($quiet); + my (%oldRibbons, %newRibbons, %oldBadges, %newBadges, %oldTickets, %newTickets) = (); + my $emsResults = $db->read("select assetId from asset where className='WebGUI::Asset::Wobject::EventManagementSystem'"); + while (my ($emsId) = $emsResults->array) { + my $ems = WebGUI::Asset::Wobject::EventManagementSystem->new($session, $emsId); + print "\t\t\tMigrating old ribbons for $emsId.\n" unless ($quiet); + my $ribbonResults = $db->read("select * from EventManagementSystem_discountPasses left join EventManagementSystem_products using (passId) left join products using (productId) where assetId=?",[$emsId]); + while (my $ribbonData = $ribbonResults->hashRef) { + my $ribbon = $ems->addChild({ + className => 'WebGUI::Asset::Sku::EMSRibbon', + title => $ribbonData->{title}, + url => $ribbonData->{title}, + description => $ribbonData->{description}, + sku => $ribbonData->{sku}, + price => $ribbonData->{price}, + seatsAvailable => $ribbonData->{maximumAttendees}, + }); + $oldRibbons{$ribbonData->{passId}} = $ribbon->getId; + $newRibbons{$ribbon->getId} = $ribbonData->{passId}; + } + print "\t\t\tMigrating old badges for $emsId.\n" unless ($quiet); + my $badgeResults = $db->read("select * from EventManagementSystem_products left join products using (productId) where assetId=? and prerequisiteId=''",[$emsId]); + while (my $badgeData = $badgeResults->hashRef) { + my $badge = $ems->addChild({ + className => 'WebGUI::Asset::Sku::EMSBadge', + title => $badgeData->{title}, + url => $badgeData->{title}, + description => $badgeData->{description}, + sku => $badgeData->{sku}, + price => $badgeData->{price}, + seatsAvailable => $badgeData->{maximumAttendees}, + }); + $oldBadges{$badgeData->{productId}} = $badge->getId; + $newBadges{$badge->getId} = $badgeData->{productId}; + } + print "\t\t\tMigrating old tickets for $emsId.\n" unless ($quiet); + my %metaFields = $db->buildHash("select fieldId,label from EMSEventMetaField where assetId=? order by sequenceNumber",[$emsId]); + my $ticketResults = $db->read("select * from EventManagementSystem_products left join products using (productId) where assetId=? and prerequisiteId<>''",[$emsId]); + while (my $ticketData = $ticketResults->hashRef) { + my %oldMetaData = $db->buildHash("select fieldId,fieldData from EventManagementSystem_metaData where productId=?",[$ticketData->{productId}]); + my %metaData = (); + foreach my $fieldId (keys %oldMetaData) { + $metaData{$metaFields{$fieldId}} = $oldMetaData{$fieldId}; + } + my $start = WebGUI::DateTime->new($session, $ticketData->{startDate}); + my $end = WebGUI::DateTime->new($session, $ticketData->{endDate}); + my $duration = $end - $start; + my $ticket = $ems->addChild({ + className => 'WebGUI::Asset::Sku::EMSTicket', + title => $ticketData->{title}, + url => $ticketData->{title}, + description => $ticketData->{description}, + sku => $ticketData->{sku}, + price => $ticketData->{price}, + seatsAvailable => $ticketData->{maximumAttendees}, + startDate => $start->toDatabase, + duration => $duration->in_units('seconds'), + eventNumber => $ticketData->{sku}, + eventMetaData => \%metaData, + }); + $oldTickets{$ticketData->{productId}} = $ticket->getId; + $newTickets{$ticket->getId} = $ticketData->{productId}; + } + print "\t\t\tMigrating old registrant tickets and registrant ribbons for $emsId.\n" unless ($quiet); + my %oldBadgeRegistrants = (); + my $regticResults = $db->read("select * from EventManagementSystem_registrations left join EventManagementSystem_products using (productId) where EventManagementSystem_registrations.assetId=?",[$emsId]); + while (my $registrantData = $regticResults->hashRef) { + my $id = $oldTickets{$registrantData->{productId}}; + if ( $registrantData->{prerequisiteId} eq "") { + $oldBadgeRegistrants{$registrantData->{badgeId}} = $registrantData->{productId}; + } + elsif ($id ne "") { + $db->write("replace into EMSRegistrantTicket (badgeId,ticketAssetId,purchaseComplete) values (?,?,1)", + [$registrantData->{badgeId}, $id]); + } + else { + my $id = $oldRibbons{$registrantData->{productId}}; + if ($id ne "") { + $db->write("replace into EMSRegistrantRibbon (badgeId,ribbonAssetId) values (?,?)", + [$registrantData->{badgeId}, $id]); + } + } + } + print "\t\t\tMigrating old registrants for $emsId.\n" unless ($quiet); + my $registrantResults = $db->read("select * from EventManagementSystem_badges where assetId=?",[$emsId]); + while (my $registrantData = $registrantResults->hashRef) { + $db->setRow("EMSRegistrant","badgeId",{ + badgeId => "new", + userId => $registrantData->{userId}, + badgeAssetId => $oldBadges{$oldBadgeRegistrants{$registrantData->{badgeId}}}, + emsAssetId => $emsId, + name => $registrantData->{firstName}.' '.$registrantData->{lastName}, + address1 => $registrantData->{address}, + city => $registrantData->{city}, + state => $registrantData->{state}, + zipcode => $registrantData->{zipCode}, + country => $registrantData->{country}, + phoneNumber => $registrantData->{phone}, + email => $registrantData->{email}, + purchaseComplete => 1, + },$registrantData->{badgeId}); + } + } + $db->write("drop table EventManagementSystem_badges"); + $db->write("drop table EventManagementSystem_discountPasses"); + $db->write("drop table EventManagementSystem_metaData"); + $db->write("drop table EventManagementSystem_prerequisiteEvents"); + $db->write("drop table EventManagementSystem_prerequisites"); + $db->write("drop table EventManagementSystem_products"); + $db->write("drop table EventManagementSystem_purchases"); + $db->write("drop table EventManagementSystem_registrations"); + $db->write("drop table EventManagementSystem_sessionPurchaseRef"); +} + +#------------------------------------------------- +sub convertTransactionLog { + my $session = shift; + print "\tInstalling transaction log.\n" unless ($quiet); + my $db = $session->db; + $db->write("alter table transaction rename oldtransaction"); + $db->write("alter table transactionItem rename oldtransactionitem"); + $db->write("create table transaction ( + transactionId varchar(22) binary not null primary key, + originatingTransactionId varchar(22) binary, + isSuccessful bool not null default 0, + orderNumber int not null auto_increment unique, + transactionCode varchar(100), + statusCode varchar(35), + statusMessage varchar(255), + userId varchar(22) binary not null, + username varchar(35) not null, + amount float, + shopCreditDeduction float, + shippingAddressId varchar(22) binary, + shippingAddressName varchar(35), + shippingAddress1 varchar(35), + shippingAddress2 varchar(35), + shippingAddress3 varchar(35), + shippingCity varchar(35), + shippingState varchar(35), + shippingCountry varchar(35), + shippingCode varchar(35), + shippingPhoneNumber varchar(35), + shippingDriverId varchar(22) binary, + shippingDriverLabel varchar(35), + shippingPrice float, + paymentAddressId varchar(22) binary, + paymentAddressName varchar(35), + paymentAddress1 varchar(35), + paymentAddress2 varchar(35), + paymentAddress3 varchar(35), + paymentCity varchar(35), + paymentState varchar(35), + paymentCountry varchar(35), + paymentCode varchar(35), + paymentPhoneNumber varchar(35), + paymentDriverId varchar(22) binary, + paymentDriverLabel varchar(35), + taxes float, + dateOfPurchase datetime, + isRecurring boolean, + notes mediumtext + )"); + $db->write("create table transactionItem ( + itemId varchar(22) binary not null primary key, + transactionId varchar(22) binary not null, + assetId varchar(22), + configuredTitle varchar(255), + options mediumText, + shippingAddressId varchar(22) binary, + shippingName varchar(35), + shippingAddress1 varchar(35), + shippingAddress2 varchar(35), + shippingAddress3 varchar(35), + shippingCity varchar(35), + shippingState varchar(35), + shippingCountry varchar(35), + shippingCode varchar(35), + shippingPhoneNumber varchar(35), + shippingTrackingNumber varchar(255), + orderStatus varchar(35) not null default 'NotShipped', + lastUpdated datetime, + quantity int not null default 1, + price float, + vendorId varchar(22) binary not null default 'defaultvendor000000000', + index transactionId (transactionId), + index vendorId (vendorId) + )"); + $session->setting->add('shopMyPurchasesTemplateId','2gtFt7c0qAFNU3BG_uvNvg'); + $session->setting->add('shopMyPurchasesDetailTemplateId','g8W53Pd71uHB9pxaXhWf_A'); + my $transactionResults = $db->read("select * from oldtransaction order by initDate"); + while (my $oldTranny = $transactionResults->hashRef) { + my $date = WebGUI::DateTime->new($session, $oldTranny->{initDate}); + my $u = WebGUI::User->new($session, $oldTranny->{userId}); + $db->setRow("transaction","transactionId",{ + transactionId => "new", + isSuccessful => (($oldTranny->{status} eq "Completed") ? 1 : 0), + userId => $oldTranny->{userId}, + username => WebGUI::User->new($session, $oldTranny->{userId})->username, + amount => $oldTranny->{amount}, + shippingPrice => $oldTranny->{shippingCost}, + shippingAddress1 => $u->profileField('homeAddress'), + shippingCity => $u->profileField('homeCity'), + shippingState => $u->profileField('homeState'), + shippingCode => $u->profileField('homeZip'), + shippingCountry => $u->profileField('homeCountry'), + shippingAddressName => $u->profileField('firstName').' '.$u->profileField('lastName'), + shippingPhoneNumber => $u->profileField('homePhone'), + paymentAddress1 => $u->profileField('homeAddress'), + paymentCity => $u->profileField('homeCity'), + paymentState => $u->profileField('homeState'), + paymentCode => $u->profileField('homeZip'), + paymentCountry => $u->profileField('homeCountry'), + paymentAddressName => $u->profileField('firstName').' '.$u->profileField('lastName'), + paymentPhoneNumber => $u->profileField('homePhone'), + dateOfPurchase => $date->toDatabase, + isRecurring => $oldTranny->{recurring}, + }, $oldTranny->{transactionId}); + my $itemResults = $db->read("select * from oldtransactionitem where transactionId=?",[$oldTranny->{transactionId}]); + while (my $oldItem = $itemResults->hashRef) { + my $status = $oldItem->{shippingStatus}; + $status = 'NotShipped' if $status eq 'NotSent'; + $db->setRow("transactionItem","itemId",{ + itemId => "new", + transactionId => $oldItem->{transactionId}, + configuredTitle => $oldItem->{itemName}, + options => '{}', + shippingTrackingNumber => $oldTranny->{trackingNumber}, + orderStatus => $oldTranny->{shippingStatus}, + lastUpdated => $date->toDatabase, + quantity => $oldItem->{quantity}, + price => $oldItem->{amount}, + vendorId => "defaultvendor000000000", + }, $oldItem->{itemId}); + } + } + my $driverId = $db->quickScalar("select paymentGatewayId from paymentGateway where className='WebGUI::Shop::PayDriver::ITransact'"); + $db->write("update transaction set paymentDriverId=?",[$driverId]); + $db->write("drop table oldtransaction"); + $db->write("drop table oldtransactionitem"); +} + +#------------------------------------------------- +sub addAddressBook { + my $session = shift; + print "\tInstalling address book.\n" unless ($quiet); + $session->db->write("create table addressBook ( + addressBookId varchar(22) binary not null primary key, + sessionId varchar(22) binary, + userId varchar(22) binary, + index userId (sessionId), + index sessionId (sessionId) + )"); + $session->db->write("create table address ( + addressId varchar(22) binary not null primary key, + addressBookId varchar(22) binary not null, + label varchar(35), + name varchar(35), + address1 varchar(35), + address2 varchar(35), + address3 varchar(35), + city varchar(35), + state varchar(35), + country varchar(35), + code varchar(35), + phoneNumber varchar(35), + index addressBookId_addressId (addressBookId,addressId) + )"); + $session->setting->add('shopAddressBookTemplateId','3womoo7Teyy2YKFa25-MZg'); + $session->setting->add('shopAddressTemplateId','XNd7a_g_cTvJVYrVHcx2Mw'); +} + +#------------------------------------------------- +sub addShoppingHandler { + my $session = shift; + print "\tInstalling shopping handler.\n" unless ($quiet); + my @changed = (); + foreach my $handler (@{$session->config->get("contentHandlers")}) { + if ($handler eq "WebGUI::Content::Asset") { + push(@changed, "WebGUI::Content::Shop"); + } + push(@changed, $handler); + } + $session->config->set("contentHandlers", \@changed); +} + +#------------------------------------------------- +sub createDonationAsset { + my $session = shift; + print "\tInstall Donation asset.\n" unless ($quiet); + $session->db->write("create table donation ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + defaultPrice float not null default 100.00, + thankYouMessage mediumtext, + templateId varchar(22) binary not null, + primary key (assetId, revisionDate) + )"); + $session->config->addToArray("assets","WebGUI::Asset::Sku::Donation"); +} + +#------------------------------------------------- +sub createSkuAsset { + my $session = shift; + print "\tInstall SKU asset.\n" unless ($quiet); + $session->db->write("create table sku ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + description mediumtext, + sku varchar(35) binary not null, + vendorId varchar(22) binary not null default 'defaultvendor000000000', + displayTitle bool not null default 1, + overrideTaxRate bool not null default 0, + taxRateOverride float not null default 0.00, + primary key (assetId, revisionDate), + index sku (sku), + index vendorId (vendorId) + )"); +} + +#------------------------------------------------- +sub migrateToNewCart { + my $session = shift; + print "\tInstall new shopping cart.\n" unless ($quiet); + $session->db->write("create table cart ( + cartId varchar(22) binary not null primary key, + sessionId varchar(22) binary not null, + shippingAddressId varchar(22) binary, + shipperId varchar(22) binary, + couponId varchar(22) binary, + index sessionId (sessionId) + )"); + $session->db->write("create table cartItem ( + itemId varchar(22) binary not null primary key, + cartId varchar(22) binary not null, + assetId varchar(22) binary not null, + dateAdded datetime not null, + options mediumtext, + configuredTitle varchar(255), + shippingAddressId varchar(22) binary, + quantity integer not null default 1, + index cartId_assetId_dateAdded (cartId,assetId,dateAdded) + )"); + $session->db->write("drop table shoppingCart"); + $session->setting->add('shopCartTemplateId','aIpCmr9Hi__vgdZnDTz1jw'); + $session->config->addToHash("macros","ViewCart","ViewCart"); + $session->config->addToHash("macros","CartItemCount","CartItemCount"); + $session->config->addToHash("macros","MiniCart","MiniCart"); +} + +#------------------------------------------------- +sub insertCommerceTaxTable { + my $session = shift; + print "\tInstall the Commerce Tax Table.\n" unless ($quiet); + # and here's our code + $session->db->write(<db->prepare('select * from commerceSalesTax'); + my $newTax = $session->db->prepare('insert into tax (taxId, country, state, city, code, taxRate) VALUES (?,?,?,?,?,?)'); + $oldTax->execute(); + while (my $oldTaxData = $oldTax->hashRef()) { + $newTax->execute([$oldTaxData->{commerceSalesTaxId}, 'USA', $oldTaxData->{regionIdentifier}, '', '', $oldTaxData->{salesTax}]); + } + $oldTax->finish; + $newTax->finish; + $session->db->write('drop table commerceSalesTax'); +} + +#------------------------------------------------- +sub insertCommerceShipDriverTable { + my $session = shift; + print "\tInstall the Commerce ShipperDriver Table.\n" unless ($quiet); + # and here's our code + $session->db->write(<config->delete('paymentPlugins'); + $session->config->addToArray('paymentDrivers', 'WebGUI::Shop::PayDriver::Cash'); + $session->config->addToArray('paymentDrivers', 'WebGUI::Shop::PayDriver::ITransact'); + +} + +#------------------------------------------------- +sub addShippingDrivers { + my $session = shift; + print "\tSet up the default shipping.\n" unless ($quiet); + # and here's our code + $session->config->delete('shippingPlugins'); + $session->config->addToArray('shippingDrivers', 'WebGUI::Shop::ShipDriver::FlatRate'); + $session->db->write("insert into shipper (shipperId, className,options) values ('defaultfreeshipping000','WebGUI::Shop::ShipDriver::FlatRate',?)",[q|{"label":"Free Shipping","enabled":1}|]); +} + +#------------------------------------------------- +sub migrateOldProduct { + my $session = shift; + print "\tMigrate old Product to new SKU based Products.\n" unless ($quiet); + # and here's our code + ##Grab data from Wobject table, and move it into Sku and Product, as appropriate. + ##Have to change the className's in the db, too + ## Wobject description -> Sku description + ## Wobject displayTitle -> Sku displayTitle + ## Product productNumber -> Sku sku + ## asset className WebGUI::Asset::Wobject::Product -> WebGUI::Asset::Sku::Product + my $fromWobject = $session->db->read('select w.assetId, w.revisionDate, w.description, w.displayTitle, p.productNumber from Product as p JOIN wobject as w on p.assetId=w.assetId and p.revisionDate=w.revisionDate'); + my $toSku = $session->db->prepare('insert into sku (assetId, revisionDate, sku, description, displayTitle) VALUES (?,?,?,?,?)'); + my $rmWobject = $session->db->prepare('delete from wobject where assetId=? and revisionDate=?'); + while (my $product = $fromWobject->hashRef()) { + $toSku->execute([ + $product->{assetId}, + $product->{revisionDate}, + ($product->{productNumber} || $session->id->generate), + $product->{description}, + $product->{displayTitle}, + ]); + $rmWobject->execute([$product->{assetId}, $product->{revisionDate}]); + } + $fromWobject->finish; + $toSku->finish; + $rmWobject->finish; + $session->db->write(q!update asset set className='WebGUI::Asset::Sku::Product' where className='WebGUI::Asset::Wobject::Product'!); + + ## Add variants collateral column to Sku/Product + $session->db->write('alter table Product add column thankYouMessage mediumtext'); + $session->db->write('alter table Product add column accessoryJSON mediumtext'); + $session->db->write('alter table Product add column benefitJSON mediumtext'); + $session->db->write('alter table Product add column featureJSON mediumtext'); + $session->db->write('alter table Product add column relatedJSON mediumtext'); + $session->db->write('alter table Product add column specificationJSON mediumtext'); + $session->db->write('alter table Product add column variantsJSON mediumtext'); + ##Build a variant for each Product. + my $productQuery = $session->db->read(<hashRef()) { + ##Truncate title to 30 chars for short desc + #printf "\t\tAdding variant to %s\n", $productData->{title} unless $quiet; + my $product = WebGUI::Asset::Sku::Product->new($session, $productData->{assetId}, 'WebGUI::Asset::Sku::Product', $productData->{revisionDate}); + $product->setCollateral('variantsJSON', 'variantId', 'new', { + varSku => ($productData->{productNumber} || $session->id->generate), + shortdesc => substr($productData->{title}, 0, 30), + price => $productData->{price}, + weight => 0, + quantity => 0, + }); + my $json = $product->get('variantsJSON'); + #printf "\t\t\t$json\n"; + $session->db->write('update Product set variantsJSON=? where assetId=?',[$json, $product->getId]); + } + $productQuery->finish; + + ##Get all Product assetIds + my $assetSth = $session->db->read('select distinct(assetId) from Product'); + my $accessorySth = $session->db->read('select accessoryAssetId from Product_accessory where assetId=? order by sequenceNumber'); + my $relatedSth = $session->db->read('select relatedAssetId from Product_related where assetId=? order by sequenceNumber'); + my $specificationSth = $session->db->read('select Product_specificationId as specificationId, name, value, units from Product_specification where assetId=? order by sequenceNumber'); + my $featureSth = $session->db->read('select Product_featureId as featureId, feature from Product_feature where assetId=? order by sequenceNumber'); + my $benefitSth = $session->db->read('select Product_benefitId as benefitId, benefit from Product_benefit where assetId=? order by sequenceNumber'); + while (my ($assetId) = $assetSth->array) { + ##For each assetId, get each type of collateral + ##Convert the data to JSON and store it in Product with setCollateral (update) + ##To duplicate across all revisions, do a get and SQL update (with no revisionDate) + + ##Accessories + $accessorySth->execute([$assetId]); + my @accessories = (); + while (my $acc = $accessorySth->hashRef()) { + push @accessories, $acc; + } + my $accJson = to_json(\@accessories); + $session->db->write('update Product set accessoryJSON=? where assetId=?',[$accJson, $assetId]); + + ##Related + $relatedSth->execute([$assetId]); + my @related = (); + while (my $acc = $relatedSth->hashRef()) { + push @related, $acc; + } + my $relJson = to_json(\@related); + $session->db->write('update Product set relatedJSON=? where assetId=?',[$relJson, $assetId]); + + ##Specification + $specificationSth->execute([$assetId]); + my @specification = (); + while (my $spec = $specificationSth->hashRef()) { + push @specification, $spec; + } + my $specJson = to_json(\@specification); + $session->db->write('update Product set specificationJSON=? where assetId=?',[$specJson, $assetId]); + + ##Feature + $featureSth->execute([$assetId]); + my @features = (); + while (my $feature = $featureSth->hashRef()) { + push @features, $feature; + } + my $featJson = to_json(\@features); + $session->db->write('update Product set featureJSON=? where assetId=?',[$featJson, $assetId]); + + ##Benefit + $benefitSth->execute([$assetId]); + my @benefits = (); + while (my $benefit = $benefitSth->hashRef()) { + push @benefits, $benefit; + } + my $beneJson = to_json(\@benefits); + $session->db->write('update Product set benefitJSON=? where assetId=?',[$beneJson, $assetId]); + + } + $assetSth->finish; + + ##Drop collateral tables + $session->db->write('drop table Product_accessory'); + $session->db->write('drop table Product_benefit'); + $session->db->write('drop table Product_feature'); + $session->db->write('drop table Product_related'); + $session->db->write('drop table Product_specification'); + + ## Remove productNumber from Product; + $session->db->write('alter table Product drop column productNumber'); + ## Remove price from Product since prices are now stored in variants + $session->db->write('alter table Product drop column price'); + + ## Update config file, deleting Wobject::Product and adding Sku::Product + $session->config->deleteFromArray('assets', 'WebGUI::Asset::Wobject::Product'); + $session->config->addToArray('assets', 'WebGUI::Asset::Sku::Product'); + + return; +} + +#------------------------------------------------- +sub mergeProductsWithCommerce { + my $session = shift; + print "\tMerge old Commerce Products to new SKU based Products.\n" unless ($quiet); + my $productSth = $session->db->read('select * from products order by title'); + my $variantSth = $session->db->prepare('select * from productVariants where productId=?'); + my $productFolder = WebGUI::Asset->getImportNode($session)->addChild({ + className => 'WebGUI::Asset::Wobject::Folder', + title => 'Products', + url => 'import/products', + isHidden => 1, + groupIdView => 14, + groupIdEdit => 14, + },'PBproductimportnode001'); + $session->db->write("update asset set isSystem=1 where assetId=?",[$productFolder->getId]); + while (my $productData = $productSth->hashRef) { + my $sku = $productFolder->addChild({ + className => 'WebGUI::Asset::Sku::Product', + title => $productData->{title}, + url => $productData->{title}, + sku => $productData->{sku}, + description => $productData->{description}, + }, $productData->{productId}); + + ##Get the parameter and options for this product + my $parameterSth = $session->db->read('select opt.*, param.* from productParameters as param left join productParameterOptions as opt on param.parameterId=opt.parameterId where param.productId=?', [$productData->{productId}]); + my $parameters; my $options; + while (my %row = $parameterSth->hash) { + $parameters->{$row{parameterId}} = { + name => $row{name}, + parameterId => $row{parameterId}, + options => [], + } unless (defined $parameters->{$row{parameterId}}); + if ($row{value}) { + my $option = { + value => $row{value}, + optionId => $row{optionId}, + parameterId => $row{parameterId}, + priceModifier => $row{priceModifier}, + weightModifier => $row{weightModifier}, + skuModifier => $row{skuModifier} + }; + push(@{$parameters->{$row{parameterId}}->{options}}, $row{optionId}); + $options->{$row{optionId}} = $option; + } + } + $parameterSth->finish; + + ##Get the variants + $variantSth->execute([$productData->{productId}]); + while (my $variantData = $variantSth->hashRef) { + my $shortdesc = ''; + foreach (split(/,/,$variantData->{composition})) { + my ($parameterId, $optionId) = split(/\./, $_); + my $parameter = $parameters->{$parameterId}->{name}; + my $value = $options->{$optionId}->{value}; + $shortdesc .= sprintf('%s:%s,', $parameter, $value); + } + $shortdesc =~ s/,$//; ##tidy up and clip to 30 chars + $shortdesc = $productData->{title} unless $shortdesc; + $shortdesc = substr $shortdesc, 0, 30; + + my $variant; + $variant->{varSku} = $variantData->{sku}; + $variant->{price} = $variantData->{price}; + $variant->{weight} = $variantData->{weight}; + $variant->{quantity} = $variantData->{available}; + $variant->{shortdesc} = $shortdesc; + $sku->setCollateral('variantsJSON', 'variantId', 'new', $variant); + } + } + $productSth->finish; + $variantSth->finish; + ##Clean up tables + $session->db->write('drop table products'); + $session->db->write('drop table productParameters'); + $session->db->write('drop table productParameterOptions'); + $session->db->write('drop table productVariants'); + return 1; +} + +#------------------------------------------------- +sub removeOldCommerceCode { + my $session = shift; + print "\tRemoving old commerce code.\n" unless ($quiet); + + my $setting = $session->setting; + $setting->remove('groupIdAdminProductManager'); + $setting->remove('groupIdAdminSubscription'); + $setting->remove('groupIdAdminTransactionLog'); + my $config = $session->config; + unlink ($webguiRoot . '/lib/WebGUI/Asset/Wobject/Product.pm') ; + + rmtree ($webguiRoot . '/lib/WebGUI/Commerce') ; + unlink ($webguiRoot . '/lib/WebGUI/Commerce.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Product.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Subscription.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Operation/TransactionLog.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommercePaymentCash.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommercePaymentCheck.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommercePaymentITransact.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommerceShippingByPrice.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommerceShippingByWeight.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/CommerceShippingPerTransaction.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Workflow_Activity_CacheEMSPrereqs.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Workflow_Activity_ProcessRecurringPayments.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Workflow/Activity/ProcessRecurringPayments.pm') ; + $session->db->write("delete from WorkflowActivity where className='WebGUI::Workflow::Activity::ProcessRecurringPayments'"); + unlink ($webguiRoot . '/lib/WebGUI/Macro/Product.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Help/Macro_Product.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Macro_Product.pm') ; + unlink ($webguiRoot . '/t/Macro/Product.t') ; + + unlink ($webguiRoot . '/lib/WebGUI/Macro/SubscriptionItem.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Macro/SubscriptionItemPurchaseUrl.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Help/Macro_SubscriptionItem.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Macro_SubscriptionItem.pm') ; + unlink ($webguiRoot . '/t/Macro/SubscriptionItem.t') ; + unlink ($webguiRoot . '/t/Macro/SubscriptionItemPurchaseUrl.t') ; + + unlink ($webguiRoot . '/lib/WebGUI/Operation/ProductManager.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Help/ProductManager.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/ProductManager.pm') ; + + unlink ($webguiRoot . '/lib/WebGUI/Operation/Commerce.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Help/Commerce.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Commerce.pm') ; + + unlink ($webguiRoot . '/lib/WebGUI/Operation/Subscription.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/Help/Subscription.pm') ; + unlink ($webguiRoot . '/lib/WebGUI/i18n/English/Subscription.pm') ; + + unlink ($webguiRoot . '/www/extras/adminConsole/subscriptions.gif') ; + unlink ($webguiRoot . '/www/extras/adminConsole/small/subscriptions.gif') ; + unlink ($webguiRoot . '/www/extras/adminConsole/productManager.gif') ; + unlink ($webguiRoot . '/www/extras/adminConsole/small/productManager.gif') ; + + ##Delete unused templates + my $templates = $session->db->read("select distinct(assetId) from template where namespace like 'Commerce%'",[]); + while (my $hash = $templates->hashRef) { + my $template = WebGUI::Asset->newByDynamicClass($session, $hash->{assetId}); + $template->purge; + } + + ##Drop commerce specific tables; + $session->db->write('drop table commerceSettings'); + + #Disable the Product macro in the config file. You can't use the convenience method + #deleteFromHash since the macro name is in the value, not the key. + my %macros = %{ $config->get('macros') }; + foreach (my ($key, $value) = each %macros) { + delete $macros{$key} if $value eq 'Product'; + delete $macros{$key} if $value eq 'SubscriptionItem'; + delete $macros{$key} if $value eq 'SubscriptionItemPurchaseUrl'; + } + $config->set('macros', \%macros); + $config->deleteFromArray('assets','WebGUI::Asset::Wobject::Product'); + return 1; +} + + +#------------------------------------------------- +sub updateUsersOfCommerceMacros { + my $session = shift; + print "\tUpdate assets which might be using the Product and SubscriptionItem macros.\n" unless ($quiet); + my $db = $session->db; + my %tables = ( + wobject => 'description', + snippet => 'snippet', + template => 'template', + Post => 'content', + ); + + foreach my $table (keys %tables) { + print "\t\tUpdating ".$table."s.\n" unless ($quiet); + my $sth = $db->read('select assetId, revisionDate, '.$tables{$table}.' from '.$table.' order by assetId, revisionDate'); + while (my ($id, $rev, $content) = $sth->array) { + my $fixed = $content; + # handle normal subscription item + $fixed =~ s{\^SubscriptionItem\(([A-Za-z0-9_-]{22})\);}{^AssetProxy($1,assetId);}xg; + # handle one with an optional template id attached + $fixed =~ s{\^SubscriptionItem\(([A-Za-z0-9_-]{22}),[A-Za-z0-9_-]{22}\);}{^AssetProxy($1,assetId);}xg; + # handle product macros + while ($fixed =~ m/\^Product\('? ([^),']+) /xg) { + #printf "\t\tWorking on %s\n", $id; + my $identifier = $1; ##If this is a product sku, need to look up by productId; + #printf "\t\t\tFound argument of %s\n", $identifier; + my $assetId = $db->quickScalar('select distinct(assetId) from sku where sku=?',[$identifier]); + #printf "\t\t\tsku assetId: %s\n", $id; + my $productAssetId = $assetId ? $assetId : $identifier; + $fixed =~ s/\^Product\( [^)]+ \)/^AssetProxy($productAssetId,assetId)/x; + #printf "\t\t\tUpdated ".$tables{$table}." to%s\n", $fixed; + } + if ($fixed ne $content) { + $db->write('update '.$table.' set '.$tables{$table}.'=? where assetId=? and revisionDate=?', [$fixed, $id, $rev]); + } + } + } + + return 1; +} + + +#------------------------------------------------- +sub deleteOldProductTemplates { + my $session = shift; + print "\tDeleting all Product Templates, except for the Default Product Template.\n" unless ($quiet); + $session->db->write("update Product set templateId='PBtmpl0000000000000056.tmpl'"); + foreach my $templateId (qw/PBtmpl0000000000000095 PBtmpl0000000000000110 PBtmpl0000000000000119/) { + my $template = WebGUI::Asset->newByDynamicClass($session, $templateId); + $template->purge; + } + return 1; +} + + +#------------------------------------------------- +sub insertCommercePayDriverTable { + my $session = shift; + print "\tInstall the Commerce PayDriver Table.\n" unless ($quiet); + # and here's our code + $session->db->write(<db->write("alter table Thingy_fields modify possibleValues text"); +} + +#------------------------------------------------- +sub removeLegacyTable { + my $session = shift; + print "\tRemoving legacy field table..." unless ($quiet); + $session->db->write("DROP TABLE `wgFieldUserData`"); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addVersionStartEndDates { + my $session = shift; + print "\tAdding Start and End times to Version Tags..." unless ($quiet); + $session->db->write("alter table assetVersionTag add startTime datetime default NULL"); + $session->db->write("alter table assetVersionTag add endTime datetime default NULL"); + + #Add default start and end times to existing version tags + my $now = $session->datetime->time(); + my $startTime = WebGUI::DateTime->new($session,$now)->toDatabase; + my $endTime = WebGUI::DateTime->new($session,'2036-01-01 00:00:00')->toDatabase; + $session->db->write("update assetVersionTag set startTime=?, endTime=?",[$startTime,$endTime]); + + my $activity = $session->config->get( "workflowActivities" ); + push @{ $activity->{"WebGUI::VersionTag"} }, 'WebGUI::Workflow::Activity::WaitUntil'; + $session->config->set( "workflowActivities", $activity ); + + #Update the Workflows + tie my %commitWithApproval, 'Tie::IxHash'; + %commitWithApproval = ( + pbwfactivity0000000017 => { + className =>"WebGUI::Workflow::Activity::RequestApprovalForVersionTag", + properties => { + groupToApprove => '4', + message => 'A new version tag awaits your approval.', + doOnDeny => 'pbworkflow000000000006', + title => 'Get Approval from Content Managers' + }, + }, + vtagactivity0000000001 => { + className =>"WebGUI::Workflow::Activity::WaitUntil", + properties => { + type => 'startTime', + title => 'Wait Until', + description => 'This workflow waits until the value chosen in the "Wait Until" field has passed and then continues' + } + }, + pbwfactivity0000000016 => { + className => "WebGUI::Workflow::Activity::CommitVersionTag", + properties => { + title => 'Commit Assets' + } + }, + pbwfactivity0000000018 => { + className => "WebGUI::Workflow::Activity::NotifyAboutVersionTag", + properties => { + title => 'Notify Committer of Approval', + message => 'Your version tag was approved.', + who => 'committer', + } + } + ); + + #Commit without approval workflow + tie my %commitWithoutApproval, 'Tie::IxHash'; + %commitWithoutApproval = ( + vtagactivity0000000002 => { + className =>"WebGUI::Workflow::Activity::WaitUntil", + properties => { + type => 'startTime', + title => 'Wait Until', + description => 'This workflow waits until the value chosen in the "Wait Until" field has passed and then continues' + } + }, + pbwfactivity0000000006 => { + className => "WebGUI::Workflow::Activity::CommitVersionTag", + properties => { + title => 'Commit Assets', + trashAfter => '2592000', + } + }, + ); + + #Build a hash of the two workflows - kinda ugly but insures we preserve order + my $workflows = { + "pbworkflow000000000005"=>\%commitWithApproval, + "pbworkflow000000000003"=>\%commitWithoutApproval + }; + + + foreach my $workflowId (keys %{$workflows}) { + #instantiate the workflow + my $workflow = WebGUI::Workflow->new($session, $workflowId); + + #Skip it if the workflow activity doesn't exist for some reason + next unless (defined $workflow); + + #delete all the existing activities in the workflow + my $activities = $workflow->getActivities; + foreach my $activity (@{$activities}) { + $workflow->deleteActivity ($activity->get("activityId")); + } + + #Re-add the activities in the proper order + my $activityHashRef = $workflows->{$workflowId}; + foreach my $activityId (keys %{$activityHashRef}) { + my $activity = $workflow->addActivity($activityHashRef->{$activityId}->{className},$activityId); + my $properties = $activityHashRef->{$activityId}->{properties}; + foreach my $property (keys %{$properties}) { + $activity->set($property,$properties->{$property}); + } + } + } + + print "Done.\n" unless $quiet; + +} + +#------------------------------------------------- +sub migrateSubscriptions { + my $session = shift; + print "\tMigrating subscriptions to the new commerce system...\n" unless ($quiet); + + # Check if codes are tied to multiple subscriptions. + my ($hasDoubles) = $session->db->buildArray( + 'select count(*) as cnt from subscriptionCodeSubscriptions group by code order by cnt desc' + ); + print "\n\t\t!!WARNING: There are subscription codes that link to multiple subscriptions!!" + ." Please refer to gotcha.txt!\n" if $hasDoubles > 1 && !$quiet; + + # Rename old subscription table so we can reuse it for the Sku + $session->db->write('alter table subscription rename to Subscription_OLD'); + + # Create the new subscription table + $session->db->write(<db->write(<db->write(<getImportNode( $session )->addChild({ + className => 'WebGUI::Asset::Wobject::Folder', + menuTitle => 'Migrated subscriptions', + title => 'Migrated subscriptions', + ownerUserId => 3, + }); + + # Migrate all subscriptions + print "\t\tConverting subscriptions to assets:\n" unless $quiet; + my $subscriptions = $session->db->read( 'select * from Subscription_OLD' ); + while (my $subscription = $subscriptions->hashRef) { + # Don't migrate deleted subscriptions + next if $subscription->{ deleted }; + + # Add a new subscription sku + my $sku = $subscriptionsFolder->addChild( + { + className => 'WebGUI::Asset::Sku::Subscription', + ownerUserId => 3, + isHidden => 1, + url => 'subscriptions/'.$subscription->{ description }, + menuTitle => $subscription->{ description }, + title => $subscription->{ description }, + price => $subscription->{ price }, + description => $subscription->{ description }, + subscriptionGroup => $subscription->{ subscriptionGroup }, + duration => $subscription->{ duration }, + executeOnSubscription => $subscription->{ executeOnSubscription }, + karma => $subscription->{ karma }, + templateId => 'eqb9sWjFEVq0yHunGV8IGw', + overrideTaxRate => $subscription->{ useSalesTax } ? 0 : 1, + taxRateOverride => 0, + }, + $subscription->{ subscriptionId }, + ); + + # Log and print migration data + my $message = "Migrated subscription '$subscription->{ description }' ($subscription->{ subscriptionId }) " + . " to '" . $sku->getUrl . "' (" . $sku->getId . ")"; + $session->errorHandler->warn( $message ); + print "\t\t--> $message\n"; + } + $subscriptions->finish; + + # Subscriptions are migrated, now migrate the subscription codes + # First find batches with multiple subscriptions per code + my @multiBatches = $session->db->buildArray( + 'select distinct batchId from subscriptionCode where code in ' + .' (select code from subscriptionCodeSubscriptions group by code having count(subscriptionId) > 1)' + ); + + # Migrate subscription codes batch by batch + print "\t\tMigrating subscription codes.\n" unless $quiet; + my @batches = $session->db->buildArray('select distinct batchId from subscriptionCodeBatch'); + foreach my $batchId ( @batches ) { + my $subscriptionId; + + # Fetch batch properties and the number of code. Discard used or expired codes. + my ($numberOfCodes, $codeLength, $expirationDate, $dateCreated, $name, $description) = + $session->db->quickArray( + 'select count(*), length(t1.code), (t1.dateCreated + t1.expires), ' + .' t1.dateCreated, t2.name, t2.description ' + .' from subscriptionCode as t1, subscriptionCodeBatch as t2 ' + .' where t1.batchId=t2.batchId and t1.batchId=? ' + .' and t1.status=\'Unused\' ' + .' and from_unixtime(t1.dateCreated + t1.expires) > now() ' + .' group by t1.batchId', + [ + $batchId, + ] + ); + + # Skip expired or fully used batches; + next unless $numberOfCodes; + + # Check if the codes in this batch link to multiple subscriptions + if ( isIn( $batchId, @multiBatches ) ) { + my $message = "\t\tBatch $batchId has codes linking to multiple subscriptions:\n"; + + # Find the subscriptions the code in this batch are attached to + my @subscriptions = $session->db->buildArray( + 'select distinct subscriptionId from subscriptionCodeSubscriptions where code in ' + .' (select distinct code from subscriptionCode where batchId=?)', + [ + $batchId, + ] + ); + + # Migrate the codes for the first subscription in the list (this is done below) + $subscriptionId = shift @subscriptions; + + my $subscription = WebGUI::Asset::Sku::Subscription->new($session, $subscriptionId); + $message .= "\t\t--> Keeping codes for subscription " + . "'" . $subscription->get('title') . "' (" . $subscription->getUrl . ") \n"; + + # And generate new codes for the remaining subscriptions + foreach my $assetId ( @subscriptions ) { + my $subscription = WebGUI::Asset::Sku::Subscription->new($session, $assetId); + + $message .= "\t\t--> Generating new codes for subscription " + . "'" . $subscription->get('title') . "' (" . $subscription->getUrl . "): \n"; + + my $batchId = $subscription->generateSubscriptionCodeBatch( + $numberOfCodes, + $codeLength, + $expirationDate, + $name, + $description + ); + + $message .= "\t\t\t" . join( "\n\t\t\t", keys %{ $subscription->getCodesInBatch( $batchId ) } ). "\n"; + } + + # Log and print migration info + $session->errorHandler->warn( $message ); + print $message unless $quiet; + } + else { + $subscriptionId = $session->db->quickScalar( + 'select distinct subscriptionId from subscriptionCodeSubscriptions ' + .' where code in (select code from subscriptionCode where batchId=?)', + [ + $batchId, + ] + ); + } + + # Migrate the batch itself + $session->db->write( + 'insert into Subscription_codeBatch ' + . ' (batchId, name, description, subscriptionId, expirationDate, dateCreated) ' + . ' values (? , ? , ? , ? , ? , ? ) ', + [ + $batchId, + $name, + $description, + $subscriptionId, + $expirationDate, + $dateCreated, + ] + ); + + # Migrate the codes + $session->db->write( + 'insert into Subscription_code (batchId, code, status, dateUsed, usedBy) ' + .' select batchId, code, status, dateUsed, usedBy from subscriptionCode where batchId=?', + [ + $batchId, + ] + ); + } + print "\t\tAdding subscriptions to the config file:\n" unless $quiet; + $session->config->addToArray('assets', 'WebGUI::Asset::Sku::Subscription'); + + print "\tDone.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addDBLinkAccessToSQLMacro { + my $session = shift; + print "\tAdding DBLink access to SQL Macro ..." unless ($quiet); + $session->db->write("insert into databaseLink (databaseLinkId, allowMacroAccess) values ('0','1')"); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub migratePaymentPlugins { + my $session = shift; + print "\tMigrating WebGUI default commerce plugins..." unless $quiet; + + foreach my $namespace (qw{ Cash ITransact }) { + # Get properties from old plugin + my $properties = $session->db->buildHashRef( + 'select fieldName, fieldValue from commerceSettings where type=\'Payment\' and namespace=?', + [ + $namespace, + ] + ); + + # And set new properties + $properties->{ groupToUse } = $properties->{ whoCanUse }; + $properties->{ receiptEmailTemplateId } = 'BMzuE91-XB8E-XGll1zpvA'; + + # Create paydriver instance + my $plugin = + WebGUI::Pluggable::instanciate("WebGUI::Shop::PayDriver::$namespace", 'create', [ + $session, + $properties->{ label } || $namespace || 'Credit Card', + $properties + ]) + ; + + # Print warning message for ITransact users that they must change their postback url + if ( $namespace eq 'ITransact' && $properties->{ vendorId } ) { + print "\n\t\t!!CAUTION!!: The postback url for ITransact has changed. Please log in to your virtual " + ."terminal and change the postback url to:\n\n\t\t" + .'https://'.$session->config->get("sitename")->[0] + .'/?shop=pay;method=do;do=processRecurringTransactionPostback;paymentGatewayId='.$plugin->getId."\n\t"; + } + } + + print "Done\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub removeRecurringPaymentActivity { + my $session = shift; + print "\tRemoving the recurring payment workflow activity..." unless $quiet; + + my $activities = $session->config->get( 'workflowActivities' ); + + my $none = $activities->{ None }; + $activities->{ None } = [ grep { !/^WebGUI::Workflow::Activity::ProcessRecurringPayments$/ } @{ $none } ]; + + $session->config->set( 'workflowActivities', $activities ); + + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- + +sub addUserListWobject { + my $session = shift; + print "\tInstall UserList wobject.\n" unless ($quiet); + $session->db->write("create table UserList ( + assetId varchar(22) not null, + revisionDate bigint(20), + templateId varchar(22), + showGroupId varchar(22), + hideGroupId varchar(22), + usersPerPage int(11), + alphabet text, + alphabetSearchField varchar(128), + showOnlyVisibleAsNamed int(11), + sortBy varchar(128), + sortOrder varchar(4), + overridePublicEmail int(11), + overridePublicProfile int(11), + PRIMARY KEY (`assetId`,`revisionDate`) + )"); + $session->config->addToArray("assets","WebGUI::Asset::Wobject::UserList"); + +} + +#---------------------------------------------------------------------------- +# Add the inheritUrlFromParent property for all assets +sub addInheritUrlFromParent { + my $session = shift; + print "\tAdding inheritUrlFromParent flag for all assets..." unless $quiet; + $session->db->write('alter table assetData add column inheritUrlFromParent int(11) not null default 0'); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub fixAdminConsoleTemplateTitles { + my $session = shift; + print "\tMaking unique title for admin console templates... " unless $quiet; + my $ac = WebGUI::Asset->newByDynamicClass($session, 'PBtmpl0000000000000137'); + $ac->update({title => 'Admin Console Style'}); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Make longer asset metadata values +sub makeLongerAssetMetadataValues { + my $session = shift; + print "\tLengthening asset metadata values to 255 characters... " unless $quiet; + $session->db->write( + q{ ALTER TABLE `metaData_properties` CHANGE COLUMN defaultValue defaultValue VARCHAR(255) }, + ); + $session->db->write( + q{ ALTER TABLE `metaData_values` CHANGE COLUMN value value VARCHAR(255) }, + ); + print "DONE!\n" unless $quiet; +} + +sub ensureCorrectDefaults { + my $session = shift; + print "\tEnsuring correct database defaults..." unless $quiet; + my $sql = <<'END_SQL'; + +ALTER TABLE `Article` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600', + MODIFY `storageId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `Calendar` + MODIFY `revisionDate` bigint(20) unsigned NOT NULL DEFAULT '0', + MODIFY `visitorCacheTimeout` int(11) unsigned DEFAULT NULL, + MODIFY `workflowIdCommit` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `Collaboration` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `postGroupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `canStartThreadGroupId` varchar(22) NOT NULL DEFAULT '2', + MODIFY `karmaPerPost` int(11) NOT NULL DEFAULT '0', + MODIFY `collaborationTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `threadTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `postFormTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `searchTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `notificationTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `sortBy` varchar(35) NOT NULL DEFAULT 'assetData.revisionDate', + MODIFY `sortOrder` varchar(4) NOT NULL DEFAULT 'desc', + MODIFY `usePreview` int(11) NOT NULL DEFAULT '1', + MODIFY `addEditStampToPosts` int(11) NOT NULL DEFAULT '0', + MODIFY `editTimeout` int(11) NOT NULL DEFAULT '3600', + MODIFY `attachmentsPerPost` int(11) NOT NULL DEFAULT '0', + MODIFY `filterCode` varchar(30) NOT NULL DEFAULT 'javascript', + MODIFY `useContentFilter` int(11) NOT NULL DEFAULT '1', + MODIFY `threads` int(11) NOT NULL DEFAULT '0', + MODIFY `views` int(11) NOT NULL DEFAULT '0', + MODIFY `replies` int(11) NOT NULL DEFAULT '0', + MODIFY `rating` int(11) NOT NULL DEFAULT '0', + MODIFY `lastPostId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `archiveAfter` int(11) NOT NULL DEFAULT '31536000', + MODIFY `postsPerPage` int(11) NOT NULL DEFAULT '10', + MODIFY `threadsPerPage` int(11) NOT NULL DEFAULT '30', + MODIFY `subscriptionGroupId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `allowReplies` int(11) NOT NULL DEFAULT '0', + MODIFY `displayLastReply` int(11) NOT NULL DEFAULT '0', + MODIFY `richEditor` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PBrichedit000000000002', + MODIFY `karmaRatingMultiplier` int(11) NOT NULL DEFAULT '0', + MODIFY `karmaSpentToRate` int(11) NOT NULL DEFAULT '0', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `avatarsEnabled` int(11) NOT NULL DEFAULT '0', + MODIFY `approvalWorkflow` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'pbworkflow000000000003', + MODIFY `threadApprovalWorkflow` varchar(22) NOT NULL DEFAULT 'pbworkflow000000000003', + MODIFY `defaultKarmaScale` int(11) NOT NULL DEFAULT '1', + MODIFY `getMail` int(11) NOT NULL DEFAULT '0', + MODIFY `getMailInterval` int(11) NOT NULL DEFAULT '300', + MODIFY `getMailCronId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `visitorCacheTimeout` int(11) NOT NULL DEFAULT '3600', + MODIFY `autoSubscribeToThread` int(11) NOT NULL DEFAULT '1', + MODIFY `requireSubscriptionForEmailPosting` int(11) NOT NULL DEFAULT '1', + MODIFY `thumbnailSize` int(11) NOT NULL DEFAULT '0', + MODIFY `maxImageSize` int(11) NOT NULL DEFAULT '0', + MODIFY `enablePostMetaData` int(11) NOT NULL DEFAULT '0', + MODIFY `useCaptcha` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Dashboard` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `adminsGroupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '4', + MODIFY `usersGroupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'DashboardViewTmpl00001', + MODIFY `isInitialized` tinyint(3) unsigned NOT NULL DEFAULT '0' +; + +ALTER TABLE `DataForm` + MODIFY `mailData` int(11) NOT NULL DEFAULT '1', + MODIFY `emailTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `acknowlegementTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `listTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `defaultView` int(11) NOT NULL DEFAULT '0', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `groupToViewEntries` varchar(22) NOT NULL DEFAULT '7' +; + +ALTER TABLE `DataForm_entry` + MODIFY `DataForm_entryId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `EMSBadge` + MODIFY `price` float NOT NULL DEFAULT '0', + MODIFY `seatsAvailable` int(11) NOT NULL DEFAULT '100' +; + +ALTER TABLE `EMSEventMetaField` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `EMSRegistrant` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `transactionItemId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `EMSRegistrantRibbon` + MODIFY `transactionItemId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `EMSRegistrantTicket` + MODIFY `transactionItemId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `EMSRibbon` + MODIFY `percentageDiscount` float NOT NULL DEFAULT '10', + MODIFY `price` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `EMSTicket` + MODIFY `price` float NOT NULL DEFAULT '0', + MODIFY `seatsAvailable` int(11) NOT NULL DEFAULT '100', + MODIFY `duration` float NOT NULL DEFAULT '1' +; + +ALTER TABLE `EMSToken` + MODIFY `price` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `Event` + MODIFY `timeZone` varchar(255) character set utf8 collate utf8_bin DEFAULT 'America/Chicago' +; + +ALTER TABLE `EventManagementSystem` + MODIFY `groupToApproveEvents` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `timezone` varchar(30) NOT NULL DEFAULT 'America/Chicago', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2rC4ErZ3c77OJzJm7O5s3w', + MODIFY `badgeBuilderTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'BMybD3cEnmXVk2wQ_qEsRQ', + MODIFY `lookupRegistrantTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'OOyMH33plAy6oCj_QWrxtg', + MODIFY `printBadgeTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PsFn7dJt4wMwBa8hiE3hOA', + MODIFY `printTicketTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'yBwydfooiLvhEFawJb0VTQ' +; + +ALTER TABLE `FileAsset` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `storageId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `filename` varchar(255) NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `FlatDiscount` + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '63ix2-hU0FchXGIWkG3tow', + MODIFY `mustSpend` float NOT NULL DEFAULT '0', + MODIFY `percentageDiscount` int(3) NOT NULL DEFAULT '0', + MODIFY `priceDiscount` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `Folder` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `visitorCacheTimeout` int(11) NOT NULL DEFAULT '3600', + MODIFY `sortAlphabetically` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Gallery` + MODIFY `groupIdAddComment` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `groupIdAddFile` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `richEditIdComment` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdAddArchive` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdDeleteAlbum` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdDeleteFile` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdEditAlbum` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdEditFile` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdListAlbums` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdListAlbumsRss` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdListFilesForUser` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdListFilesForUserRss` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdMakeShortcut` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdSearch` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdViewSlideshow` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdViewThumbnails` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdViewAlbum` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdViewAlbumRss` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdViewFile` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `workflowIdCommit` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `templateIdEditComment` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `richEditIdAlbum` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `richEditIdFile` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `GalleryAlbum` + MODIFY `assetIdThumbnail` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `GalleryFile_comment` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `HttpProxy` + MODIFY `cookieJarStorageId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '0', + MODIFY `useAmpersand` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `ITransact_recurringStatus` + MODIFY `gatewayId` varchar(128) NOT NULL DEFAULT '', + MODIFY `initDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `lastTransaction` bigint(20) NOT NULL DEFAULT '0', + MODIFY `status` varchar(10) NOT NULL DEFAULT '', + MODIFY `recipe` varchar(15) NOT NULL DEFAULT '' +; + +ALTER TABLE `ImageAsset` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `thumbnailSize` int(11) NOT NULL DEFAULT '50', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `InOutBoard` + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `reportViewerGroup` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `inOutGroup` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `inOutTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'IOB0000000000000000001', + MODIFY `reportTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'IOB0000000000000000002', + MODIFY `paginateAfter` int(11) NOT NULL DEFAULT '50', + MODIFY `reportPaginateAfter` int(11) NOT NULL DEFAULT '50' +; + +ALTER TABLE `Layout` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Matrix` + MODIFY `detailTemplateId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `compareTemplateId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `searchTemplateId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `ratingDetailTemplateId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `maxComparisons` int(11) NOT NULL DEFAULT '10', + MODIFY `maxComparisonsPrivileged` int(11) NOT NULL DEFAULT '10', + MODIFY `privilegedGroup` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `groupToRate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `ratingTimeout` int(11) NOT NULL DEFAULT '31536000', + MODIFY `ratingTimeoutPrivileged` int(11) NOT NULL DEFAULT '31536000', + MODIFY `groupToAdd` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `visitorCacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `Matrix_field` + MODIFY `fieldId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `category` varchar(255) NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `Matrix_listing` + MODIFY `listingId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `maintainerId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `forumId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `views` int(11) NOT NULL DEFAULT '0', + MODIFY `compares` int(11) NOT NULL DEFAULT '0', + MODIFY `clicks` int(11) NOT NULL DEFAULT '0', + MODIFY `status` varchar(30) NOT NULL DEFAULT 'pending', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `approvalMessageId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `storageId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `Matrix_listingData` + MODIFY `listingId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `fieldId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `Matrix_rating` + MODIFY `timeStamp` int(11) NOT NULL DEFAULT '0', + MODIFY `rating` int(11) NOT NULL DEFAULT '1', + MODIFY `listingId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `Matrix_ratingSummary` + MODIFY `listingId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `category` varchar(255) NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `MessageBoard` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `visitorCacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `MultiSearch` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) unsigned NOT NULL DEFAULT '0', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'MultiSearchTmpl0000001', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `Navigation` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `descendantEndPoint` int(11) NOT NULL DEFAULT '55', + MODIFY `showSystemPages` int(11) NOT NULL DEFAULT '0', + MODIFY `showHiddenPages` int(11) NOT NULL DEFAULT '0', + MODIFY `showUnprivilegedPages` int(11) NOT NULL DEFAULT '0', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `ancestorEndPoint` int(11) NOT NULL DEFAULT '55', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Newsletter` + MODIFY `newsletterTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'newsletter000000000001', + MODIFY `mySubscriptionsTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'newslettersubscrip0001' +; + +ALTER TABLE `Newsletter_subscriptions` + MODIFY `lastTimeSent` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `PM_project` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `projectManager` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `percentComplete` float NOT NULL DEFAULT '0', + MODIFY `parentId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `projectObserver` varchar(22) character set utf8 collate utf8_bin DEFAULT '7' +; + +ALTER TABLE `PM_task` + MODIFY `parentId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1', + MODIFY `taskType` enum('timed','progressive','milestone') NOT NULL DEFAULT 'timed' +; + +ALTER TABLE `PM_wobject` + MODIFY `projectDashboardTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0001', + MODIFY `projectDisplayTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0002', + MODIFY `ganttChartTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0003', + MODIFY `editTaskTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0004', + MODIFY `groupToAdd` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `resourcePopupTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0005', + MODIFY `resourceListTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'ProjectManagerTMPL0006' +; + +ALTER TABLE `Photo_rating` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `Poll` + MODIFY `active` int(11) NOT NULL DEFAULT '1', + MODIFY `graphWidth` int(11) NOT NULL DEFAULT '150', + MODIFY `karmaPerVote` int(11) NOT NULL DEFAULT '0', + MODIFY `randomizeAnswers` int(11) NOT NULL DEFAULT '0', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Poll_answer` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `Post` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `threadId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `views` int(11) NOT NULL DEFAULT '0', + MODIFY `contentType` varchar(35) NOT NULL DEFAULT 'mixed', + MODIFY `storageId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `rating` int(11) NOT NULL DEFAULT '0', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Post_rating` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `ipAddress` varchar(15) NOT NULL DEFAULT '', + MODIFY `rating` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Product` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `RSSCapable` + MODIFY `rssCapableRssEnabled` int(11) NOT NULL DEFAULT '1', + MODIFY `rssCapableRssTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PBtmpl0000000000000142', + MODIFY `rssCapableRssFromParentId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `RichEdit` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `askAboutRichEdit` int(11) NOT NULL DEFAULT '0', + MODIFY `preformatted` int(11) NOT NULL DEFAULT '0', + MODIFY `editorWidth` int(11) NOT NULL DEFAULT '0', + MODIFY `editorHeight` int(11) NOT NULL DEFAULT '0', + MODIFY `sourceEditorWidth` int(11) NOT NULL DEFAULT '0', + MODIFY `sourceEditorHeight` int(11) NOT NULL DEFAULT '0', + MODIFY `useBr` int(11) NOT NULL DEFAULT '0', + MODIFY `nowrap` int(11) NOT NULL DEFAULT '0', + MODIFY `removeLineBreaks` int(11) NOT NULL DEFAULT '0', + MODIFY `npwrap` int(11) NOT NULL DEFAULT '0', + MODIFY `directionality` char(3) NOT NULL DEFAULT 'ltr', + MODIFY `toolbarLocation` varchar(6) NOT NULL DEFAULT 'bottom', + MODIFY `enableContextMenu` int(11) NOT NULL DEFAULT '0', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `inlinePopups` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `SQLReport` + MODIFY `paginateAfter` int(11) NOT NULL DEFAULT '50', + MODIFY `debugMode` int(11) NOT NULL DEFAULT '0', + MODIFY `databaseLinkId1` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `databaseLinkId2` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `databaseLinkId3` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `databaseLinkId4` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `databaseLinkId5` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Shelf` + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'nFen0xjkZn8WkpM93C9ceQ' +; + +ALTER TABLE `Shortcut` + MODIFY `overrideTitle` int(11) NOT NULL DEFAULT '0', + MODIFY `overrideDescription` int(11) NOT NULL DEFAULT '0', + MODIFY `overrideTemplate` int(11) NOT NULL DEFAULT '0', + MODIFY `overrideDisplayTitle` int(11) NOT NULL DEFAULT '0', + MODIFY `overrideTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `shortcutByCriteria` int(11) NOT NULL DEFAULT '0', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `shortcutToAssetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `disableContentLock` int(11) NOT NULL DEFAULT '0', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `showReloadIcon` tinyint(3) unsigned NOT NULL DEFAULT '0' +; + +ALTER TABLE `Shortcut_overrides` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `fieldName` varchar(255) NOT NULL DEFAULT '' +; + +ALTER TABLE `StockData` + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'StockListTMPL000000001', + MODIFY `displayTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'StockListTMPL000000002' +; + +ALTER TABLE `Subscription` + MODIFY `templateId` varchar(22) NOT NULL DEFAULT '', + MODIFY `price` float NOT NULL DEFAULT '0', + MODIFY `subscriptionGroup` varchar(22) NOT NULL DEFAULT '2', + MODIFY `duration` varchar(12) NOT NULL DEFAULT 'Monthly' +; + +ALTER TABLE `Subscription_OLD` + MODIFY `subscriptionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `subscriptionGroup` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `duration` varchar(12) NOT NULL DEFAULT 'Monthly' +; + +ALTER TABLE `Subscription_code` + MODIFY `status` varchar(10) NOT NULL DEFAULT 'Unused' +; + +ALTER TABLE `Survey` + MODIFY `groupToTakeSurvey` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `groupToViewReports` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `anonymous` char(1) NOT NULL DEFAULT '0', + MODIFY `questionsPerPage` int(11) NOT NULL DEFAULT '1', + MODIFY `responseTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `overviewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `maxResponsesPerUser` int(11) NOT NULL DEFAULT '1', + MODIFY `questionsPerResponse` int(11) NOT NULL DEFAULT '9999999', + MODIFY `gradebookTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Survey_answer` + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_questionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_answerId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1', + MODIFY `gotoQuestion` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `isCorrect` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Survey_question` + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_questionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1', + MODIFY `allowComment` int(11) NOT NULL DEFAULT '0', + MODIFY `randomizeAnswers` int(11) NOT NULL DEFAULT '0', + MODIFY `Survey_sectionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `Survey_questionResponse` + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_questionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_answerId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_responseId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `dateOfResponse` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Survey_response` + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_responseId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `startDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `endDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `isComplete` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Survey_section` + MODIFY `Survey_id` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `Survey_sectionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `SyndicatedContent` + MODIFY `maxHeadlines` int(11) NOT NULL DEFAULT '0', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `displayMode` varchar(20) NOT NULL DEFAULT 'interleaved', + MODIFY `hasTerms` varchar(255) NOT NULL DEFAULT '', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `TT_projectList` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `TT_projectResourceList` + MODIFY `resourceId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `TT_report` + MODIFY `reportComplete` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `TT_wobject` + MODIFY `userViewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'TimeTrackingTMPL000001', + MODIFY `managerViewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'TimeTrackingTMPL000002', + MODIFY `timeRowTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'TimeTrackingTMPL000003', + MODIFY `pmAssetId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `groupToManage` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `pmIntegration` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Thingy_things` + MODIFY `thingsPerPage` int(11) NOT NULL DEFAULT '25' +; + +ALTER TABLE `Thread` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `replies` int(11) NOT NULL DEFAULT '0', + MODIFY `lastPostId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `isLocked` int(11) NOT NULL DEFAULT '0', + MODIFY `isSticky` int(11) NOT NULL DEFAULT '0', + MODIFY `subscriptionGroupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `karma` int(11) NOT NULL DEFAULT '0', + MODIFY `karmaScale` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `Thread_read` + MODIFY `threadId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `UserList` + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `WSClient` + MODIFY `uri` varchar(255) NOT NULL DEFAULT '', + MODIFY `proxy` varchar(255) NOT NULL DEFAULT '', + MODIFY `preprocessMacros` int(11) NOT NULL DEFAULT '0', + MODIFY `paginateAfter` int(11) NOT NULL DEFAULT '50', + MODIFY `debugMode` int(11) NOT NULL DEFAULT '0', + MODIFY `execute_by_default` tinyint(4) NOT NULL DEFAULT '1', + MODIFY `decodeUtf8` tinyint(3) unsigned NOT NULL DEFAULT '0', + MODIFY `sharedCache` tinyint(3) unsigned NOT NULL DEFAULT '0', + MODIFY `cacheTTL` smallint(5) unsigned NOT NULL DEFAULT '60', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `WeatherData` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) unsigned NOT NULL DEFAULT '0', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WeatherDataTmpl0000001' +; + +ALTER TABLE `WikiMaster` + MODIFY `groupToEditPages` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '2', + MODIFY `groupToAdminister` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `richEditor` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PBrichedit000000000002', + MODIFY `frontPageTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiFrontTmpl000000001', + MODIFY `pageTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiPageTmpl0000000001', + MODIFY `pageEditTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiPageEditTmpl000001', + MODIFY `recentChangesTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiRCTmpl000000000001', + MODIFY `mostPopularTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiMPTmpl000000000001', + MODIFY `pageHistoryTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiPHTmpl000000000001', + MODIFY `searchTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiSearchTmpl00000001', + MODIFY `recentChangesCount` int(11) NOT NULL DEFAULT '50', + MODIFY `recentChangesCountFront` int(11) NOT NULL DEFAULT '10', + MODIFY `mostPopularCount` int(11) NOT NULL DEFAULT '50', + MODIFY `mostPopularCountFront` int(11) NOT NULL DEFAULT '10', + MODIFY `thumbnailSize` int(11) NOT NULL DEFAULT '0', + MODIFY `maxImageSize` int(11) NOT NULL DEFAULT '0', + MODIFY `approvalWorkflow` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'pbworkflow000000000003', + MODIFY `byKeywordTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'WikiKeyword00000000001', + MODIFY `allowAttachments` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `WikiPage` + MODIFY `views` bigint(20) NOT NULL DEFAULT '0', + MODIFY `isProtected` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `Workflow` + MODIFY `title` varchar(255) NOT NULL DEFAULT 'Untitled', + MODIFY `enabled` int(11) NOT NULL DEFAULT '0', + MODIFY `type` varchar(255) NOT NULL DEFAULT 'None', + MODIFY `mode` varchar(20) NOT NULL DEFAULT 'parallel' +; + +ALTER TABLE `WorkflowActivity` + MODIFY `title` varchar(255) NOT NULL DEFAULT 'Untitled', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `WorkflowInstance` + MODIFY `priority` int(11) NOT NULL DEFAULT '2' +; + +ALTER TABLE `WorkflowSchedule` + MODIFY `title` varchar(255) NOT NULL DEFAULT 'Untitled', + MODIFY `enabled` int(11) NOT NULL DEFAULT '0', + MODIFY `runOnce` int(11) NOT NULL DEFAULT '0', + MODIFY `minuteOfHour` varchar(25) NOT NULL DEFAULT '0', + MODIFY `hourOfDay` varchar(25) NOT NULL DEFAULT '*', + MODIFY `dayOfMonth` varchar(25) NOT NULL DEFAULT '*', + MODIFY `monthOfYear` varchar(25) NOT NULL DEFAULT '*', + MODIFY `dayOfWeek` varchar(25) NOT NULL DEFAULT '*', + MODIFY `priority` int(11) NOT NULL DEFAULT '2' +; + +ALTER TABLE `ZipArchiveAsset` + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `showPage` varchar(255) NOT NULL DEFAULT 'index.html' +; + +ALTER TABLE `adSpace` + MODIFY `costPerImpression` decimal(11,2) NOT NULL DEFAULT '0.00', + MODIFY `minimumImpressions` int(11) NOT NULL DEFAULT '1000', + MODIFY `costPerClick` decimal(11,2) NOT NULL DEFAULT '0.00', + MODIFY `minimumClicks` int(11) NOT NULL DEFAULT '1000', + MODIFY `width` int(11) NOT NULL DEFAULT '468', + MODIFY `height` int(11) NOT NULL DEFAULT '60', + MODIFY `groupToPurchase` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3' +; + +ALTER TABLE `addressBook` + MODIFY `sessionId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `advertisement` + MODIFY `isActive` int(11) NOT NULL DEFAULT '0', + MODIFY `type` varchar(15) NOT NULL DEFAULT 'text', + MODIFY `storageId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `borderColor` varchar(7) NOT NULL DEFAULT '#000000', + MODIFY `textColor` varchar(7) NOT NULL DEFAULT '#000000', + MODIFY `backgroundColor` varchar(7) NOT NULL DEFAULT '#ffffff', + MODIFY `clicks` int(11) NOT NULL DEFAULT '0', + MODIFY `clicksBought` int(11) NOT NULL DEFAULT '0', + MODIFY `impressions` int(11) NOT NULL DEFAULT '0', + MODIFY `impressionsBought` int(11) NOT NULL DEFAULT '0', + MODIFY `priority` int(11) NOT NULL DEFAULT '0', + MODIFY `nextInPriority` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `asset` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `parentId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `lineage` varchar(255) NOT NULL DEFAULT '', + MODIFY `state` varchar(35) NOT NULL DEFAULT '', + MODIFY `className` varchar(255) NOT NULL DEFAULT '', + MODIFY `creationDate` bigint(20) NOT NULL DEFAULT '997995720', + MODIFY `createdBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `stateChanged` varchar(22) NOT NULL DEFAULT '997995720', + MODIFY `stateChangedBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '3', + MODIFY `isLockedBy` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `isSystem` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `assetData` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `revisedBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `tagId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `status` varchar(35) NOT NULL DEFAULT 'pending', + MODIFY `title` varchar(255) NOT NULL DEFAULT 'untitled', + MODIFY `menuTitle` varchar(255) NOT NULL DEFAULT 'untitled', + MODIFY `url` varchar(255) NOT NULL DEFAULT '', + MODIFY `ownerUserId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `groupIdView` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `groupIdEdit` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `newWindow` int(11) NOT NULL DEFAULT '0', + MODIFY `isHidden` int(11) NOT NULL DEFAULT '0', + MODIFY `isPackage` int(11) NOT NULL DEFAULT '0', + MODIFY `isPrototype` int(11) NOT NULL DEFAULT '0', + MODIFY `encryptPage` int(11) NOT NULL DEFAULT '0', + MODIFY `assetSize` int(11) NOT NULL DEFAULT '0', + MODIFY `skipNotification` int(11) NOT NULL DEFAULT '0', + MODIFY `isExportable` int(11) NOT NULL DEFAULT '1', + MODIFY `inheritUrlFromParent` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `assetHistory` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `dateStamp` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `assetIndex` + MODIFY `ownerUserId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `groupIdView` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `groupIdEdit` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `isPublic` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `assetVersionTag` + MODIFY `tagId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `name` varchar(255) NOT NULL DEFAULT '', + MODIFY `isCommitted` int(11) NOT NULL DEFAULT '0', + MODIFY `creationDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `createdBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `commitDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `committedBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `isLocked` int(11) NOT NULL DEFAULT '0', + MODIFY `lockedBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `groupToUse` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `workflowId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `workflowInstanceId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `authentication` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `authMethod` varchar(30) NOT NULL DEFAULT '', + MODIFY `fieldName` varchar(128) NOT NULL DEFAULT '' +; + +ALTER TABLE `cart` + MODIFY `shippingAddressId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `shipperId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `couponId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `cartItem` + MODIFY `shippingAddressId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `quantity` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `databaseLink` + MODIFY `databaseLinkId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `allowMacroAccess` int(11) NOT NULL DEFAULT '0', + MODIFY `additionalParameters` varchar(255) NOT NULL DEFAULT '' +; + +ALTER TABLE `donation` + MODIFY `defaultPrice` float NOT NULL DEFAULT '100' +; + +ALTER TABLE `groupGroupings` + MODIFY `groupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `groupings` + MODIFY `groupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `expireDate` bigint(20) NOT NULL DEFAULT '2114402400', + MODIFY `groupAdmin` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `groups` + MODIFY `groupId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `expireOffset` int(11) NOT NULL DEFAULT '314496000', + MODIFY `karmaThreshold` int(11) NOT NULL DEFAULT '1000000000', + MODIFY `dateCreated` int(11) NOT NULL DEFAULT '997938000', + MODIFY `lastUpdated` int(11) NOT NULL DEFAULT '997938000', + MODIFY `deleteOffset` int(11) NOT NULL DEFAULT '14', + MODIFY `expireNotifyOffset` int(11) NOT NULL DEFAULT '-14', + MODIFY `expireNotify` int(11) NOT NULL DEFAULT '0', + MODIFY `autoAdd` int(11) NOT NULL DEFAULT '0', + MODIFY `autoDelete` int(11) NOT NULL DEFAULT '0', + MODIFY `databaseLinkId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `groupCacheTimeout` int(11) NOT NULL DEFAULT '3600', + MODIFY `isEditable` int(11) NOT NULL DEFAULT '1', + MODIFY `showInForms` int(11) NOT NULL DEFAULT '1', + MODIFY `ldapLinkId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `imageColor` + MODIFY `name` varchar(255) NOT NULL DEFAULT 'untitled', + MODIFY `fillTriplet` char(7) NOT NULL DEFAULT '#000000', + MODIFY `fillAlpha` char(2) NOT NULL DEFAULT '00', + MODIFY `strokeTriplet` char(7) NOT NULL DEFAULT '#000000', + MODIFY `strokeAlpha` char(2) NOT NULL DEFAULT '00' +; + +ALTER TABLE `imagePalette` + MODIFY `name` varchar(255) NOT NULL DEFAULT 'untitled' +; + +ALTER TABLE `inbox` + MODIFY `status` varchar(15) NOT NULL DEFAULT 'pending', + MODIFY `completedBy` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `groupId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `subject` varchar(255) NOT NULL DEFAULT 'No Subject', + MODIFY `sentBy` varchar(22) NOT NULL DEFAULT '3' +; + +ALTER TABLE `incrementer` + MODIFY `incrementerId` varchar(50) NOT NULL DEFAULT '', + MODIFY `nextValue` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `karmaLog` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `amount` int(11) NOT NULL DEFAULT '1' +; + +ALTER TABLE `ldapLink` + MODIFY `ldapLinkId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `ldapLinkName` varchar(255) NOT NULL DEFAULT '', + MODIFY `ldapUrl` varchar(255) NOT NULL DEFAULT '', + MODIFY `connectDn` varchar(255) NOT NULL DEFAULT '', + MODIFY `identifier` varchar(255) NOT NULL DEFAULT '', + MODIFY `ldapAccountTemplate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `ldapCreateAccountTemplate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `ldapLoginTemplate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `mailQueue` + MODIFY `toGroup` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `metaData_properties` + MODIFY `fieldId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `fieldName` varchar(100) NOT NULL DEFAULT '' +; + +ALTER TABLE `metaData_values` + MODIFY `fieldId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `passiveProfileAOI` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `fieldId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `value` varchar(100) NOT NULL DEFAULT '' +; + +ALTER TABLE `passiveProfileLog` + MODIFY `passiveProfileLogId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `sessionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `dateOfEntry` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `redirect` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; + +ALTER TABLE `replacements` + MODIFY `replacementId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `search` + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `searchRoot` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PBasset000000000000001', + MODIFY `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'PBtmpl0000000000000200', + MODIFY `useContainers` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `settings` + MODIFY `name` varchar(255) NOT NULL DEFAULT '' +; + +ALTER TABLE `shopCredit` + MODIFY `amount` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `sku` + MODIFY `vendorId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'defaultvendor000000000', + MODIFY `displayTitle` tinyint(1) NOT NULL DEFAULT '1', + MODIFY `overrideTaxRate` tinyint(1) NOT NULL DEFAULT '0', + MODIFY `taxRateOverride` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `snippet` + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `processAsTemplate` int(11) NOT NULL DEFAULT '0', + MODIFY `mimeType` varchar(50) NOT NULL DEFAULT 'text/html', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `cacheTimeout` int(11) NOT NULL DEFAULT '3600' +; + +ALTER TABLE `storageTranslation` + MODIFY `guidValue` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `hexValue` varchar(32) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `subscriptionCode` + MODIFY `batchId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `code` varchar(64) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `status` varchar(10) NOT NULL DEFAULT 'Unused', + MODIFY `dateCreated` int(11) NOT NULL DEFAULT '0', + MODIFY `dateUsed` int(11) NOT NULL DEFAULT '0', + MODIFY `expires` int(11) NOT NULL DEFAULT '0', + MODIFY `usedBy` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `subscriptionCodeBatch` + MODIFY `batchId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `subscriptionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `subscriptionCodeSubscriptions` + MODIFY `code` varchar(64) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `subscriptionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `tax` + MODIFY `taxRate` float NOT NULL DEFAULT '0' +; + +ALTER TABLE `template` + MODIFY `namespace` varchar(35) NOT NULL DEFAULT 'Page', + MODIFY `isEditable` int(11) NOT NULL DEFAULT '1', + MODIFY `showInForms` int(11) NOT NULL DEFAULT '1', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0', + MODIFY `parser` varchar(255) NOT NULL DEFAULT 'WebGUI::Asset::Template::HTMLTemplate' +; + +ALTER TABLE `transaction` + MODIFY `originatingTransactionId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `isSuccessful` tinyint(1) NOT NULL DEFAULT '0', + MODIFY `shippingAddressId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `shippingDriverId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `paymentAddressId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `paymentDriverId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `transactionItem` + MODIFY `shippingAddressId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `orderStatus` varchar(35) NOT NULL DEFAULT 'NotShipped', + MODIFY `quantity` int(11) NOT NULL DEFAULT '1', + MODIFY `vendorId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT 'defaultvendor000000000' +; + +ALTER TABLE `userInvitations` + MODIFY `newUserId` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `userLoginLog` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `userProfileCategory` + MODIFY `profileCategoryId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `label` varchar(255) NOT NULL DEFAULT 'Undefined', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1', + MODIFY `visible` int(11) NOT NULL DEFAULT '1', + MODIFY `editable` int(11) NOT NULL DEFAULT '1', + MODIFY `protected` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `userProfileData` + MODIFY `photo` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL, + MODIFY `avatar` varchar(22) character set utf8 collate utf8_bin DEFAULT NULL +; + +ALTER TABLE `userProfileField` + MODIFY `fieldName` varchar(128) NOT NULL DEFAULT '', + MODIFY `label` varchar(255) NOT NULL DEFAULT 'Undefined', + MODIFY `visible` int(11) NOT NULL DEFAULT '0', + MODIFY `required` int(11) NOT NULL DEFAULT '0', + MODIFY `fieldType` varchar(128) NOT NULL DEFAULT 'text', + MODIFY `sequenceNumber` int(11) NOT NULL DEFAULT '1', + MODIFY `profileCategoryId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `protected` int(11) NOT NULL DEFAULT '0', + MODIFY `editable` int(11) NOT NULL DEFAULT '1', + MODIFY `showAtRegistration` int(11) NOT NULL DEFAULT '0', + MODIFY `requiredForPasswordRecovery` int(11) NOT NULL DEFAULT '0' +; + +ALTER TABLE `userSession` + MODIFY `sessionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `adminOn` int(11) NOT NULL DEFAULT '0', + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `userSessionScratch` + MODIFY `sessionId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `name` varchar(255) NOT NULL DEFAULT '' +; + +ALTER TABLE `users` + MODIFY `userId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `authMethod` varchar(30) NOT NULL DEFAULT 'WebGUI', + MODIFY `dateCreated` int(11) NOT NULL DEFAULT '1019867418', + MODIFY `lastUpdated` int(11) NOT NULL DEFAULT '1019867418', + MODIFY `karma` int(11) NOT NULL DEFAULT '0', + MODIFY `status` varchar(35) NOT NULL DEFAULT 'Active', + MODIFY `referringAffiliate` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `friendsGroup` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '' +; + +ALTER TABLE `wobject` + MODIFY `displayTitle` int(11) NOT NULL DEFAULT '1', + MODIFY `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `styleTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `printableStyleTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL DEFAULT '', + MODIFY `revisionDate` bigint(20) NOT NULL DEFAULT '0' +; +END_SQL + my @stmts = split /;/, $sql; # this isn't safe in general, but I know it will be fine here. + for my $stmt (@stmts) { + $stmt =~ s/^\s+//; + $stmt =~ s/\s+$//; + next unless $stmt; + $session->db->write($stmt); + } + print " Done.\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +sub privatizeVisitor { + my $session = shift; + my $visitor = WebGUI::User->new($session, '1'); + $visitor->profileField('allowPrivateMessages', 'none'); + $visitor->profileField('publicEmail', 0); + $visitor->profileField('publicProfile', 0); + $visitor->profileField('ableToBeFriend', 0); +} + +#---------------------------------------------------------------------------- + +sub ucfirstThingyFieldTypes { + my $session = shift; + print "\tConverting Thingy's fieldTypes to upper case first.\n" unless ($quiet); + $session->db->write("update Thingy_fields set fieldType = (SELECT CONCAT(UPPER(SUBSTRING(fieldType, 1, 1)), SUBSTRING(fieldType FROM 2)) ) where fieldType not like 'otherThing%'"); + +} + + +#---------------------------------------------------------------------------- +sub addRichEditInlinePopup { + my $session = shift; + print "\tAdding inline popup column to Rich editor... " unless $quiet; + $session->db->write("ALTER TABLE `RichEdit` ADD COLUMN `inlinePopups` INT(11) NOT NULL DEFAULT 0"); + print "Done!\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +# Add the "allowMedia" field to Rich Edit assets +sub addRichEditMedia { + my $session = shift; + print "\tAdding Media switch to Rich Edit..." unless $quiet; + + # Make sure it wasn't added by previous upgrade + my $sth = $session->db->read('DESCRIBE `RichEdit`'); + while (my ($col) = $sth->array) { + if ( $col eq 'allowMedia' ) { + print "Already done, skipping.\n" unless $quiet; + return; + } + } + + $session->db->write( + q{ ALTER TABLE RichEdit ADD COLUMN allowMedia INT }, + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub updateRichEditorButtons { + my $session = shift; + print "\tUpdate Rich Editor buttons... " unless $quiet; + my $editors = WebGUI::Asset->getRoot($session)->getLineage(['descendants'], { + includeOnlyClasses => ['WebGUI::Asset::RichEdit'], + returnObjects => 1, + }); + for my $editor (@$editors) { + my %prop; + for my $toolbar (qw(toolbarRow1 toolbarRow2 toolbarRow3)) { + my $current = $editor->get($toolbar); + $current =~ s/^insertImage$/wginsertimage/m; + $current =~ s/^pagetree$/wgpagetree/m; + $current =~ s/^collateral$/wgmacro/m; + if ($current ne $editor->get($toolbar)) { + $prop{$toolbar} = $current; + } + } + if (%prop) { + $editor->addRevision(\%prop); + } + } + print "Done.\n" unless $quiet; + +} + + + +#---------------------------------------------------------------------------- +sub removeOldGalleryColumns { + my $session = shift; + $session->db->write( + "ALTER TABLE Gallery DROP COLUMN groupIdModerator" + ); +} + +#---------------------------------------------------------------------------- +# moveColumnsToGalleryFile +# Move columns from Photo that are better handled under GalleryFile +sub moveColumnsToGalleryFile { + my $session = shift; + print "\tMoving Photo columns to GalleryFile (its superclass)... " unless $quiet; + + # Add the galleryfile columns + $session->db->write(q{ + CREATE TABLE GalleryFile ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + userDefined1 LONGTEXT, + userDefined2 LONGTEXT, + userDefined3 LONGTEXT, + userDefined4 LONGTEXT, + userDefined5 LONGTEXT, + views BIGINT DEFAULT 0, + friendsOnly INT(1) DEFAULT 0, + rating INT(1) DEFAULT 0, + PRIMARY KEY ( assetId, revisionDate ) + ) + }); + + # Move Photo data to GalleryFile + my $sth = $session->db->read( "SELECT * FROM Photo" ); + while ( my %row = $sth->hash ) { + $session->db->write( + q{ INSERT INTO GalleryFile ( + assetId, revisionDate, userDefined1, userDefined2, userDefined3, userDefined4, + userDefined5, views, friendsOnly, rating ) + VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) + }, + [ @row{ qw( assetId revisionDate userDefined1 userDefined2 userDefined3 userDefined4 + userDefined5 views friendsOnly rating ) } ], + ); + } + + # Drop the photo columns + $session->db->write( q{ + ALTER TABLE Photo + DROP COLUMN userDefined1, + DROP COLUMN userDefined2, + DROP COLUMN userDefined3, + DROP COLUMN userDefined4, + DROP COLUMN userDefined5, + DROP COLUMN views, + DROP COLUMN friendsOnly, + DROP COLUMN rating + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# moveCommentsToGalleryFile +# Move comments to a better-described table +sub moveCommentsToGalleryFile { + my $session = shift; + print "\tMoving Photo_comment to GalleryFile_comment... " unless $quiet; + + $session->db->write( q{ + ALTER TABLE Photo_comment RENAME TO GalleryFile_comment + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub convertCacheToBinary { + my $session = shift; + print "\tConverting database cache to binary data.\n" unless ($quiet); + $session->db->write('DELETE FROM `cache`'); + $session->db->write('ALTER TABLE `cache` MODIFY COLUMN `content` mediumblob'); + $session->db->write('DELETE FROM `cache`'); +} + +sub repairDBCharset { + my $session = shift; + + print "\tRepairing erroneous UTF8 data. This may take a long time... " unless $quiet; + # Bypassing normal connection to get default settings + my $dbh = DBI->connect( $session->config->get('dsn'), $session->config->get('dbuser'), $session->config->get('dbpass') ); + my (undef, $connection_charset) = $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_connection'"); + $dbh->disconnect; + + # Now use normal connection + $dbh = $session->db->dbh; + + my $sth; + my @tables; + my @stmts; + # Get table list + $sth = $dbh->table_info(undef, undef, '%'); + while (my $row = $sth->fetchrow_hashref) { + push @tables, $row->{TABLE_NAME}; + } + $sth->finish; + + for my $table (@tables) { + # Find table's default charset + my (undef, $create) = $dbh->selectrow_array('SHOW CREATE TABLE ' . $dbh->quote_identifier($table)); + $create =~ s/.*\)//s; + my $table_charset; + if ($create =~ /CHARSET=(\S+)/) { + $table_charset = $1; + } + # Getting all columns, and looking at text + my $sth = $dbh->prepare("SHOW FULL COLUMNS FROM " . $dbh->quote_identifier($table)); + $sth->execute; + while (my $row = $sth->fetchrow_hashref) { + if ($row->{Type} =~ /TEXT/i || $row->{Type} =~ /VARCHAR/i) { + # Perl was always sending UTF8, but MySQL may have been treating it like a different charser + # This lead to it converting it based on the connection, even if the table was UTF8 + # First, we undo that conversion + push @stmts, sprintf("ALTER TABLE %s CHANGE %s %s %s CHARACTER SET $connection_charset", $dbh->quote_identifier($table), $dbh->quote_identifier($row->{Field}), $dbh->quote_identifier($row->{Field}), $row->{Type}); + # We should now have the correct byte sequences, but if we do a direct convert to UTF8, + # MySQL will attept to convert it again. Converting to binary first prevents this + push @stmts, sprintf("ALTER TABLE %s CHANGE %s %s %s CHARACTER SET binary", $dbh->quote_identifier($table), $dbh->quote_identifier($row->{Field}), $dbh->quote_identifier($row->{Field}), $row->{Type}); + # Now we convert to UTF8, and it should be stored properly. We're using a UTF8 connection, + # so everything should just work from here on + push @stmts, sprintf("ALTER TABLE %s CHANGE %s %s %s CHARACTER SET utf8", $dbh->quote_identifier($table), $dbh->quote_identifier($row->{Field}), $dbh->quote_identifier($row->{Field}), $row->{Type}); + } + } + $sth->finish; + # We also want to make sure the table is set as UTF8 + if ($table_charset ne 'utf8') { + push @stmts, 'ALTER TABLE ' . $dbh->quote_identifier($table) . ' DEFAULT CHARACTER SET = utf8'; + } + } + + unshift @stmts, "ALTER TABLE `assetIndex` DROP INDEX `keywords`"; + push @stmts, "ALTER TABLE `assetIndex` ADD FULLTEXT INDEX `keywords` (`keywords`)"; + + for my $stmt (@stmts) { + $dbh->do($stmt); + } + + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add a column to the Gallery +sub addLayoutOrderSetting { + my $session = shift; + print "\tAdding Layout Order Setting... " unless $quiet; + + $session->db->write( q{ + ALTER TABLE Layout ADD COLUMN assetOrder varchar(20) default 'asc'; + } ); + $session->db->write( q{ + UPDATE Layout SET assetOrder='asc'; + }); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the Thingy asset +sub installThingyAsset { + my $session = shift; + print "\tInstalling Thingy asset..." unless $quiet; + + $session->db->write(<<'ENDSQL'); +create table if not exists Thingy ( + assetId varchar(22) binary not null, + revisionDate bigint not null, + templateId varchar(22) not null, + defaultThingId varchar(22), + primary key (assetId, revisionDate) + ) +ENDSQL + + $session->db->write(<<'ENDSQL'); +create table if not exists Thingy_things ( + assetId varchar(22) binary not null, + thingId varchar(22) binary not null, + label varchar(255) not null, + editScreenTitle varchar(255) not null, + editInstructions text, + groupIdAdd varchar(22) not null, + groupIdEdit varchar(22) not null, + saveButtonLabel varchar(255) not null, + afterSave varchar(255) not null, + editTemplateId varchar(22) not null, + onAddWorkflowId varchar(22), + onEditWorkflowId varchar(22), + onDeleteWorkflowId varchar(22), + groupIdView varchar(22) not null, + viewTemplateId varchar(22) not null, + defaultView varchar(255) not null, + searchScreenTitle varchar(255) not null, + searchDescription text, + groupIdSearch varchar(22) not null, + groupIdImport varchar(22) not null, + groupIdExport varchar(22) not null, + searchTemplateId varchar(22) not null, + thingsPerPage int(11) not null default 25, + sortBy varchar(22), + display int(11), + primary key (thingId) + ) +ENDSQL + + $session->db->write(<<'ENDSQL'); +create table if not exists Thingy_fields ( + assetId varchar(22) binary not null, + thingId varchar(22) binary not null, + fieldId varchar(22) not null, + sequenceNumber int(11) not null, + dateCreated bigint(20) not null, + createdBy varchar(22) not null, + dateUpdated bigint(20) not null, + updatedBy varchar(22) not null, + label varchar(255) not null, + fieldType varchar(255) not null, + defaultValue varchar(255), + possibleValues varchar(255), + subText varchar(255), + status varchar(255) not null, + width int(11), + height int(11), + vertical smallint(1), + extras varchar(255), + display int(11), + viewScreenTitle int(11), + displayInSearch int(11), + searchIn int(11), + fieldInOtherThingId varchar(22), + primary key (fieldId, thingId, assetId) + ) +ENDSQL + + $session->config->addToArray("assets","WebGUI::Asset::Wobject::Thingy"); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add a column to the Gallery +sub addGalleryEditCommentTemplate { + my $session = shift; + print "\tAdding Edit Comment Template... " unless $quiet; + + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN templateIdEditComment VARCHAR(22) BINARY + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add a column to select rich editor for albums +sub addGalleryRichEditAlbum { + my $session = shift; + print "\tAdding Select Rich Editor for Gallery Albums..." unless $quiet; + + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN richEditIdAlbum VARCHAR(22) BINARY + } ); + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN richEditIdFile VARCHAR(22) BINARY + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Move File::Image::Photos to File::GalleryFile::Photos +sub migrateToGalleryFile { + my $session = shift; + print "\tMigrating Image::Photos to GalleryFile::Photos (this may take time)..." unless $quiet; + + # Change WebGUI::Asset::File::Image::Photo to WebGUI::Asset::File::GalleryFile::Photo + $session->db->write( q{ + UPDATE asset SET className='WebGUI::Asset::File::GalleryFile::Photo' WHERE + className='WebGUI::Asset::File::Image::Photo' + }); + + # Delete Photos from ImageAsset table + $session->db->write( + "DELETE FROM ImageAsset WHERE assetId IN ( SELECT assetId FROM Photo )" + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the list view columns to the Calendar +sub addListViewToCalendar { + my $session = shift; + print "\tAdding list view to Calendar... " unless $quiet; + + $session->db->write( + "ALTER TABLE Calendar ADD COLUMN listViewPageInterval BIGINT" + ); + $session->db->write( + "ALTER TABLE Calendar ADD COLUMN templateIdList VARCHAR(22)" + ); + $session->db->write( + "ALTER TABLE Calendar ADD COLUMN templateIdPrintList VARCHAR(22)" + ); + $session->db->write( + "ALTER TABLE Calendar MODIFY COLUMN defaultView ENUM('month','week','day','list') DEFAULT 'month'" + ); + + print "DONE!\n" unless $quiet; + return; +} + +#---------------------------------------------------------------------------- +# Add the ability to set the iCalendar interval +sub addIcalPageSize { + my $session = shift; + print "\tAdding iCalendar interval to Calendar... " unless $quiet; + + $session->db->write( + "ALTER TABLE Calendar ADD COLUMN icalInterval BIGINT" + ); + + print "DONE!\n" unless $quiet; + return; +} +#---------------------------------------------------------------------------- +# Add the views column to the Photo asset +sub addViewsColumnToPhoto { + my $session = shift; + print "\tAdding 'views' column to Photo asset... " unless $quiet; + $session->db->write( + "ALTER TABLE Photo ADD COLUMN views BIGINT" + ); + print "DONE!\n" unless $quiet; +} + + +#------------------------------------------------- +sub speedUp { + my $session = shift; + print "\tSlight asset performance increase.\n" unless ($quiet); + $session->db->write("alter table assetData add index assetId_status (assetId,status)"); +} + + +#------------------------------------------------- +sub removeOldPhotoGallery { + my $session = shift; + print "\tRemoving CS Photo Gallery prototype.\n" unless ($quiet); + my $gallery = WebGUI::Asset->newByDynamicClass($session, "pbproto000000000000001"); + if (defined $gallery) { + $gallery->purge; + } +} + + +#------------------------------------------------- +sub addUrlAndContentHandlers { + my $session = shift; + print "\tAdding pluggable URL and content handlers." unless $quiet; + my $config = $session->config; + my @urlHandlers = ( + { "^/extras" => "WebGUI::URL::PassThru" }, + { "^/uploads/dictionaries" => "WebGUI::URL::Unauthorized" }, + { "^/uploads" => "WebGUI::URL::Uploads" }, + { '^/\*give-credit-where-credit-is-due\*$' => "WebGUI::URL::Credits" }, + { '^/abcdefghijklmnopqrstuvwxyz$' => "WebGUI::URL::Snoop" }, + { ".*" => "WebGUI::URL::Content" } + ); + my $passthrus = $config->get("passthruUrls"); + if (defined $passthrus) { + foreach my $url (@{$passthrus}) { + unshift @urlHandlers, { "^".$url => "WebGUI::URL::PassThru" }; + } + } + $config->set("urlHandlers", \@urlHandlers); + $config->set("contentHandlers" , [ + "WebGUI::Content::Prefetch", + "WebGUI::Content::Maintenance", + "WebGUI::Content::Operation", + "WebGUI::Content::Setup", + "WebGUI::Content::Asset", + "WebGUI::Content::NotFound" + ]); + $config->delete("passthruUrls"); + unlink ($webguiRoot . "/lib/WebGUI/Setup.pm"); + print "DONE!\n" unless $quiet; +} + +#------------------------------------------------- +sub addSearchWithContainers { + my $session = shift; + print "\tMaking search capable of displaying containers in search results instead of individaul assets." unless $quiet; + $session->db->write("alter table search add column useContainers int not null default 0"); + print "DONE!\n" unless $quiet; +} + +#------------------------------------------------- +sub addGroupToEditPost { + my $session = shift; + print "\tAdding the Group to Edit Post field to the Collaboration system." unless $quiet; + $session->db->write("alter table Collaboration add column groupToEditPost varchar(22) not null"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addFriendsNetwork { + my $session = shift; + print "\tInstall the Friend's Network.\n" unless ($quiet); + print "\t\tInstall new Network User Profile Field for not wanting to be friendly.\n" unless ($quiet); + my $field = WebGUI::ProfileField->create( + $session, + 'ableToBeFriend', + { + 'label' => WebGUI::International->new($session)->get('user profile field friend availability', 'WebGUI'), + 'visible' => 0, + 'required' => 0, + 'protected' => 1, + 'editable' => 1, + 'fieldType' => 'yesNo', + 'dataDefault' => 1, + }, + ); + + print "\t\tUpdating Private Messaging Profile Field.\n" unless ($quiet); + my $pmField = WebGUI::ProfileField->new($session,"allowPrivateMessages"); + my %data = ( + label => 'WebGUI::International::get("allow private messages label","WebGUI")', + visible => 1, + possibleValues =>'{ all=>WebGUI::International::get("user profile field private message allow label","WebGUI"), friends=>WebGUI::International::get("user profile field private message friends only label","WebGUI"), none=>WebGUI::International::get("user profile field private message allow none label","WebGUI"),}', + dataDefault =>'["all"]', + fieldType =>'RadioList', + required => 0, + protected => 1, + editable => 1, + ); + $pmField->set(\%data); + $session->db->write("update userProfileData set allowPrivateMessages='all' where allowPrivateMessages='1'"); + $session->db->write("update userProfileData set allowPrivateMessages='none' where allowPrivateMessages='0'"); + + + print "\t\tInstall the table to keep track of friend network invitations.\n" unless ($quiet); + my $db = $session->db; + $session->db->write(<new($session, "pbworkflow000000000001"); + my $activity = $workflow->addActivity("WebGUI::Workflow::Activity::DenyUnansweredFriends", "unansweredfriends_____"); + $activity->set("timeout", 60 * 60 * 24 * 30); + $activity->set("title", "Deny Friend Requests Older Than A Month"); + + print "\t\tAdding friends related settings.\n" unless ($quiet); + $session->setting->add("manageFriendsTemplateId", "managefriends_________"); + + print "\t\tAdd a new column to the users table to keep track of the groupId for friends." unless ($quiet); + $db->write("alter table users add column friendsGroup varchar(22) binary not null default ''"); + print "OK\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the GalleryAlbum asset +sub installGalleryAlbumAsset { + my $session = shift; + print "\tInstalling GalleryAlbum asset..." unless $quiet; + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS GalleryAlbum ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + allowComments INT, + assetIdThumbnail VARCHAR(22) BINARY, + userDefined1 TEXT, + userDefined2 TEXT, + userDefined3 TEXT, + userDefined4 TEXT, + userDefined5 TEXT, + othersCanAdd INT, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the Gallery asset +sub installGalleryAsset { + my $session = shift; + print "\tInstalling Gallery asset..." unless $quiet; + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Gallery ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + groupIdAddComment VARCHAR(22) BINARY, + groupIdAddFile VARCHAR(22) BINARY, + groupIdModerator VARCHAR(22) BINARY, + imageResolutions TEXT, + imageViewSize INT, + imageThumbnailSize INT, + maxSpacePerUser VARCHAR(20), + richEditIdComment VARCHAR(22) BINARY, + templateIdAddArchive VARCHAR(22) BINARY, + templateIdDeleteAlbum VARCHAR(22) BINARY, + templateIdDeleteFile VARCHAR(22) BINARY, + templateIdEditAlbum VARCHAR(22) BINARY, + templateIdEditFile VARCHAR(22) BINARY, + templateIdListAlbums VARCHAR(22) BINARY, + templateIdListAlbumsRss VARCHAR(22) BINARY, + templateIdListFilesForUser VARCHAR(22) BINARY, + templateIdListFilesForUserRss VARCHAR(22) BINARY, + templateIdMakeShortcut VARCHAR(22) BINARY, + templateIdSearch VARCHAR(22) BINARY, + templateIdViewSlideshow VARCHAR(22) BINARY, + templateIdViewThumbnails VARCHAR(22) BINARY, + templateIdViewAlbum VARCHAR(22) BINARY, + templateIdViewAlbumRss VARCHAR(22) BINARY, + templateIdViewFile VARCHAR(22) BINARY, + viewAlbumAssetId VARCHAR(22), + viewDefault ENUM('album','list'), + viewListOrderBy VARCHAR(40), + viewListOrderDirection ENUM('ASC','DESC'), + workflowIdCommit VARCHAR(22) BINARY, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + $session->config->addToArray("assets","WebGUI::Asset::Wobject::Gallery"); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the photo asset +sub installPhotoAsset { + my $session = shift; + print "\tInstalling Photo asset..." unless $quiet; + + # Photo Asset + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + exifData LONGTEXT, + friendsOnly INT, + location VARCHAR(255), + rating INT, + userDefined1 TEXT, + userDefined2 TEXT, + userDefined3 TEXT, + userDefined4 TEXT, + userDefined5 TEXT, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo_comment ( + assetId VARCHAR(22) BINARY NOT NULL, + commentId VARCHAR(22) BINARY NOT NULL, + userId VARCHAR(22) BINARY, + visitorIp VARCHAR(255), + creationDate DATETIME, + bodyText LONGTEXT, + INDEX (commentId), + PRIMARY KEY (assetId, commentId) +) +ENDSQL + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo_rating ( + assetId VARCHAR(22) BINARY NOT NULL, + userId VARCHAR(22) BINARY, + visitorIp VARCHAR(255), + rating INT, + INDEX (assetId) +) +ENDSQL + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the isExportable property for all assets +sub addIsExportable { + my $session = shift; + print "\tAdding isExportable flag for all assets (fine-grained export control)..." unless $quiet; + $session->db->write('alter table assetData add column isExportable int(11) not null default 1'); + print "DONE!\n" unless $quiet; +} + +#-------------------------------------------------------------------------- +# Populate the initial sequence numbers +sub populateSequenceNumbers { + my $session = shift; + + my $dbh = $session->db->dbh; + + my $seed = 16384; + my $curr_seed = 32768; + + my $sql =<selectcol_arrayref($sql); + + for my $assetId (@$ar_assetIds) { + my ($event) = $dbh->selectrow_hashref("SELECT revisionDate FROM Event WHERE assetId = ? ORDER BY revisionDate DESC LIMIT 1",undef,$assetId); + + $dbh->do("UPDATE Event SET sequenceNumber = ? WHERE assetId = ? AND revisionDate = ?",{},$curr_seed,$assetId,$event->{revisionDate}); + + $curr_seed += $seed; + } + $dbh->do("UPDATE Calendar SET sortEventsBy = 'sequenceNumber'"); +} + +#-------------------------------------------------------------------------- +# Create event relatedlink table +sub createEvent_relatedlinkTable { + my $session = shift; + print "\tCreate Event_relatedlink table.\n" unless $quiet; + + my $sql =<db->write($sql) or die "Failed to create Event_relatedlink table\n"; +} + +#----------------------------------------------------------------------------- +# Update the related links from the Event table to Event_relatedlink +sub updateRelatedLinkData { + my $session = shift; + use HTML::Parser; + + my $p = HTML::Parser->new(api_version =>3); + + print "\tConverting Related Links from Event table to Event_relatedlink table\n" unless $quiet; + + my $sth = $session->db->read("SELECT Event.assetId,relatedLinks,groupIdView FROM Event,assetData WHERE Event.assetId = assetData.assetId order by Event.revisionDate desc"); + $sth->execute; + my (%asset_used, %event_asset_of, %snippet_asset_of); + + while (my ($assetId, $relatedLinks, $groupIdView) = $sth->array) { + + if (defined $asset_used{$assetId}) { +# print "\tAlready defined\n"; +# print "$assetId, $relatedLinks\n"; + next; + } +# print "\n\tUsing\n"; +# print "$assetId, $relatedLinks\n"; + + $asset_used{$assetId} = $groupIdView; + + $event_asset_of{$assetId} = parse_html_to_link($p, $relatedLinks); +# print Dumper ( $event_asset_of{ $assetId } )."\n"; + $p->eof; + } + + # Scan all records for active AssetProxy macros and convert them to a + # Real url / display text pair. + # + for my $assetId (keys %event_asset_of) { + for my $hr (@{$event_asset_of{$assetId}}) { + next unless ($hr->{url} =~ /AssetProxy/); + + $hr->{text} =~ s/^\///; +# print "*** NEW ***\n".$hr->{text}."\n"; + my ($assetId_snippet, $groupIdView) = $session->db->quickArray("SELECT assetId, groupIdView FROM assetData WHERE url = ? ORDER BY revisionDate DESC LIMIT 1",[$hr->{text}]); + + unless ($assetId_snippet) { + delete $event_asset_of{$assetId}; + next; + } + $asset_used{$assetId_snippet} = $groupIdView; + + my ($snippet) = $session->db->quickArray("SELECT snippet FROM snippet WHERE assetId = ? ORDER BY revisionDate DESC LIMIT 1",[$assetId_snippet]); +# print "\tsnippetId: ($assetId_snippet), assetId($assetId):\n$snippet\n"; + my $links = parse_html_to_link($p, $snippet); +# print $assetId.":\n".Dumper ($links)."\n"; + for (@$links) { + push @{$snippet_asset_of{$assetId}{$assetId_snippet}}, $_; + } + $hr = undef; + } + } + + # Extracted data now stored as Event_relatedlink rows + my $sql =<id->generate(); + next unless (defined (my $hr_link = $event_asset_of{$assetId}[$a_idx])); + my $groupToView = $asset_used{$assetId}; + +# printf "'%s', '%s', '%s', '%s', '%s', '%s'\n",$assetId,$groupToView,$hr_link->{url},$hr_link->{text},$a_idx+1,$eventlinkId; + $session->db->write($sql,[$assetId,$groupToView,$hr_link->{url},$hr_link->{text},$a_idx+1,$eventlinkId]); + } + } +# print "Snippets\n"; + for my $assetId (keys %snippet_asset_of) { + my $hrs_asset_of = \%{$snippet_asset_of{$assetId}}; +# print "\tEvent: $assetId\n"; +# print Dumper ($hrs_asset_of)."\n"; + for my $s_assetId (keys %$hrs_asset_of) { +# print "\t\tSnippet: $s_assetId\n"; + for my $a_idx (0..@{$hrs_asset_of->{$s_assetId}}) { +# print "\t\t\tIDX: $a_idx\n"; + my $eventlinkId = $session->id->generate(); + next unless (defined (my $hr_link = $hrs_asset_of->{$s_assetId}[$a_idx])); + my $groupToView = $asset_used{$s_assetId}; + +# printf "'%s', '%s', '%s', '%s', '%s', '%s'\n",$assetId,$groupToView,$hr_link->{url},$hr_link->{text},$a_idx+1,$eventlinkId; + $session->db->write($sql,[$assetId,$groupToView,$hr_link->{url},$hr_link->{text},$a_idx+1,$eventlinkId]); + } + } + } + return; +} + +#----------------------------------------------------------------------------- +# Alter the Event table to add the Sequence Number field +sub alterEventTableForSequence { + my $session = shift; + + print "\tAdding sequenceNumber to Event table.\n" unless $quiet; + my $sql =<db->write($sql) or die "Failed to modify Event table\n"; + + $sql =<db->write($sql) or die "Failed to modify Calendar table\n"; +} + +######## +# Convert HTML::Parser output to something useful +# Results in a array of hashrefs with keys 'url' and 'text' +# +sub parse_html_to_link { + my ($p, $rl, $verbose) = @_; + + $rl =~ s/<\/a\>\s*
handler( start => \@result, 'attr' ); + $p->handler( text => \@result, 'text' ); + $p->parse($rl."
"); + if ($verbose) { + print "=========================================\n"; + print Dumper (@result)."\n"; + print "------\n"; + } + + my (@text, @links, $key); + for (@result) { + if (ref ($_->[0]) ne "HASH") { + if ($_->[0] =~ /^\^AssetProxy/) { + push @text, $_->[0]; + push @links, link_to_hashref('', \@text); + } + elsif ($_->[0] =~ /\w/) { + push @text, $_->[0]; + } + } + else { + if ($_->[0]->{href}) { + $key = $_->[0]->{href}; + } + else { + push @links, link_to_hashref($key, \@text); + } + } + } + return \@links; +} + +######## +# Given a key (URL) and an array_ref containing strings +# build a hash value according to certain rules +# +sub link_to_hashref { + my ($key, $ar_text) = @_; + + return unless $ar_text->[0]; + my %h; + if ($key) { + # Both hash key and values provided + $h{url} = $key; + $h{text} = (join " ",@$ar_text) || $key; + $key = ''; + } + elsif ($ar_text->[0] =~ /^\//) { + # Only a file reference is provided + $h{url} = join " ",@$ar_text; + $h{text} = join " ",@$ar_text; + } + elsif ($ar_text->[0] =~ /^\^AssetProxy\(([^\)]+)\)/) { + # Snippet macro provided + $h{text} = $1; + $h{url} = 'AssetProxy'; + } + + # prevent surprise array expansion + @$ar_text = (); + + return \%h; +} + # -------------- DO NOT EDIT BELOW THIS LINE -------------------------------- diff --git a/docs/upgrades/upgrade_7.5.5-7.5.6.pl b/docs/upgrades/upgrade_7.5.5-7.5.6.pl index c7fac3ae5..323266db3 100644 --- a/docs/upgrades/upgrade_7.5.5-7.5.6.pl +++ b/docs/upgrades/upgrade_7.5.5-7.5.6.pl @@ -39,6 +39,7 @@ finish($session); # this line required sub convertCacheToBinary { my $session = shift; print "\tConverting database cache to binary data.\n" unless ($quiet); + $session->db->write('DELETE FROM `cache`'); $session->db->write('ALTER TABLE `cache` MODIFY COLUMN `content` mediumblob'); $session->db->write('DELETE FROM `cache`'); }