вторник, 28 сентября 2010 г.

Построение дерева иерархии с помощью PHP / MySQL
Идея отсюда http://forum.vingrad.ru/articles/topic-147526/anchor-entry1188785/0.html

Довольно часто возникает потребность построения дерева иерархии с таблицы со структурой id | parentId | value
Для сравнительно небольшого дерева наиболее эффективным открыл для себя способ, предложенный пользователем под ником SelenIT

Итак, есть у нас таблица tree со структурой
id | pid | value
где id - первичный ключ строки
pid - id родителя

Соединяемся с базой

$hostName = '';
$userName = '';
$password = '';
$databaseName = 'test';
if (!($link=mysql_connect($hostName,$userName,$password)))
{
printf('Connecting MySQL error!');
exit();
}
if (!mysql_select_db($databaseName, $link))
{
printf('Database error!');
exit();
}

Выполняем запрос и получаем данные

$sql='SELECT `id`, `pid`, `value`
FROM `tree`
ORDER BY `pid`';

$tree = array();
$result=mysql_query($sql, $link);
while ($row = mysql_fetch_assoc($result))
{
$tree[$row['pid']][] = $row;
}
mysql_close($link);

Запросом мы выбрали все данные с таблицы и отсортировали по родителю, потом сформировали массив, каждый элемент которого - массив записей с одним и тем же родителем.

Функция ниже приводит полученный выше массив к виду
array(
'id' => 1,
'pid' => 0,
'children' => array(
'id' => 2,
'pid' => 1.
'children' => array ...
)
)

function formTree($pid=0)
{
$data=array();
global $tree;
if (!isset($tree[$pid])) return;
foreach($tree[$pid] as $item)
{
$data[$item['id']]=array(
'id'=>$item['id'],
'value'=>$item['value']
);
$children=formTree($item['id']);
if(!empty($children))
{
$data[$item['id']]['children']=$children;
}
}
return $data;
}

И выводим данные

print_r(formTree());

Все!
?>

среда, 21 июля 2010 г.

Настройка svn+ssh доступа к SVN-репозиторию
Недавно пришлось помучиться с сабжем, вот я и решил блог завести и все записать сюда, чтоб не забыть :)
Итак, поехали.

На сервере создаем юзера для работы с репозиторием, в моем случае svn
Создаем юзера для своей учетной записи - yareg
Для безпарольного доступа на сервер генерим пару приватный-публичный ключ dsa:
для линукса генерим ключи на клиенте:
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
ssh-keygen -t dsa -f ~/.ssh/id_dsa
копируем публичный ключ на сервер:
scp ~/.ssh/id_dsa.pub svn@host:~
добавляем публичный ключ в authorized_keys юзеру svn на сервере:
ssh svn@host
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
cat ./id_dsa_pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

Для мастдая ключи генерим на сервере:
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
ssh-keygen -t dsa -f ~/.ssh/id_dsa
добавляем публичный ключ в authorized_keys
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
забираем приватный ключ на клиентскую машину, запускаем утилититу PuTTYgen, входящую в состав PuTTY, выбираем Conversions - Import key, указываем путь к приватному ключу, кликаем "сохранить", сохраняем как файл .ppk и потом в настройках PuTTY указываем путь к нему.

Далее открываем файл /home/svn/.ssh/authorized_keys и перед публичным ключем вставляем строку:
command="svnserve -t --tunnel-user=yareg"
так, что в итоге должно получиться примерно так:
command="svnserve -t --tunnel-user=yareg" ssh-dss AAAAB3NzaC1kc3MA...
после ключа через пробел можно указать комментарий ;)

Создаем репозиторий (svnadmin create reposname), редактируем файл конфигурации /etc/sysconfig/svnserve:
директива SVNSERVE_OPTIONS должна принять такой вид:
SVNSERVE_OPTIONS="-d -r /srv/svn/repos"
где /srv/svn/repos - папка с репозиториями

Теперь мы можем получить содержимое репозитория:
svn list svn+ssh://svn@host/srv/svn/repos/reposname/
Но, как оказывается, в виндозе не так все просто.
Чтобы получить доступ к репозиторию из консоли, открываем файл C:\Documents and Settings\yareg\Application Data\Subversion\config, находим секцию tunnels и добавляем строку
ssh = D:/Programs/Inet/ssh/putty-0.54-all/PLINK.EXE -2 -i D:/path_to_key/id_dsa.ppk
, после чего проблем с доступом к репозиторию не должно возникнуть.
В NetBeans'е, после выбора Team-Checkout, пользуясь подсказками IDE, вводим путь к репозиторию:
svn+ssh://svn@connectionname/srv/svn/repos/reposname
где connectionname - сохраненное имя соединения к серверу с репозиторием в программе PuTTY
параметры туннелирования:
D:/Programs/Inet/ssh/putty-0.54-all/PLINK.EXE -l svn -i D:/path_to_key/id_dsa.ppk
У меня после этого все заработало. Удачи :)