Спрятать колонку

программирование

Drupal. Облако тегов

Большого смысла огород городить в этом посте нет. Приведу код.

<?php
	$fsMax = 180;
	$fsMin = 80;
	$dicts = array(1, 2, 3);
	$output = '';
	foreach($dicts as $dict){
		if ($output <> '') $output .= '<br/><br/><hr><br/>';
 
		$sql = "select max(v.term_count) max_count, min(v.term_count) min_count, t.name from (select td.tid, count(tn.tid) term_count from {term_data} td left join {term_node} tn on td.tid = tn.tid where td.vid = $dict group by td.tid) v, (select name from {vocabulary} where vid = $dict) t group by t.name";
		$res = db_query($sql);
		$vals = db_fetch_object($res);
		$max = $vals->max_count;
		$min = $vals->min_count;
		$name = $vals->name;
		$factor = ($min == $max ? 0 : ($fsMax - $fsMin) / ($max - $min));
 
		$orderBy = 't_data.name';
		$orderBy = 't_count desc';		
		$sql = "select t_data.name, t_data.tid, count(t_node.tid) t_count from {term_data} t_data left join {term_node} t_node on t_data.tid = t_node.tid where t_data.vid = %d group by t_data.name, t_data.tid order by %s";
		$res = db_query($sql, $dict, $orderBy);
		$tags = '';
		$has_terms = false;
		while ($term = db_fetch_object($res)){
			$size = $fsMin + ($term->t_count - $min) * $factor;
			$style = "font-size:$size%";
			$tags .= l($term->name, 'taxonomy/term/' . $term->tid, array('attributes' => array('style' => $style))) . " ";
			$has_terms = true;
		}
		$output .= "<h1>$name</h1> <br/>$tags";
 	}
 	if (!empty($output)) return $output;
?>

Комментировать тоже особенно нечего. Вывожу термины, с использованием l(), только потому, что нигде не темизировал у себя вывод терминов, а тратить при этом время на лишние вызовы не хочется. Этот кусок можно переделать по собственно желанию.

Все просто и легко.

>> Читать далее

MySql. События

Часто необходимо планировать действия, которые должны происходить с СУБД с определенным интервалом времени. К примеру, это может быть очистка временных таблиц, удаление старых логов и т.д. Раньше для этого необходимо было писать cron job, добавить его вызов (если хостер предоставляет такую возможность, а если нет). Много мороки получается. Начиная с MySql 5.1 все станет немного проще. В распоряжении разработчика теперь имеется оператор CREATE EVENT

CREATE 
    [DEFINER = { USER | CURRENT_USER }]
    EVENT 
    [IF NOT EXISTS]
    event_name    
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO sql_statement;
 
schedule:
    AT TIMESTAMP [+ INTERVAL INTERVAL] ...
  | EVERY INTERVAL 
    [STARTS TIMESTAMP [+ INTERVAL INTERVAL] ...] 
    [ENDS TIMESTAMP [+ INTERVAL INTERVAL] ...]
 
INTERVAL:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

Хорошей практикой при этом является инкапсуляция действий в функцию и вызов непосредственно ее. К примеру:

CREATE EVENT delete_trash 
   ON SCHEDULE 
   EVERY 1 DAY
   COMMENT 'This function deletes trash'
DO
   CALL del_trash;

Данное событие будет вызываться раз в сутки и выполнять фукнцию del_trash.
Для того, чтобы подобные вызовы могли осуществляться, необходимо в файле конфигурации или с помощью команды SET разрешить выполняться потоку, в котором будут запускаться события:

SET GLOBAL event_scheduler := 1;

>> Читать далее

Drupal. Просмотр присоединенных изображений.

Друпал отличная штука, но мне всегда не нравился некий минимализм в его отношениях с пользователем.

Во многих форумах, как IPB, vB, phpBB, есть предпросмотр изображений, которые были приаттачены к посту. По умолчанию drupal не предоставляет такой возможности, однако, как всегда, можно дописать пару функций к template.php или же создать модуль. Модуль я не писал, предпочел обойтись изменениями в template.php, но, имея этот код, можно запросто переделать его в модуль.

В чем смысл функций.
Вся информация о загруженных файлах хранится в таблице {files}. Оттуда можно взять тип файла, путь и размер (если это изображение). В эту таблицу мы можем добавить еще одно поле, в котором будет хранится путь к изображению, используемому для предпросмотра. При просмотре нода мы сначала будем проверять, заполнено ли это поле, и если нет, то будем создавать файл с заранее заданными размерами.

Поехали по пунктам:
Создаем поле, будьте внимательны с префиксом для таблицы (в данном случае я сторонник править core table):

ALTER TABLE files
ADD COLUMN (thumbnail varchar(255) DEFAULT NULL);

В функцию phptemplate_preprocess_comment добавляем кусок кода:

 $cid = $vars['comment']->cid;
    $files = db_query("select f.* from {files} f, {comment_upload} up where up.cid = '$cid' and f.fid = up.fid");
    $contentFiles = getFilesPreview($files);
    if ($contentFiles <> ''){
    	$contentFiles = "<table>$contentFiles</tr></table>";
      $vars['content'] = str_replace('<table class="comment-upload-attachments">', $contentFiles . '<table class="comment-upload-attachments">', $vars['content']);
    }

аналогичный код можно добавить и в phptemplate_preporoccess_node

Функция getFilesPreview:

function getFilesPreview($files){
  $imagesPerRow = 5; -- количество изображений в строке
  $imageWidth = 150;  -- ширина превью

>> Читать далее

Oracle. Code Analyze

Партия сказала, что нужно найти и цинично воспользоваться софтом для проверки кода на "корректность и правильность". Не могу сказать, что это очень правильная мысль, потому что большинство данных программ (не только связанных с СУБД) построено по принципу внутренних правил. Например, может быть правило, согласно которому длина имени переменной не должна быть меньше пяти символов. Это делается для того, чтобы имена были "говорящими", а не просто A1, но будет ругаться на обычные переменные, используемые для цикла вроде I, J. Раз переубедить начальство не получается, то приходится выполнять то, что говорят. Далее я приведу те способы отлова "некорректностей", которые я нашел и мне помогли найти люди с sql.ru.

1. Предупреждения компилятора.

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';
ALTER PROCEDURE FOO COMPILE;
SHOW ERRORS;

Этим способом можно выловить предупреждения такие, как: unreachable code, unusable vars, function returns without value. Что, согласитесь, уже очень хорошо, но может быть недостаточно.

2. CodeXpert
Здесь все просто и понятно: нажал на кнопку получил результат.

3. Анализ перегруженных функций в пакетах
Есть также набор пакетов, которые предназначены, насколько я понял, для анализа перегруженных функций, но разбираться с ними долго и тратить время желания большого нет.
ссылка

Пожалуй, на этом все.
Некоторые "некорректности", такие как: незакрытые курсоры, отсутствие секции EXCEPTION можно ловить лишь опытным глазом программиста.

JFYI

Oracle. Синонимы и DDL, DML

В Oracle есть такая замечательная возможность - создавать синонимы, а потом их использовать. Если не все их создают, то уж пользуются ими точно все: уж просто вычитывая данные из таблицы, к примеру, ALL_OBJECTS.

Ковыряясь в синонимах, обнаружил небольшую странность в их поведении. С ними нельзя проводить DDL операций, тогда как DML разрешены. Рассмотрим небольшой пример.

Создадим таблицу table_name и синоним для нее table_synonym

CREATE TABLE table_name(
    id number
);
 
CREATE synonym table_synonym FOR table_name;

Выполним к ней запрос:

SELECT * FROM table_synonym

работает и это правильно, так и должно быть.
Попытаемся теперь добавить столбец в эту таблицу, используя синоним:

ALTER TABLE table_synonym
ADD (name varchar2(20));

получаем ошибку: table or view does not exist, что правильно Такая же операция без использования синонима выполнится корректно:

ALTER TABLE table_name
ADD (name varchar2(20));

Работает это так потому, что синоним не есть таблица, а лишь объект, с помощью которого можно обратится к данным. И если есть право ALTER TABLE, то нет права ALTER_TABLE_through_synonym, что может быть и не совсем логично, потому что, имея права на изменения объекта, мы могли бы изменять этот объект через его синоним, но такова реализация.

добавлено:
и все же это странно. у нас ведь нет права на delete from synonym,а удалить мы можем данные без проблем. в то время как такая же операция с alter table synonym не проходит. странно, пока нормального объяснения не нашел.

Oracle. Когда курсор возвращается параметром

Как посмотреть содержимое курсора, который возвращается как OUT параметр из фукнции?

Зачастую на проектах бывает, что ораклисты пишут back-end и не имеют доступа на front-end, за исключением тестовой среды, на которой не развернешься особо, потому что там рулят всем тестеры. В этом случае у вас не будет возможности запустить клиент и посмотреть на набор данных, которые вернет ваша функция.

Долго копался в Toad 9.6, но так и не нашел возможности просмотреть содержимое курсора. Если он возвращается как результат - можно, как параметр - не получается. В этом случае к нам на помощь приходит старый, добрый SqlPlus:

var ds refcursor; -- объявляем переменную;
DECLARE
  res NUMBER; -- результат, который возвращает вызываемая функция
BEGIN
  res := call_function(:ds); -- непосредственно вызов
END;
print :ds; -- вывод курсора на экран

В при этом нужно не забывать о форматировании вывода, потому что ты работаем в плюсе; про символ ":", потому что это переменная.

Быстрого дебага

Oracle и NULL

Одним из небольших подводных камней в Oracle может является Null и операции с ним.
Для работы с ним нужно четко уяснить два правила:
1. Null <> Null всегда и везде
2. Помнить о преобразовании типов.

Рассмотрим далее пример.

Создадим таблицу:

CREATE TABLE test_null(
  v_is_null varchar2(10)
);

прогоним скрипт:

INSERT INTO test_null(v_is_null) VALUES(NULL);
INSERT INTO test_null(v_is_null) VALUES('  ');
INSERT INTO test_null(v_is_null) VALUES('');

сколько строк вернут следующие запросы?
1.

SELECT  * FROM test_null
WHERE v_is_null = NULL

2.

SELECT  * FROM test_null
WHERE v_is_null = ''

3.

SELECT  * FROM test_null
WHERE v_is_null = '  '

Правильные ответы:
1. ноль строк. Потому что Null <> Null
2. ноль строк. Потому что '' (пустая строка) всегда трактуется как Null, далее смотрите пункт 1)
3. одна строка.

Помните о преобразованиях типов.

RSS-материал

Наверх