_mediamosa_migration_mediafile_metadata

Versions
mediamosa-21
_mediamosa_migration_mediafile_metadata()

Migrate the mediafile metadata table.

Code

sites/all/modules/mediamosa_migration/mediamosa_migration.inc, line 568

<?php
function _mediamosa_migration_mediafile_metadata() {
  // Get the database name.
  $db_name = _mediamosa_migration_get_memo_data_db();

  // Get the current mode, which might be empty;
  $old_mode = db_query('SELECT @@SESSION.sql_mode')->fetchField();

  // Turn off problems with empty dates.
  db_query("SET SESSION sql_mode = 'ALLOW_INVALID_DATES'");

  // Remove the unique index on mediafile_id.
  db_query("ALTER TABLE {mediamosa_asset_mediafile_metadata} DROP INDEX uni_mediafileid");

  // Add SECOND, so SECONDS and SECOND.
  db_change_field(
    mediamosa_asset_mediafile_metadata_db::TABLE_NAME,
    mediamosa_asset_mediafile_metadata_db::STILL_TYPE,
    mediamosa_asset_mediafile_metadata_db::STILL_TYPE,
    array(
      'description' => t('The type of the still.'),
      'type' => "enum('" . implode("','", array(mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NORMAL, 'SECONDS', mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SECOND, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SCENE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_PICTURE)) . "')",
      'mysql_type' => "enum('" . implode("','", array(mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NORMAL, 'SECONDS', mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SECOND, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SCENE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_PICTURE)) . "')",
      'default' => mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE,
    )
  );

  // The mediamosa_asset_mediafile table should be empty (its checked as requirement).
  /**
   * Copy from 1.x to 2.x
   * Columns dropped;
   * -
   * Columns renamed;
   * mediafile_id = mediafile_id
   */
  db_query(strtr(
    "INSERT INTO {mediamosa_asset_mediafile_metadata}
      (
        metadata_id,
        mediafile_id,
        video_codec,
        colorspace,
        width,
        height,
        fps,
        audio_codec,
        sample_rate,
        channels,
        file_duration,
        container_type,
        bitrate,
        bpp,
        filesize,
        mime_type,
        created,
        changed,
        is_hinted,
        is_inserted_md,
        still_time_code,
        still_order,
        still_type,
        still_format,
        still_default
      ) (SELECT
        mfd.metadata_id,
        mfd.mediafile_id,
        mfd.video_codec,
        mfd.colorspace,
        mfd.width,
        mfd.height,
        mfd.fps,
        mfd.audio_codec,
        mfd.sample_rate,
        mfd.channels,
        mfd.file_duration,
        mfd.container_type,
        mfd.bitrate,
        mfd.bpp,
        mfd.filesize,
        mfd.mime_type,
        mfd.created,
        mfd.changed,
        mfd.is_hinted,
        mfd.is_inserted_md,
        mfd.still_time_code,
        mfd.still_order,
        mfd.still_type,
        mfd.still_format,
        mfd.still_default
        FROM #db_name.{mediafile_metadata} AS mfd JOIN #db_name.{mediafile} AS mf USING(mediafile_id))",
    array(
      '#db_name' => $db_name
    ))
  );

  // Update still_type_2 SECONDS to SECOND.
  db_query("UPDATE {mediamosa_asset_mediafile_metadata} SET still_type = 'SECOND' WHERE still_type = 'SECONDS'");

  // Remove SECONDS.
  db_change_field(
    mediamosa_asset_mediafile_metadata_db::TABLE_NAME,
    mediamosa_asset_mediafile_metadata_db::STILL_TYPE,
    mediamosa_asset_mediafile_metadata_db::STILL_TYPE,
    array(
      'description' => t('The type of the still.'),
      'type' => "enum('" . implode("','", array(mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NORMAL, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SECOND, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SCENE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_PICTURE)) . "')",
      'mysql_type' => "enum('" . implode("','", array(mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NORMAL, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SECOND, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_SCENE, mediamosa_asset_mediafile_metadata_db::STILL_TYPE_PICTURE)) . "')",
      'default' => mediamosa_asset_mediafile_metadata_db::STILL_TYPE_NONE,
    )
  );

  // Now copy all changed dates to overwrite empty created dates.
  db_query("UPDATE {mediamosa_asset_mediafile_metadata} SET created = changed WHERE created = '0000-00-00 00:00:00' AND changed != '0000-00-00 00:00:00'");

  // Now make sure created is not empty.
  db_query("UPDATE {mediamosa_asset_mediafile_metadata} SET created = NOW() WHERE created = '0000-00-00 00:00:00'");

  // Now make sure changed is not empty.
  db_query("UPDATE {mediamosa_asset_mediafile_metadata} SET changed = NOW() WHERE changed = '0000-00-00 00:00:00'");

  // Now remove the double metadata.

  // Select
  $tmp_table_name = db_query_temporary("SELECT COUNT(*) AS total, MIN(metadata_id) AS metadata_id FROM {mediamosa_asset_mediafile_metadata} GROUP BY mediafile_id HAVING total > 1");
  $row_count = db_query("SELECT COUNT(metadata_id) FROM " . $tmp_table_name)->fetchField();

  // Might deadlock, so lets protect.
  $max = 100;
  while ($row_count && --$max) {
    // Delete the doubles we found.
    db_query("DELETE FROM {mediamosa_asset_mediafile_metadata} WHERE metadata_id IN (SELECT metadata_id FROM " . $tmp_table_name . ")");

    // Now query again, because there can be more than 2, 3, 4, etc rows of each double.
    $tmp_table_name = db_query_temporary("SELECT COUNT(*) AS total, MIN(metadata_id) AS metadata_id FROM {mediamosa_asset_mediafile_metadata} GROUP BY mediafile_id HAVING total > 1");
    $row_count = db_query("SELECT COUNT(metadata_id) FROM " . $tmp_table_name)->fetchField();
  }

  // Remove the unique index on mediafile_id.
  db_query("ALTER TABLE {mediamosa_asset_mediafile_metadata} ADD UNIQUE KEY `uni_mediafileid` (`mediafile_id`)");

  // Back to old session mode.
  db_query(strtr("SET SESSION sql_mode = '#old_mode'", array('#old_mode' => $old_mode)));
}
?>