Example #1
0
    }
    //            $dict = NewDataDictionary($connect);
    //            $dropindexquery=$dict->DropIndexSQL(db_table_name_nq($oldtable).'_idx');
    //            $connect->Execute($dropindexquery[0]);
    $deactivatequery = "UPDATE {$dbprefix}surveys SET active='N' WHERE sid={$surveyid}";
    $deactivateresult = $connect->Execute($deactivatequery) or die("Couldn't deactivate because:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br /><a href='{$scriptname}?sid={$postsid}'>Admin</a>");
    $deactivateoutput .= "<br />\n<div class='messagebox ui-corner-all'>\n";
    $deactivateoutput .= "<div class='header ui-widget-header'>" . $clang->gT("Deactivate Survey") . " ({$surveyid})</div>\n";
    $deactivateoutput .= "\t<div class='successheader'>" . $clang->gT("Survey Has Been Deactivated") . "\n";
    $deactivateoutput .= "</div>\n";
    $deactivateoutput .= "\t<p>\n";
    $deactivateoutput .= "\t" . $clang->gT("The responses table has been renamed to: ") . " {$newtable}.\n";
    $deactivateoutput .= "\t" . $clang->gT("The responses to this survey are no longer available using LimeSurvey.") . "\n";
    $deactivateoutput .= "\t<p>" . $clang->gT("You should note the name of this table in case you need to access this information later.") . "</p>\n";
    if (isset($toldtable) && $toldtable) {
        $deactivateoutput .= "\t" . $clang->gT("The tokens table associated with this survey has been renamed to: ") . " {$tnewtable}.\n";
    }
    $deactivateoutput .= "\t<p>" . $clang->gT("Note: If you deactivated this survey in error, it is possible to restore this data easily if you do not make any changes to the survey structure. See the LimeSurvey documentation for further details") . "</p>";
    $deactivateoutput .= "</div><br/>&nbsp;\n";
    $pquery = "SELECT savetimings FROM {$dbprefix}surveys WHERE sid={$postsid}";
    $presult = db_execute_assoc($pquery);
    $prow = $presult->FetchRow();
    //fetch savetimings value
    if ($prow['savetimings'] == "Y") {
        $oldtable = "{$dbprefix}survey_{$postsid}_timings";
        $newtable = "{$dbprefix}old_survey_{$postsid}_timings_{$date}";
        $deactivatequery = db_rename_table($oldtable, $newtable);
        $deactivateresult2 = $connect->Execute($deactivatequery) or die("Couldn't make backup of the survey timings table. Please try again. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was deactivated.<br /><br /><a href='{$scriptname}?sid={$postsid}'>" . $clang->gT("Main Admin Screen") . "</a>");
        $deactivateresult = $deactivateresult && $deactivateresult2;
    }
}
Example #2
0
 /**
  * Tests database interactions.
  */
 function testSchema()
 {
     // Try creating a table.
     $table_specification = array('description' => 'Schema table description may contain "quotes" and could be long—very long indeed.', 'fields' => array('id' => array('type' => 'int', 'default' => NULL), 'test_field' => array('type' => 'int', 'not null' => TRUE, 'description' => 'Schema table description may contain "quotes" and could be long—very long indeed. There could be "multiple quoted regions".'), 'test_field_string' => array('type' => 'varchar', 'length' => 20, 'not null' => TRUE, 'default' => "'\"funky default'\"", 'description' => 'Schema column description for string.'), 'test_field_string_ascii' => array('type' => 'varchar_ascii', 'length' => 255, 'description' => 'Schema column description for ASCII string.')));
     db_create_table('test_table', $table_specification);
     // Assert that the table exists.
     $this->assertTrue(db_table_exists('test_table'), 'The table exists.');
     // Assert that the table comment has been set.
     $this->checkSchemaComment($table_specification['description'], 'test_table');
     // Assert that the column comment has been set.
     $this->checkSchemaComment($table_specification['fields']['test_field']['description'], 'test_table', 'test_field');
     if (Database::getConnection()->databaseType() == 'mysql') {
         // Make sure that varchar fields have the correct collation.
         $columns = db_query('SHOW FULL COLUMNS FROM {test_table}');
         foreach ($columns as $column) {
             if ($column->Field == 'test_field_string') {
                 $string_check = $column->Collation == 'utf8mb4_general_ci';
             }
             if ($column->Field == 'test_field_string_ascii') {
                 $string_ascii_check = $column->Collation == 'ascii_general_ci';
             }
         }
         $this->assertTrue(!empty($string_check), 'string field has the right collation.');
         $this->assertTrue(!empty($string_ascii_check), 'ASCII string field has the right collation.');
     }
     // An insert without a value for the column 'test_table' should fail.
     $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
     // Add a default value to the column.
     db_field_set_default('test_table', 'test_field', 0);
     // The insert should now succeed.
     $this->assertTrue($this->tryInsert(), 'Insert with a default succeeded.');
     // Remove the default.
     db_field_set_no_default('test_table', 'test_field');
     // The insert should fail again.
     $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
     // Test for fake index and test for the boolean result of indexExists().
     $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
     $this->assertIdentical($index_exists, FALSE, 'Fake index does not exists');
     // Add index.
     db_add_index('test_table', 'test_field', array('test_field'), $table_specification);
     // Test for created index and test for the boolean result of indexExists().
     $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
     $this->assertIdentical($index_exists, TRUE, 'Index created.');
     // Rename the table.
     db_rename_table('test_table', 'test_table2');
     // Index should be renamed.
     $index_exists = Database::getConnection()->schema()->indexExists('test_table2', 'test_field');
     $this->assertTrue($index_exists, 'Index was renamed.');
     // We need the default so that we can insert after the rename.
     db_field_set_default('test_table2', 'test_field', 0);
     $this->assertFalse($this->tryInsert(), 'Insert into the old table failed.');
     $this->assertTrue($this->tryInsert('test_table2'), 'Insert into the new table succeeded.');
     // We should have successfully inserted exactly two rows.
     $count = db_query('SELECT COUNT(*) FROM {test_table2}')->fetchField();
     $this->assertEqual($count, 2, 'Two fields were successfully inserted.');
     // Try to drop the table.
     db_drop_table('test_table2');
     $this->assertFalse(db_table_exists('test_table2'), 'The dropped table does not exist.');
     // Recreate the table.
     db_create_table('test_table', $table_specification);
     db_field_set_default('test_table', 'test_field', 0);
     db_add_field('test_table', 'test_serial', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => 'Added column description.'));
     // Assert that the column comment has been set.
     $this->checkSchemaComment('Added column description.', 'test_table', 'test_serial');
     // Change the new field to a serial column.
     db_change_field('test_table', 'test_serial', 'test_serial', array('type' => 'serial', 'not null' => TRUE, 'description' => 'Changed column description.'), array('primary key' => array('test_serial')));
     // Assert that the column comment has been set.
     $this->checkSchemaComment('Changed column description.', 'test_table', 'test_serial');
     $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
     $max1 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
     $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
     $max2 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
     $this->assertTrue($max2 > $max1, 'The serial is monotone.');
     $count = db_query('SELECT COUNT(*) FROM {test_table}')->fetchField();
     $this->assertEqual($count, 2, 'There were two rows.');
     // Test renaming of keys and constraints.
     db_drop_table('test_table');
     $table_specification = array('fields' => array('id' => array('type' => 'serial', 'not null' => TRUE), 'test_field' => array('type' => 'int', 'default' => 0)), 'primary key' => array('id'), 'unique keys' => array('test_field' => array('test_field')));
     db_create_table('test_table', $table_specification);
     // Tests for indexes are Database specific.
     $db_type = Database::getConnection()->databaseType();
     // Test for existing primary and unique keys.
     switch ($db_type) {
         case 'pgsql':
             $primary_key_exists = Database::getConnection()->schema()->constraintExists('test_table', '__pkey');
             $unique_key_exists = Database::getConnection()->schema()->constraintExists('test_table', 'test_field' . '__key');
             break;
         case 'sqlite':
             // SQLite does not create a standalone index for primary keys.
             $primary_key_exists = TRUE;
             $unique_key_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
             break;
         default:
             $primary_key_exists = Database::getConnection()->schema()->indexExists('test_table', 'PRIMARY');
             $unique_key_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
             break;
     }
     $this->assertIdentical($primary_key_exists, TRUE, 'Primary key created.');
     $this->assertIdentical($unique_key_exists, TRUE, 'Unique key created.');
     db_rename_table('test_table', 'test_table2');
     // Test for renamed primary and unique keys.
     switch ($db_type) {
         case 'pgsql':
             $renamed_primary_key_exists = Database::getConnection()->schema()->constraintExists('test_table2', '__pkey');
             $renamed_unique_key_exists = Database::getConnection()->schema()->constraintExists('test_table2', 'test_field' . '__key');
             break;
         case 'sqlite':
             // SQLite does not create a standalone index for primary keys.
             $renamed_primary_key_exists = TRUE;
             $renamed_unique_key_exists = Database::getConnection()->schema()->indexExists('test_table2', 'test_field');
             break;
         default:
             $renamed_primary_key_exists = Database::getConnection()->schema()->indexExists('test_table2', 'PRIMARY');
             $renamed_unique_key_exists = Database::getConnection()->schema()->indexExists('test_table2', 'test_field');
             break;
     }
     $this->assertIdentical($renamed_primary_key_exists, TRUE, 'Primary key was renamed.');
     $this->assertIdentical($renamed_unique_key_exists, TRUE, 'Unique key was renamed.');
     // For PostgreSQL check in addition that sequence was renamed.
     if ($db_type == 'pgsql') {
         // Get information about new table.
         $info = Database::getConnection()->schema()->queryTableInformation('test_table2');
         $sequence_name = Database::getConnection()->schema()->prefixNonTable('test_table2', 'id', 'seq');
         $this->assertEqual($sequence_name, current($info->sequences), 'Sequence was renamed.');
     }
     // Use database specific data type and ensure that table is created.
     $table_specification = array('description' => 'Schema table description.', 'fields' => array('timestamp' => array('mysql_type' => 'timestamp', 'pgsql_type' => 'timestamp', 'sqlite_type' => 'datetime', 'not null' => FALSE, 'default' => NULL)));
     try {
         db_create_table('test_timestamp', $table_specification);
     } catch (\Exception $e) {
     }
     $this->assertTrue(db_table_exists('test_timestamp'), 'Table with database specific datatype was created.');
 }
Example #3
0
        ."<input type='submit' value='"
        .$clang->gT("Delete Tokens")."' onclick=\"".get2post("$scriptname?action=tokens&amp;sid=$surveyid&amp;subaction=kill&amp;ok=surething")."\" />\n"
        ."<input type='submit' value='"
        .$clang->gT("Cancel")."' onclick=\"window.open('$scriptname?action=tokens&amp;sid=$surveyid', '_top')\" />\n";
    }
    elseif (isset($_POST['ok']) && $_POST['ok'] == "surething")
    {
        $oldtable = "tokens_$surveyid";
        $newtable = "old_tokens_{$surveyid}_$date";
        $deactivatequery = db_rename_table( db_table_name_nq($oldtable), db_table_name_nq($newtable));

        if ($databasetype=='postgres')
        {
            // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence
            $oldTableJur = db_table_name_nq($oldtable);
            $deactivatequery = db_rename_table(db_table_name_nq($oldtable),db_table_name_nq($newtable).'_tid_seq');
            $deactivateresult = $connect->Execute($deactivatequery) or die ("oldtable : ".$oldtable. " / oldtableJur : ". $oldTableJur . " / ".htmlspecialchars($deactivatequery)." / Could not rename the old sequence for this token table. The database reported the following error:<br />".htmlspecialchars($connect->ErrorMsg())."<br /><br /><a href='$scriptname?sid={$_GET['sid']}'>".$clang->gT("Main Admin Screen")."</a>");
            $setsequence="ALTER TABLE ".db_table_name_nq($newtable)."_tid_seq ALTER COLUMN tid SET DEFAULT nextval('".db_table_name_nq($newtable)."_tid_seq'::regclass);";
            $deactivateresult = $connect->Execute($setsequence) or die (htmlspecialchars($setsequence)." Could not alter the field tid to point to the new sequence name for this token table. The database reported the following error:<br />".htmlspecialchars($connect->ErrorMsg())."<br /><br />Survey was not deactivated either.<br /><br /><a href='$scriptname?sid={$_GET['sid']}'>".$clang->gT("Main Admin Screen")."</a>");
            $setidx="ALTER INDEX ".db_table_name_nq($oldtable)."_idx RENAME TO ".db_table_name_nq($newtable)."_idx;";
            $deactivateresult = $connect->Execute($setidx) or die (htmlspecialchars($setidx)." Could not alter the index for this token table. The database reported the following error:<br />".htmlspecialchars($connect->ErrorMsg())."<br /><br />Survey was not deactivated either.<br /><br /><a href='$scriptname?sid={$_GET['sid']}'>".$clang->gT("Main Admin Screen")."</a>");
        } else {
            $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't deactivate because:<br />\n".htmlspecialchars($connect->ErrorMsg())." - Query: ".htmlspecialchars($deactivatequery)." <br /><br />\n<a href='$scriptname?sid=$surveyid'>Admin</a>\n");
        }

        $tokenoutput .= '<br />'.$clang->gT("The tokens table has now been removed and tokens are no longer required to access this survey.")."<br /> ".$clang->gT("A backup of this table has been made and can be accessed by your system administrator.")."<br />\n"
        ."(\"{$dbprefix}old_tokens_{$surveyid}_$date\")"."<br /><br />\n"
        ."<input type='submit' value='"
        .$clang->gT("Main Admin Screen")."' onclick=\"window.open('$scriptname?sid={$surveyid}', '_top')\" />\n";
    }
    $tokenoutput .= "</div>\n";
/**
 * Act on deletion of a field.
 *
 * This hook is invoked from field_delete_field() to ask the field storage
 * module to mark all information stored in the field for deletion.
 *
 * @param $field
 *   The field being deleted.
 */
function hook_field_storage_delete_field($field)
{
    // Mark all data associated with the field for deletion.
    $field['deleted'] = 0;
    $table = _field_sql_storage_tablename($field);
    $revision_table = _field_sql_storage_revision_tablename($field);
    db_update($table)->fields(array('deleted' => 1))->execute();
    // Move the table to a unique name while the table contents are being deleted.
    $field['deleted'] = 1;
    $new_table = _field_sql_storage_tablename($field);
    $revision_new_table = _field_sql_storage_revision_tablename($field);
    db_rename_table($table, $new_table);
    db_rename_table($revision_table, $revision_new_table);
    drupal_get_schema(NULL, TRUE);
}
 $aResult = db_execute_num($sQuery) or safe_die("Couldn't get list of token tables from database<br />{$query}<br />" . $connect->ErrorMsg());
 while ($aRow = $aResult->FetchRow()) {
     $tablename = substr($aRow[0], strlen($dbprefix));
     $iSurveyID = substr($tablename, strpos($tablename, '_') + 1);
     $qquery = "SELECT sid FROM {$dbprefix}surveys WHERE sid='{$iSurveyID}'";
     $qresult = $connect->Execute($qquery) or safe_die("Couldn't check survey table for sid<br />{$qquery}<br />" . $connect->ErrorMsg());
     $qcount = $qresult->RecordCount();
     if ($qcount == 0) {
         $date = date('YmdHis') . rand(1, 1000);
         $sOldTable = "tokens_{$iSurveyID}";
         $sNewTable = "old_tokens_{$iSurveyID}_{$date}";
         $deactivatequery = db_rename_table(db_table_name_nq($sOldTable), db_table_name_nq($sNewTable));
         if ($databasetype == 'postgres') {
             // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence
             $sOldTableJur = db_table_name_nq($sOldTable);
             $deactivatequery = db_rename_table(db_table_name_nq($sOldTable), db_table_name_nq($sNewTable) . '_tid_seq');
             $deactivateresult = $connect->Execute($deactivatequery) or die("oldtable : " . $sOldTable . " / oldtableJur : " . $sOldTableJur . " / " . htmlspecialchars($deactivatequery) . " / Could not rename the old sequence for this token table. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br /><a href='{$scriptname}?sid={$_GET['sid']}'>" . $clang->gT("Main Admin Screen") . "</a>");
             $setsequence = "ALTER TABLE " . db_table_name_nq($sNewTable) . "_tid_seq ALTER COLUMN tid SET DEFAULT nextval('" . db_table_name_nq($sNewTable) . "_tid_seq'::regclass);";
             $deactivateresult = $connect->Execute($setsequence) or die(htmlspecialchars($setsequence) . " Could not alter the field tid to point to the new sequence name for this token table. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was not deactivated either.<br /><br /><a href='{$scriptname}?sid={$_GET['sid']}'>" . $clang->gT("Main Admin Screen") . "</a>");
             $setidx = "ALTER INDEX " . db_table_name_nq($sOldTable) . "_idx RENAME TO " . db_table_name_nq($sNewTable) . "_idx;";
             $deactivateresult = $connect->Execute($setidx) or die(htmlspecialchars($setidx) . " Could not alter the index for this token table. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was not deactivated either.<br /><br /><a href='{$scriptname}?sid={$_GET['sid']}'>" . $clang->gT("Main Admin Screen") . "</a>");
         } else {
             $deactivateresult = $connect->Execute($deactivatequery) or die("Couldn't deactivate because:<br />\n" . htmlspecialchars($connect->ErrorMsg()) . " - Query: " . htmlspecialchars($deactivatequery) . " <br /><br />\n<a href='{$scriptname}?sid={$surveyid}'>Admin</a>\n");
         }
     }
 }
 /**********************************************************************/
 /*     CHECK CONDITIONS                                               */
 /**********************************************************************/
 $query = "SELECT * FROM {$dbprefix}conditions ORDER BY cid";
 $result = db_execute_assoc($query) or safe_die("Couldn't get list of conditions from database<br />{$query}<br />" . $connect->ErrorMsg());
Example #6
0
             $part2len = strlen($row['id']) - 12;
             $part2 = sprintf("%0{$part2len}d", substr($row['id'], 12, strlen($row['id']) - 12) + 1);
             $new_autonumber_start = "{$part1}{$part2}";
         } else {
             $new_autonumber_start = $row['id'] + 1;
         }
     }
 }
 $query = "UPDATE {$dbprefix}surveys SET autonumber_start={$new_autonumber_start} WHERE sid={$surveyid}";
 @($result = $connect->Execute($query));
 //Note this won't die if it fails - that's deliberate.
 $deactivatequery = db_rename_table($oldtable, $newtable);
 $deactivateresult = $connect->Execute($deactivatequery) or die("Couldn't make backup of the survey table. Please try again. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was not deactivated either.<br /><br /><a href='{$scriptname}?sid={$postsid}'>" . $clang->gT("Main Admin Screen") . "</a>");
 if ($databasetype == 'postgres') {
     // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence
     $deactivatequery = db_rename_table($oldtable . '_id_seq', $newtable . '_id_seq');
     $deactivateresult = $connect->Execute($deactivatequery) or die("Couldn't make backup of the survey table. Please try again. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was not deactivated either.<br /><br /><a href='{$scriptname}?sid={$postsid}'>" . $clang->gT("Main Admin Screen") . "</a>");
     $setsequence = "ALTER TABLE {$newtable} ALTER COLUMN id SET DEFAULT nextval('{$newtable}_id_seq'::regclass);";
     $deactivateresult = $connect->Execute($setsequence) or die("Couldn't make backup of the survey table. Please try again. The database reported the following error:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br />Survey was not deactivated either.<br /><br /><a href='{$scriptname}?sid={$postsid}'>" . $clang->gT("Main Admin Screen") . "</a>");
 }
 //            $dict = NewDataDictionary($connect);
 //            $dropindexquery=$dict->DropIndexSQL(db_table_name_nq($oldtable).'_idx');
 //            $connect->Execute($dropindexquery[0]);
 $deactivatequery = "UPDATE {$dbprefix}surveys SET active='N' WHERE sid={$surveyid}";
 $deactivateresult = $connect->Execute($deactivatequery) or die("Couldn't deactivate because:<br />" . htmlspecialchars($connect->ErrorMsg()) . "<br /><br /><a href='{$scriptname}?sid={$postsid}'>Admin</a>");
 $deactivateoutput .= "<br />\n<div class='messagebox'>\n";
 $deactivateoutput .= "<div class='header'>" . $clang->gT("Deactivate Survey") . " ({$surveyid})</div>\n";
 $deactivateoutput .= "\t<div class='successheader'>" . $clang->gT("Survey Has Been Deactivated") . "\n";
 $deactivateoutput .= "</div>\n";
 $deactivateoutput .= "\t<p>\n";
 $deactivateoutput .= "\t" . $clang->gT("The responses table has been renamed to: ") . " {$newtable}.\n";
 /**
  * Tests database interactions.
  */
 function testSchema()
 {
     // Try creating a table.
     $table_specification = array('description' => 'Schema table description may contain "quotes" and could be long—very long indeed.', 'fields' => array('id' => array('type' => 'int', 'default' => NULL), 'test_field' => array('type' => 'int', 'not null' => TRUE, 'description' => 'Schema table description may contain "quotes" and could be long—very long indeed. There could be "multiple quoted regions".'), 'test_field_string' => array('type' => 'varchar', 'length' => 20, 'not null' => TRUE, 'default' => "'\"funky default'\"", 'description' => 'Schema column description for string.')));
     db_create_table('test_table', $table_specification);
     // Assert that the table exists.
     $this->assertTrue(db_table_exists('test_table'), 'The table exists.');
     // Assert that the table comment has been set.
     $this->checkSchemaComment($table_specification['description'], 'test_table');
     // Assert that the column comment has been set.
     $this->checkSchemaComment($table_specification['fields']['test_field']['description'], 'test_table', 'test_field');
     // An insert without a value for the column 'test_table' should fail.
     $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
     // Add a default value to the column.
     db_field_set_default('test_table', 'test_field', 0);
     // The insert should now succeed.
     $this->assertTrue($this->tryInsert(), 'Insert with a default succeeded.');
     // Remove the default.
     db_field_set_no_default('test_table', 'test_field');
     // The insert should fail again.
     $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
     // Test for fake index and test for the boolean result of indexExists().
     $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
     $this->assertIdentical($index_exists, FALSE, 'Fake index does not exists');
     // Add index.
     db_add_index('test_table', 'test_field', array('test_field'));
     // Test for created index and test for the boolean result of indexExists().
     $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
     $this->assertIdentical($index_exists, TRUE, 'Index created.');
     // Rename the table.
     db_rename_table('test_table', 'test_table2');
     // Index should be renamed.
     $index_exists = Database::getConnection()->schema()->indexExists('test_table2', 'test_field');
     $this->assertTrue($index_exists, 'Index was renamed.');
     // Copy the schema of the table.
     db_copy_table_schema('test_table2', 'test_table3');
     // Index should be copied.
     $index_exists = Database::getConnection()->schema()->indexExists('test_table3', 'test_field');
     $this->assertTrue($index_exists, 'Index was copied.');
     // Data should still exist on the old table but not on the new one.
     $count = db_select('test_table2')->countQuery()->execute()->fetchField();
     $this->assertEqual($count, 1, 'The old table still has its content.');
     $count = db_select('test_table3')->countQuery()->execute()->fetchField();
     $this->assertEqual($count, 0, 'The new table has no content.');
     // Ensure that the proper exceptions are thrown for db_copy_table_schema().
     $fail = FALSE;
     try {
         db_copy_table_schema('test_table4', 'test_table5');
     } catch (SchemaObjectDoesNotExistException $e) {
         $fail = TRUE;
     }
     $this->assertTrue($fail, 'Ensure that db_copy_table_schema() throws an exception when the source table does not exist.');
     $fail = FALSE;
     try {
         db_copy_table_schema('test_table2', 'test_table3');
     } catch (SchemaObjectExistsException $e) {
         $fail = TRUE;
     }
     $this->assertTrue($fail, 'Ensure that db_copy_table_schema() throws an exception when the destination table already exists.');
     // We need the default so that we can insert after the rename.
     db_field_set_default('test_table2', 'test_field', 0);
     $this->assertFalse($this->tryInsert(), 'Insert into the old table failed.');
     $this->assertTrue($this->tryInsert('test_table2'), 'Insert into the new table succeeded.');
     // We should have successfully inserted exactly two rows.
     $count = db_query('SELECT COUNT(*) FROM {test_table2}')->fetchField();
     $this->assertEqual($count, 2, 'Two fields were successfully inserted.');
     // Try to drop the table.
     db_drop_table('test_table2');
     $this->assertFalse(db_table_exists('test_table2'), 'The dropped table does not exist.');
     // Recreate the table.
     db_create_table('test_table', $table_specification);
     db_field_set_default('test_table', 'test_field', 0);
     db_add_field('test_table', 'test_serial', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => 'Added column description.'));
     // Assert that the column comment has been set.
     $this->checkSchemaComment('Added column description.', 'test_table', 'test_serial');
     // Change the new field to a serial column.
     db_change_field('test_table', 'test_serial', 'test_serial', array('type' => 'serial', 'not null' => TRUE, 'description' => 'Changed column description.'), array('primary key' => array('test_serial')));
     // Assert that the column comment has been set.
     $this->checkSchemaComment('Changed column description.', 'test_table', 'test_serial');
     $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
     $max1 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
     $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
     $max2 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
     $this->assertTrue($max2 > $max1, 'The serial is monotone.');
     $count = db_query('SELECT COUNT(*) FROM {test_table}')->fetchField();
     $this->assertEqual($count, 2, 'There were two rows.');
     // Use database specific data type and ensure that table is created.
     $table_specification = array('description' => 'Schema table description.', 'fields' => array('timestamp' => array('mysql_type' => 'timestamp', 'pgsql_type' => 'timestamp', 'sqlite_type' => 'datetime', 'not null' => FALSE, 'default' => NULL)));
     try {
         db_create_table('test_timestamp', $table_specification);
     } catch (\Exception $e) {
     }
     $this->assertTrue(db_table_exists('test_timestamp'), 'Table with database specific datatype was created.');
 }