PostgreSQL: insert on duplicate key

Категории: Найдено в сети Разработка

Да-да. Постгрес не умеет делать

insert * on duplicate key ...

Но это легко эмулируется последовательностью запросов.

UPDATE table SET field='C', field2='Z' WHERE id=3;  
INSERT INTO table (id, field, field2)  
       SELECT 3, 'C', 'Z'  
       WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);

Интересное в сети

Категории: Найдено в сети

Алгоритмы

JavaScript

Ruby

Python

Инструменты

Linux

Всякое

Ростелеком: постоянные обрывы соединения

Категории: HowTo

Все было бы нормально если бы не одно но.

Адсл-модем уверенно устанавливал соединение и. И что самое интересное просто так обрывал pppoe-коннект с фразой “pppoe connection terminated unexpectedly”.

Расследование показало, что перед тем, как соединение будет сброшено в лог (что немаловажно в отладочный дл которого надо повысить уровень отладочных сообщений до dbg) падало сообщение о том, что “no response on 3 echo requests”.

Выяснилось следующее:

  • падение происходило каждые полторы минуты
  • в конфиге для текущего соединения найдена строка lcp echo 30 3

О как! Оказывается, что модем проверяет жизнеспособность соединения при помощи lcp-запросов, а выяснилось, что ростелекомовский adsl их рубит сразу.

Вывод: отключить lcp echo и проверять наличие соединения пингами.

Для zyxel keenetic нужно будет зайти по telnet и выполнить набор команд

(config)> interface PPPoE0  
(config-if)> no lcp echo  
(config-if)> exit  
(config)> system config-save  
(config)> exit

Тем самым мы отключим проверку, которая обрушивает соединение.

Локальный DNS для разработчика

Категории: Разработка HowTo

Итак. У нас море проектов, море виртуалок. И мы хотим как-то удобно с этим всем работать.

Мне по нраву выделять отдельную доменную зону для всех своих виртуалок и подключать к ней нужные адреса.

Предположим, что все проекты у нас будут собраны в доменной зоне *.dev (удобно же).

И каждый из них будет резолвиться по разным адресам.

Составим для себя список хотелок:

  • машины поднимаются вагрантом или еще какой системой (это не так уж и важно)
  • после появления машины в сети ее ip связывается с доменом проекта, который на ней крутится
  • после завершения привязка уделяется

Начинаем хотелки реализовывать.

Ставим named

$ sudo yum install named

Заставляем его слушать только локалхост (он же девелоперский).

Для этого редактируем named.conf и добавляем в раздел options

    listen-on port 53 { 127.0.0.1; };  
    listen-on-v6 port 53 { ::1; };

Теперь нам надо подключить нашу новую зону.

Добавляем подключение описания в named.conf

zone "dev" IN {  
    type master;  
    file "named.dev";  
    allow-query {any;};  
    allow-update {  
        127.0.0.1;  
        ::1;  
    };  
};

В этом описании мы сразу же видим раздел allow-update, который позволяет удаленно изменять зону при помощи команды nsupdate. Разрешаем правку только с локалхоста.

Теперь непосредственно сам файл зоны прямого преобразования - /var/named/named.dev

$ORIGIN dev.  
$TTL 86400    ; 1 day  
@            IN SOA    dev. rname.invalid. (  
                4          ; serial  
                86400      ; refresh (1 day)  
                3600       ; retry (1 hour)  
                604800     ; expire (1 week)  
                10800      ; minimum (3 hours)  
                )  
            NS    dev.  
            A    127.0.0.1  
            AAAA    ::1  
*        IN    A    127.0.0.1

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

Все. Нам осталось перезапустить.

$ sudo service named restart

Проверяем

$ nslookup test.dev 127.0.0.1  
Server:        127.0.0.1  
Address:    127.0.0.1#53

Name:    test.dev  
Address: 127.0.0.1

Кдасс. А как нам связывать домен с адресом?

Для этого нам нужен скрипт.

#!/bin/bash  
TTL=86400  
RECORD=$1  
IP=$2  
(  
 echo "server dev."  
 echo "zone dev"

 echo "update delete ${RECORD} A"  
 echo "update add ${RECORD} ${TTL} A ${IP}"  
 echo "send"  
) | /usr/bin/nsupdate

Пробуем

$ ./named.sh test.dev 1.1.1.1
``````shell
$ nslookup test.dev 127.0.0.1  
Server: 127.0.0.1  
Address: 127.0.0.1#53

Name: test.dev  
Address: 1.1.1.1

Возможные проблемы:

  • неправильно установлены права на папку /var/named
  • неправильно указан адрес с которого можно обновлять зону
  • запрет в selinux - решается выполнением shell $ sudo setsebool -P named_write_master_zones 1

Теперь можно настроить окружение так, чтобы при запуске виртуалки ее адрес обновлялся в файле зоны через скрипт в автоматическом режиме.