|
Программирование >> Программный интерфейс приложений
Метаданные результирующего набора нужны, чтобы выбрать метод обработки данных результирующего набора. Имя и длина столбца нужны для планирования формата вывода данных. Количество строк результирующего набора нужно для программирования цикла обработки строк. Счетчик строки или столбцов можно использовать, если необходимо определить объемы памяти под структуры данных, которые будут получены в результирующем наборе. Есть возможность определить тип данных столбца. Это позволяет определить тип данных, хранящихся в столбце. Ранее в разделе Обработка запросов, возвращающих результаты была представлена версия процедуры process result set (), которая распечатывает строки результирующего набора в формате разделения столбцов символами табуляции. В определенных случаях это хорошо (тогда, когда данные импортируются в электронные таблицы), но это не совсем то, что нужно для визуального исследования или распечаток. Помните, результат ранней версии process result set () имел вид: Adams John Braintree MA Adams John Quincy Braintree MA Arthur Chester A. Fairfield VT Buchanan James Mercersburg PA Bush George W. Milton MA Carter James E.Jr Plains GA Cleveland Grover Caldwell NJ Внесем изменения в процедуру process result set (). Теперь столбцы будут иметь заголовки, печатная форма будет разграфлена. Это более читабельная форма.
Основные операции алгоритма отображения данных следующие. 1. Определить ширину отображения каждого столбца. 2. Распечатать строку с наименованиями столбцов (ограничено вертикальными линиями, предваряется и завершается строками с тире). 3. Распечатать значения каждой строки результирующего набора (каждый столбец которого расположен в соответствующей графе). Кроме того, цифры выравниваются по правому краю, и для пустых значений распечатывается NULL . 4. В конце распечатывается счетчик выбранных строк. Это хороший пример того, каким образом можно использовать метаданные результирующего набора. Для того чтобы создать такое отображение данных, нужно знать не только значения данных, которые содержат строки, но и более детальную информацию. Конечно, можно подумать, что это очень напоминает то, как клиентская программа mysql отображает данные. Да, это так, но вы можете сравнить исходный текст mysql с кодом, который мы получим в конце концов в модифицированном коде process result set О . Они не похожи друг на друга. И будет очень полезно на реальном примере сравнить два подхода к решению одной и той же проблемы. Сначала необходимо определить длину отображаемых столбцов. Ниже приведена распечатка, показывающая, как это делается. Обратите внимание на тот факт, что все вычисления целиком основываются на метаданных результирующего набора данных, и нет никаких ссылок на значения данных в строках. MYSQL FIELD * field; unsigned int i, col len; /* определение длины отображаемых столбцов */ mysql field seek {res set, 0); for (i = 0; i < mysql num fields (res set); i++) { field = mysql fetch field {res set); col len = strlen (field->name); if (col len < field->max length) col len = field->max length; if (col len < 4 && !IS NOT NULL (field->flags)) col len = 4 ; /* 4 = длине слова NULL */ field->max length = col len; /* обновить информацию о столбце} Здесь в последовательных итерациях вычисляется длина столбцов из структур MYSQLFIELD ДЛЯ результирующего набора. Позиционирование на первую структуру осуществляется вызовом функции mysql fetch seek (). Последующие вызовы mysql fetch f ield () возвращают указатели на следующие столбцы. Ширина столбца выбирается как максимум трех величин, каждая из которых зависит от метаданных информационной структуры столбца. Длины field ->name титула столбца. Длины field ->max length самого длинного значения в столбце. Длины строки NULL , если столбец содержит пустое значение f ield->f lags указывает, может или нет столбец содержать пустые данные После того как длина отображения вычислена, она присваивается элементу max length структуры, которую мы получаем из клиентской библиотеки. Допустим такой прием или элементы структуры MYSQL FIELD ДОЛЖНЫ быть открыты ТОЛЬКО ДЛЯ чтения в общем случае, только ДЛЯ чтения, но некоторые из клиентских профамм дистрибуции СУБД MySQL ведут себя со значением max length аналогичным образом Так что можно сказать, что все нормально. (Если вы предпочитаете не использовать max length, объявите массив типа unsigned mt И храните полученные значения длин в нем ) Вычисление длины столбца имеет один недостаток. Вспомним, что max length не имеет никакого смысла, если результирующий набор создается с помощью функции mysql use result О. По этой причине (необходимость вычисления max length) для реализации этого алгоритма лучше подходит функция mysql store result (). Когда нам известна ширина столбца, мы готовы к печати Печать титульной части таблицы несложна Воспользуемся для этого информационной структурой столбца и с учетом ранее вычисленной длины распечатаем имя элемента сфуктуры: prmtf ( %-*s I , field->max length, field->name); Для распечатки данньгх мы просто просмофим сфоки в результирующем наборе, распечатывая при каждой итерации значение текущего столбца Это достаточно сложный процесс потому, что значение может быть равно NULL или может представлять число (в этом случае печать выравнивается по правому краю). Значения столбцов распечатывается следующим образом Здесь row[i] содержит значения данных, а field - указатель на информацию о столбце. if (row[1] == NULL) printf ( %-*s I , field->max lengtti, NULL ); else if (IS NOM(field->type)) printf ( %*s I , field->max lengtti, row[i]); else printf ( %-*s I , field->max lengtti, row[i]); Макрос 1S NUM() принимает значение истина , если тип столбца, который указывается f ield->type, является числовым - INT, FLOAT или DECIMAL. Элемент, хранящий информацию о длине в структуре MYSQL FIELD, хранит информацию о салюй большой длине, которую могут иметь значения столбца Она может больше пригодиться в mysql use resul t О, чем в mysql store resul t О
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |