'4.7.1', 'build' => '471'));
$success = TRUE;
if ($success) {
drupal_set_message(t('Webform module installed module tables successfully.'));
}
else {
drupal_set_message(t('The installation of webform module was unsuccessful.'), 'error');
}
}
/*
* Schema changes include component id's (cid) keys in the webform_component
* and webform_submitted_data tables
*/
function webform_update_1() {
$ret = array();
// Update pre-4.7 tables to the 463 build schema.
$installed_version = variable_get("webform_version",0);
$current_version = array('text'=>'4.6.3', 'build' => '463');
if ($installed_version > 0) {
$ret = _webform_legacy_update($installed_version,$current_version);
}
// Start the normal update.
$ret[] = update_sql("CREATE TABLE {webform_tmp} ( ".
" nid int(10) unsigned NOT NULL default '0', ".
" sid int(10) unsigned NOT NULL default '0', ".
" cid int(10) unsigned NOT NULL default '0', ".
" no int(10) unsigned NOT NULL default '0', ".
" data longtext, ".
" PRIMARY KEY (nid,sid,cid,no) ".
" ) ");
$result = db_query("SELECT ws.nid, ws.sid, wc.cid, ws.name, ws.data ".
" FROM {webform_submitted_data} ws, {webform_component} wc ".
" WHERE ws.nid = wc.nid ".
" AND ws.name = wc.name ");
while ($row = db_fetch_object($result)) {
$data = unserialize($row->data);
if ( is_array($data) ) {
foreach($data as $k => $v) {
db_query("INSERT INTO {webform_tmp} (nid, sid, cid, no, data) VALUES (%d, %d, %d, %d, '%s')",
$row->nid, $row->sid, $row->cid, $k, $v);
}
}
else {
db_query("INSERT INTO {webform_tmp} (nid, sid, cid, no, data) VALUES (%d, %d, %d, %d, '%s')",
$row->nid, $row->sid, $row->cid, 0, $row->data);
}
}
$ret[] = update_sql("DROP TABLE {webform_submitted_data}");
$ret[] = update_sql("ALTER TABLE {webform_tmp} RENAME TO {webform_submitted_data}");
$ret[] = update_sql("CREATE TABLE {webform_submissions} ( ".
" nid int(10) unsigned NOT NULL default '0', ".
" sid int(10) unsigned NOT NULL default '0', ".
" submitted int(11) NOT NULL default '0', ".
" PRIMARY KEY (nid, sid) ".
")" );
return $ret;
}
/*
* Schema changes 2: Added redirect_post column in webform table
*/
function webform_update_2() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
$ret[] = update_sql("ALTER TABLE {webform} ADD redirect_post int(1) UNSIGNED NOT NULL DEFAULT '0'");
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform} ADD redirect_post int(1) UNSIGNED NOT NULL DEFAULT '0' AFTER confirmation");
break;
}
return $ret;
}
/*
* Schema change 3: Update to UTF8
*/
function webform_update_3() {
return _system_update_utf8(array('webform', 'webform_component', 'webform_role_node', 'webform_submissions', 'webform_submitted_data'));
}
/*
* Schema change 4: Remove the webform_role_node table, node access can be handled by other modules made for this purpose.
* Add additional columns to webform_submissions for recording of repeated submissions (IP Address, Browser, etc).
* Add additional columns to webform for setting submission limitations
* Change 'maintain webforms' permission into two seperate perms: 'edit webforms', 'access webform results'
*/
function webform_update_4() {
$ret[] = update_sql("DROP TABLE if exists {webform_role_node}");
$ret[] = update_sql("ALTER TABLE {webform_submissions} ADD user varchar(128) AFTER submitted");
$ret[] = update_sql("ALTER TABLE {webform_submissions} ADD remote_addr varchar(128) AFTER user");
$ret[] = update_sql("ALTER TABLE {webform} ADD submit_limit int(2) NOT NULL DEFAULT '-1' AFTER redirect_post");
$ret[] = update_sql("ALTER TABLE {webform} ADD submit_interval int(10) NOT NULL DEFAULT '157784630' AFTER submit_limit"); // 5 years in seconds.
// Split 'maintain webforms' permissions into both 'edit webforms' and 'access webform results'.
$result = db_query("SELECT rid,perm FROM {permission}");
while ($row = db_fetch_object($result)) {
if (strpos($row->perm,"maintain webforms") !== false) {
$updatedPerm = str_replace("maintain webforms", "edit webforms, access webform results", $row->perm);
db_query("UPDATE {permission} SET perm='%s' WHERE rid = %d", $updatedPerm, $row->rid);
}
}
return $ret;
}
/*
* Update MySQL sequence name to be cross-database compatible
*/
function webform_update_5() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'mysqli':
case 'mysql':
db_query('LOCK TABLES {sequences} WRITE');
$ret[] = update_sql(sprintf("UPDATE {sequences} SET name = '%s' WHERE name = '%s'", db_prefix_tables('{webform_submissions}_sid'), db_prefix_tables('{webform_submissions}_id')));
db_query('UNLOCK TABLES');
break;
}
return $ret;
}
/*
* Add a parent ID to all components, allowing nested fieldsets
*/
function webform_update_6() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
$ret[] = update_sql("ALTER TABLE {webform_component} ADD pid integer NOT NULL DEFAULT '0'");
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform_component} ADD pid int(10) NOT NULL DEFAULT 0 AFTER cid");
break;
}
return $ret;
}
/*
* Allow much larger default values for components
*/
function webform_update_7() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
db_change_column($ret, 'webform_component', 'value', 'value', 'TEXT', array('not null' => FALSE, 'default' => "NULL"));
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform_component} CHANGE value value TEXT NULL DEFAULT NULL");
break;
}
return $ret;
}
/*
* Add additional validate and submit processing columns
*/
function webform_update_8() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
$ret[] = update_sql("ALTER TABLE {webform} ADD additional_validate text DEFAULT NULL");
$ret[] = update_sql("ALTER TABLE {webform} ADD additional_submit text DEFAULT NULL");
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform} ADD additional_validate text DEFAULT NULL AFTER email_subject");
$ret[] = update_sql("ALTER TABLE {webform} ADD additional_submit text DEFAULT NULL AFTER additional_validate");
break;
}
return $ret;
}
/**
* Remove webform version variable, now obsolete with schema and version numbers.
* Split columns for email_from into email_from_address and email_from_name
*/
function webform_update_9() {
variable_del('webform_version');
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
db_change_column($ret, 'webform', 'email_from', 'email_from_address', 'varchar(255)', array('not null' => FALSE, 'default' => "NULL"));
$ret[] = update_sql("ALTER TABLE {webform} ADD email_from_name varchar(255) NULL DEFAULT NULL");
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform} CHANGE email_from email_from_address varchar(255) NULL DEFAULT NULL");
$ret[] = update_sql("ALTER TABLE {webform} ADD email_from_name varchar(255) NULL DEFAULT NULL AFTER email");
break;
}
return $ret;
}
/**
* Add the form_key column to the webform_component table.
*/
function webform_update_10() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'pgsql':
$ret[] = update_sql("ALTER TABLE {webform_component} ADD form_key varchar(128) NULL DEFAULT NULL");
break;
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform_component} ADD form_key varchar(128) NULL DEFAULT NULL AFTER pid");
break;
}
return $ret;
}
/**
* Add unique indexes on Submission IDs for faster joins.
*/
function webform_update_11() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'mysqli':
case 'mysql':
$ret[] = update_sql("ALTER TABLE {webform_submissions} ADD INDEX sid (sid)");
$ret[] = update_sql("ALTER TABLE {webform_submitted_data} ADD INDEX sid (sid)");
break;
case 'pgsql':
$ret[] = update_sql("CREATE INDEX {webform_submissions}_sid_idx ON {webform_submissions}(sid)");
$ret[] = update_sql("CREATE INDEX {webform_submitted_data}_sid_idx ON {webform_submitted_data}(sid)");
break;
}
return $ret;
}
/**
* Change 'user' column to 'uid' in webform_submissions table.
*/
function webform_update_12() {
$ret = array();
switch ($GLOBALS['db_type']) {
case 'mysql':
case 'mysqli':
$ret[] = update_sql("ALTER TABLE {webform_submissions} ADD uid int(10) NOT NULL DEFAULT 0 AFTER sid");
$ret[] = update_sql("UPDATE {webform_submissions} ws set uid = (SELECT uid FROM {users} u WHERE u.name = ws.user)");
$ret[] = update_sql("ALTER TABLE {webform_submissions} DROP user");
break;
case 'pgsql':
$ret[] = update_sql("ALTER TABLE {webform_submissions} ADD uid integer NOT NULL DEFAULT 0");
$ret[] = update_sql("UPDATE {webform_submissions} ws set uid = (SELECT uid FROM {users} u WHERE u.name = ws.user)");
$ret[] = update_sql("ALTER TABLE {webform_submissions} DROP user");
break;
}
return $ret;
}
/**
* Makes updates to the database structure (Pre-4.7 versions of Drupal).
*/
function _webform_legacy_update($installed_version, $current_version) {
$ret = array();
// Check to see if we should do a update.
// Upgrading from original version
if ( $installed_version['build'] <= 1 ) {
$ret[] = array(1 => "Build 1
\n", 2 => "");
// Add the table webform_submitted_data.
$ret[] = update_sql("CREATE TABLE {webform_submited_data} ".
"( nid int(10) unsigned not null, ".
"sid int(10) unsigned not null, ".
"name varchar(255) not null, ".
"data blob, ".
"PRIMARY KEY(nid, sid, name))");
// Converting data from old submission table.
//$ret[] = _webform_convert_old_submissions();
}
if ( $installed_version['build'] <= 1 ) {
//$ret[] = array(1 => "Build 4.5.0
\n", 2 => "");
// Change webform_component.extra from varchar(128) -> text.
$ret[] = update_sql("ALTER TABLE {webform_component} MODIFY extra TEXT");
// Change webform_submited_data.data blob -> longtext.
$ret[] = update_sql("ALTER TABLE {webform_submited_data} MODIFY data LONGTEXT");
}
if ( $installed_version['build'] < 460 ) {
// $ret[] = array(1 => "Build 4.6.0
\n", 2 => "");
// Update webform_submited_data to webform_submitted_data.
$ret[] = update_sql("ALTER TABLE {webform_submited_data} RENAME TO {webform_submitted_data}");
}
if ( $installed_version['build'] < 461 ) {
//$ret[] = array(1 => "Build 4.6.1
\n", 2 => "");
// Update webform.email varchar(50) -> varchar(255).
$ret[] = update_sql(" ALTER TABLE {webform} MODIFY email varchar(255)");
// Update from lable to label in webform_component.
$ret[] = update_sql(" UPDATE {webform_component} SET type = 'label' WHERE type = 'lable'");
}
if ( $installed_version['build'] < 462 ) {
//$ret[] = array(1 => "Build 4.6.2
\n", 2 => "");
// Update webform.confirm varchar(255) -> text and change name to "confirmation".
$ret[] = update_sql(" ALTER TABLE {webform} CHANGE confirm confirmation text");
}
if ( $installed_version['build'] < 463 ) {
//$ret[] = array(1 => "Build 4.6.3
\n", 2 => "");
// No more lazy update ...
// Check if the lazy update has already been performed.
$result = db_query("SHOW COLUMNS FROM {webform} LIKE 'email_subject'");
if (db_num_rows($result) == 0) {
// The email_subject column is needed.
$ret[] = update_sql("ALTER TABLE {webform} ADD COLUMN email_subject varchar(255)");
}
$result = db_query("SHOW COLUMNS FROM {webform} LIKE 'email_from'");
if (db_num_rows($result) == 0) {
// The email_subject column is needed.
$ret[] = update_sql("ALTER TABLE {webform} ADD COLUMN email_from varchar(255)");
}
}
// Set the $current_version.
variable_set("webform_version", $current_version);
return $ret;
}
/**
* Implmentation of hook_uninstall
*/
function webform_uninstall() {
watchdog("webform","Removing webform module.");
// Unset webform variables.
variable_del("webform_use_cookies");
variable_del("webform_debug");
variable_del('webform_enable_fieldset');
if (!isset($componentList)) {
$componentList = array();
$path = drupal_get_path('module', 'webform')."/components";
$files = file_scan_directory($path, '^.*\.inc$');
foreach ($files as $filename => $file) {
variable_del('webform_enable_'.$file->name,1);
}
}
// Delete uploaded files.
$filepath = file_create_path('webform');
_webform_recursive_delete($filepath);
// Drop tables.
db_query("DROP TABLE IF EXISTS {webform}");
db_query("DROP TABLE IF EXISTS {webform_component}");
db_query("DROP TABLE IF EXISTS {webform_submissions}");
db_query("DROP TABLE IF EXISTS {webform_submitted_data}");
// Clear the cache tables.
cache_clear_all(null, 'cache');
cache_clear_all(null, 'cache_filter');
cache_clear_all(null, 'cache_menu');
cache_clear_all(null, 'cache_page');
watchdog("Webform","Webform module removed.");
}
/**
* Recursively delete all files and folders in the specified filepath, then
* delete the containing folder.
*
* Note that this only deletes visible files with write permission
*
* @param string $path
* A filepath relative to file_directory_path
*/
function _webform_recursive_delete($path) {
if ($path) {
$listing = $path . "/*";
foreach(glob($listing) as $file) {
if(is_file($file) === true) {
@unlink($file);
}
elseif(is_dir($file) === true) {
_webform_recursive_delete($file);
}
}
@rmdir($path);
}
}