function doCopy( $dmid_dirty, $dc1_dirty, $dc2_dirty ) {
	$dmid = mysql_real_escape_string( $dmid_dirty );
	$dc1 = mysql_real_escape_string( $dc1_dirty );
	$dc2 = mysql_real_escape_string( $dc2_dirty );

	CopyTools::newCopyTransaction( $dc1, $dc2 );

	$dmc = new DefinedMeaningCopier( $dmid, $dc1, $dc2 );
	$dmc->dup();

	return true; # seems everything went ok.

}
	protected function _doCopy( $dmid_dirty, $dc1_dirty, $dc2_dirty ) {
		global
			$wgCommunityEditPermission, $wgOut, $wgUser, $wgCommunity_dc;
		
		# escape parameters
		$dmid = mysql_real_escape_string( $dmid_dirty );
		$dc1 = mysql_real_escape_string( $dc1_dirty );
		$dc2 = mysql_real_escape_string( $dc2_dirty );

		# check permission
		if ( !( $wgUser->isAllowed( 'wikidata-copy' ) ) or $dc2 != $wgCommunity_dc ) {
			$wgOut->addHTML( wfMsgSc( "Permission_denied" ) );
			return false; # we didn't perform the copy.
		}

		# copy
		CopyTools::newCopyTransaction( $dc1, $dc2 );
		$dmc = new DefinedMeaningCopier( $dmid, $dc1, $dc2 );
		$dmc->dup();

		# For purposes of current "edit copy", 
		# having the dm be already_there() is ok.
		# (hence commented out)
		# if ($dmc->already_there() ) {
		#	$wgOut->addHTML(wfMsgSc("already_there"));
		#	return false;
		# }

		return true; # seems everything went ok.

	}