PostgreSQL и выборка из полей содержащих JSON

Postgre позволяет хранить данные в JSON с колонках с типами json и jsonb, которые по сути отличаются только способом хранения. json — в виде текста (хорошо видно визуально, можно обрабатывать запросы как с «текстом») и jsonb — в виде сжатых бинарных данных (занимает меньше места, можно индексировать. Причем если данные хранятся в виде jsonb, то порядок сохранения ключей в JSON не гарантируется. В принципе вполне удобно хранить так данные, если не возможно заранее определить точно структуру таблицы.

Ну и ниже пример работы с такими данными.

Вставка:

insert into epd_expansion (period,ls,orgid,parties) values ('2025-10-01',1,2,'[4,5,6]')

Выборка:

SELECT * FROM public.epd_expansion where parties is not null;

А вот так например, как можно например сделать выборку всех строк, имеющих в массиве partise число 3:

SELECT * FROM public.epd_expansion where parties@>'[3]'::jsonb;

Rustore и логика

На днях столкнулся вплотную с маразмом Rustore, а именно:

  • Однажды загруженное приложение apk удалить из магазина уже невозможно. Можно только скрыть
  • Т.к. приложение скрыто, а не удалено то другой разработчик загрузить это приложение (с этим именем пакета) уже не может.

Как следствие часто возникают ситуации: кто-то скачал apk твоего приложения из любого магазина приложений (например Goole Play), загрузил его в Rustore.. И всё. Ты теперь своё приложение уже никогда не загрузишь сам. Техподдержка отписывается: связывайтесь с тем кто загрузил это приложение первый и пусть передаёт приложение к тебе, написав кучу бумажек. А если связаться не удаётся? Или это вообще злоумышленник-шантажист?

У меня ситуация несколько проще: я когда то загрузил это приложение скачав из Google Play его, т.к. в Rustore его не было — разработчик не выложил. А теперь разработчик и хочет, но не может из-за меня. Вот теперь занимаемся перепиской и бумаготворчеством.. Казалось бы элементарный функционал добавить — на подобии передачи домена. Один код генерирует, другое его вставляет. И всё — передача завершена.

Особенности работы с DOMDocument в php 7 и 8

Разрабатывал давече один скрипт по работе с XML, на рабочем ПК, установленным php 8.2, и был весьма удивлён, что код вида:

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadXML($this->xml_req);
$root = $dom->documentElement;
$root->getElementsByTagName('Signature')->item(0)->remove();

Отлично работает на PHP 8 и не работает на PHP 7. , ругаясь на

Call to undefined method DOMNodeList::remove()

Странно подумал я, почесав затылок. Пришлось переписать код на вида:

        $dom = new DOMDocument('1.0', 'utf-8'); 
        $dom->loadXML($xml_req_template);
        $root = $dom->documentElement;
        
        $parents=$root->getElementsByTagName('Signature');        
        for ($i = $parents->length - 1; $i >= 0; $i--) {
            $parent=$parents->item($i);
            if ($parent && $parent->parentNode) {
                $parent->parentNode->removeChild($parent);
            }
        }

И нигде ведь не попадалось в документации по работе с PHP, что совместимость с php7 сломана. Хотя может плохо смотрел..

PostgreSQL: имя таблицы как параметр функции

Штатно в PostgreSQL я не нашел способа передавать имя таблицы как переменная у функции. Однако есть возможность это обойти. Например так:

CREATE OR REPLACE FUNCTION public.SetReceived(busname varchar ,idr integer)
	RETURNS boolean
	LANGUAGE plpgsql
AS $function$
	BEGIN
		EXECUTE format(concat('update ',busname,' set received=true where id=',idr));		
		return true;
	END;
$function$

Подсчет количества открытий страницы в минуту

Задача: вывести счетчик посещений определенной web страницы в минуту.

Решение: простой способ «в лоб» — парсить логи apache

#!/bin/bash
cat /var/log/httpd/access_log | grep $(date --date '-1 min' '+%R') | grep invoice -c >/var/www/html/cnt.txt
1 2 3 4 5 6 308