![][1]
В этот раз я расскажу не про использование Python или очередной трюк с CSS/HTML и, увы, не про то, как я 5 лет портировал , а про один важный аспект написания расширений для замечательной СУБД PostgresSQL. На самом деле, уже есть достаточно много статей о том, как написать расширение для Postgres на Си (к примеру, [эта][2]), в том числе и на [русском языке][3]. Но, как правило, в них описываются достаточно простые случаи. В этих статьях и инструкциях авторы реализуют функции, которые получают на вход данные, как-то их обрабатывают, а затем возвращают одно число, строку или пользовательский тип. В них нет пояснений, что делать, если из Си кода нужно пробежаться по обычной таблице, существующей в базе, или индексу. К таблицам из Си можно получить доступ через хорошо описанный но медленный [SPI (Server Programming Interface)][4], так же есть очень сложный способ, через буферы, а я расскажу про компромиссный вариант. Под катом я постарался дать примеры кода с подробными пояснениями. [Читать дальше →][5]
[1]:
https://habrastorage.org/files/2a6/2dd/a49/2a62dda4945046da953fb7a63baa5cb6.png
[2]:
http://www.postgresql.org/docs/devel/static/xfunc-c.html
[3]:
http://www.sai.msu.su/~megera/postgres/talks/gist_tutorial.html
[4]:
http://www.postgresql.org/docs/9.4/static/spi.html
[5]:
http://habrahabr.ru/post/272257/#habracut