Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2012, 10:44
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

Сравнить две структуры таблиц MySQL
Имеется две структуры одной и тоже таблицы:
CREATE TABLE `portal-files` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `mandt` char(3) NOT NULL DEFAULT '000' COMMENT 'Мандат',
  `filename` varchar(256) DEFAULT '' COMMENT 'Имя файла',
  `size` int(11) DEFAULT '0' COMMENT 'Размер файла, байт',
  `mimetype` char(64) DEFAULT '' COMMENT 'Тип данных',
  `ernam` int(10) DEFAULT '0' COMMENT 'Идентификатор пользователя, добавившего файл',
  `erdat` int(10) DEFAULT '0' COMMENT 'Время добавления',
  `ispack` tinyint(1) DEFAULT '0' COMMENT 'Время добавления',
  `del` tinyint(1) DEFAULT '0' COMMENT 'Флаг удаления (если = 1, то файл удален)',
  `modname` varchar(128) DEFAULT '' COMMENT 'Имя модуля, к которому относится файл',
  `xdata` varchar(256) DEFAULT '' COMMENT 'Параметры для проверки прав',
  PRIMARY KEY (`id`),
  KEY `Index 2` (`mandt`,`size`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Список файлов'

CREATE TABLE `portal-files` (
  `id` int(10) NOT NULL auto_increment,
  `mandt` char(3) NOT NULL default '000' COMMENT 'Мандат',
  `filename` varchar(256) default '' COMMENT 'Имя файла',
  `size` int(11) default '0' COMMENT 'Размер файла, байт',
  `mimetype` char(64) default '' COMMENT 'Тип данных',
  `ernam` int(10) default '0' COMMENT 'Идентификатор пользователя, добавившего файл',
  `erdat` int(10) default '0' COMMENT 'Время добавления',
  `ispack` tinyint(1) default '0' COMMENT 'Время добавления',
  `del` tinyint(1) default '0' COMMENT 'Флаг удаления (если = 1, то файл удален)',
  `modname` varchar(128) default '' COMMENT 'Имя модуля, к которому относится файл',
  `xdata` varchar(256) default '' COMMENT 'Параметры для проверки прав',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Список файлов'

Как можно заметить, это две структуры одной и той же таблицы. Эту информацию возвращает один и тот же код. Однако описание отличаются. В частности некоторые ключевые слова в разных регистрах. К тому же PRIMARY KEY (`id`) в одном случае один пробел между 'KEY' и '(', в другом два.
Мне же нужно на Javascript-е сравнить эти два описания и вернуть результат: одинаковая структура или нет?

Может кто-то может предложить умную идею по реализации?

p.s. пишу здесь, так как реализация нужна на JS. Надеюсь что народ предложит красивое решение, которого я не вижу.
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2012, 11:20
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Shasoft,
Сравнить чисто как текст, учитывая разницу в пробелах или сравнивать как структуру данных ?
* Тогда межсловные пробелы не будут не учитывацо, кроме структур заключенных в общие кавычки
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2012, 11:42
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

Как структуру. Нужно учитывать не только пробелы, но и разный регистр ключевых слов.
В общем для сравнения разделил текст на лексемы двух типов: с учетом регистра (обрамлены символами ' или `) и без учета регистра (всё остальное).
Разбиваю текст на эти лексемы и потом уже их сравниваю. Вроде работает.
// Разобьем текст на лексемы
			function _parse(text) 
			{
				var res=[];
				res.pushS=function(s){
					if( s.length>0 )
						this.push(s);
				};
				//
				var s="";
				for(var i=0;i<text.length;i++)
				{
					var ch=text.charAt(i);
					switch(ch)
					{	// регистрозависимый текст
						case "'":
						case "`":
						{	
							res.pushS(s);
							var e=text.indexOf(ch,i+1);
							res.pushS( text.substring(i+1,e) );
							s = "";							
							//
							i = e;
						}
						break;
						// Символы окончания лексемы
						case " ":
						case "\r":
						case "\n":
						{
							res.pushS(s.toLowerCase());						
							s="";
						}
						break;
						// Просто добавляем символ к лексеме
						default:
						{
							s+=ch;
						}
						break;
					}
				}
				res.pushS(s);
				//
				return res;
			}

Последний раз редактировалось Shasoft, 11.07.2012 в 11:46.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логика сравнения таблиц mysql T-sh Серверные языки и технологии 7 04.03.2012 17:54