{"id":247,"date":"2016-03-14T17:11:47","date_gmt":"2016-03-14T15:11:47","guid":{"rendered":"http:\/\/www.systemcodegeeks.com\/?p=247"},"modified":"2016-03-05T20:55:18","modified_gmt":"2016-03-05T18:55:18","slug":"creating-user-defined-c-functions-postgresql","status":"publish","type":"post","link":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/","title":{"rendered":"Creating User-Defined C Functions in PostgreSQL"},"content":{"rendered":"<p>Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/plpgsql.html\">PL\/pgSQL<\/a>, <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/pltcl.html\">PL\/Tcl<\/a>, <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/plperl.html\">PL\/Perl<\/a>, <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/plpython.html\">PL\/Python<\/a>, and has third-party support for <a href=\"https:\/\/github.com\/petere\/plsh\">PL\/sh<\/a>, <a href=\"https:\/\/github.com\/tada\/pljava\/wiki\">PL\/Java<\/a>, <a href=\"http:\/\/raa.ruby-lang.org\/project\/pl-ruby\/\">PL\/Ruby<\/a>, <a href=\"http:\/\/www.commandprompt.com\/community\/plphp\/\">PL\/PHP<\/a> and even <a href=\"http:\/\/www.joeconway.com\/plr\/\">PL\/R<\/a>.<\/p>\n<p>Recent versions of PostgreSQL also support <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/ddl-foreign-data.html\">SQL\/MED (foreign data)<\/a> with <a href=\"http:\/\/www.commandprompt.com\/community\/plphp\/\">foreign data wrappers (FDW).<\/a> This allows the database user to access foreign data sources \u2013 other RDMSes such as Oracle or MySQL, noSQL databases, even services such as twitter, as though they were PostgreSQL tables. Obviously there can be performance issues but if an architect only needs to perform a simple task, e.g., sending a tweet when certain conditions are met, it may be easier to use a FDW and database query than to incorporate native twitter support.<\/p>\n<p>Sometimes this is not enough. We may wish to add support for a new procedural language or foreign data wrapper. We may wish to perform work involving external libraries on the database server instead of the application server for efficiency. We may wish to hide implementation details from the database user.<\/p>\n<p>A subset of the last item is management of cryptographic material. Most webapps manage the cryptographic material themselves but proper key management is difficult. For instance encryption keys should be rotated on a regular basis but many webapps have never changed their database keys because there is no provision for it. Their only option is to shut down the application, run an application that loads every record, decrypts it, reencrypts it, and then updates each record. Key management on the database side is still a difficult problem but the solutions are far more likely to be reusable.<\/p>\n<h2>PostgreSQL Extensions<\/h2>\n<p>It is possible to create user-defined functions in a sql script:<\/p>\n<pre class=\" brush:sql\">CREATE OR REPLACE FUNCTION dgst_sha1(text)\r\nRETURNS text\r\nAS 'pgopenssltypes', 'dgst_sha1'\r\nLANGUAGE C IMMUTABLE STRICT<\/pre>\n<p>and provide the implementation by dropping the appropriate shared library in the <i>$libdir<\/i> directory. See <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/xfunc-c.html\">C-Language Functions<\/a> for details, or my own <a href=\"http:\/\/invariantproperties.com\/2011\/12\/26\/introduction-to-postgresql-pljava-part-1-2\/\">Introduction to PL\/Java<\/a> for examples of the SQL definitions for functions, triggers, operators, and indexes.<\/p>\n<p>This is unmaintainable for anything other than the smallest tasks. We want to bundle everything we need into one object that we can load and unload it in a single operation. This ensures there are no oversights or inconsistencies. PostgreSQL already has a solution to this problem: <a href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/extend-extensions.html\">PostgreSQL Extensions<\/a>.<\/p>\n<h2>PostgreSQL Extension Network (PGXN)<\/h2>\n<p>Writing a PostgreSQL extension from scratch can be tricky. A better approach is to create a skeleton using the <a href=\"https:\/\/github.com\/guedes\/pgxn-utils\/\">PGXN utils<\/a> package and then install it with the <a href=\"http:\/\/pgxnclient.projects.postgresql.org\/\">pgxn-client<\/a> utility from the <a href=\"http:\/\/blog.pgxn.org\/\">PostgreSQL Extension Network<\/a>.<\/p>\n<h2>Source Code<\/h2>\n<p>I am not including any source code since there are numerous projects listed at the PGXN site. For instance <a href=\"http:\/\/pgxn.org\/dist\/semver\/0.5.0\/\">semver (semantic version data type<\/a>, <a href=\"\/\/github.com\/theory\/pg-semver.git\">git<\/a> or <a href=\"http:\/\/pgxn.org\/dist\/pgaudit\/1.0.0\/\">pgaudit<\/a>. As always all public code should be viewed critically \u2013 you don\u2019t want to learn the wrong lessons by reading bad code. (Do not take my reference to these projects as an endorsement.)<\/p>\n<p>Note: if you want to use a shared library your Makefile should include the libraries in a SHLIB_LINK declaration. The system will automatically pull in any dependencies when the module is loaded.<\/p>\n<h2>See Also<\/h2>\n<ul>\n<li><a href=\"http:\/\/www.joeconway.com\/presentations\/function_basics.pdf\">PostgreSQL Functions By Example<\/a> (slide deck)<\/li>\n<li><a href=\"http:\/\/www.christian-rossow.de\/articles\/PostgreSQL_C_language_functions_with_bytea.php\">HowTo \u2013 Create PostgreSQL C library functions<\/a><\/li>\n<\/ul>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/invariantproperties.com\/?p=1726\">Creating User-Defined C Functions in PostgreSQL<\/a> from our <a href=\"http:\/\/www.systemcodegeeks.com\/join-us\/scg\/\">SCG partner<\/a> Bear Giles at the <a href=\"http:\/\/invariantproperties.com\/\">Invariant Properties<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports PL\/pgSQL, PL\/Tcl, PL\/Perl, PL\/Python, and has third-party support for PL\/sh, PL\/Java, PL\/Ruby, PL\/PHP and even PL\/R. Recent versions of PostgreSQL also support SQL\/MED (foreign data) with foreign data wrappers (FDW). This allows the database user to &hellip;<\/p>\n","protected":false},"author":11,"featured_media":198,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[],"class_list":["post-247","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"System Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/systemcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-14T15:11:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Bear Giles\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Bear Giles\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\"},\"author\":{\"name\":\"Bear Giles\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/01ab8791fbb81655c747119d2f9b589b\"},\"headline\":\"Creating User-Defined C Functions in PostgreSQL\",\"datePublished\":\"2016-03-14T15:11:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\"},\"wordCount\":553,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg\",\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\",\"name\":\"Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg\",\"datePublished\":\"2016-03-14T15:11:47+00:00\",\"description\":\"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports\",\"breadcrumb\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.systemcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Databases\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/databases\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/databases\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Creating User-Defined C Functions in PostgreSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"name\":\"System Code Geeks\",\"description\":\"Operating System Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/systemcodegeeks\",\"https:\/\/x.com\/systemcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/01ab8791fbb81655c747119d2f9b589b\",\"name\":\"Bear Giles\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c4e8f47b520b4147cb7f173f9d78cf8862974fdeeff4baea9d6a632cf7b1b54c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c4e8f47b520b4147cb7f173f9d78cf8862974fdeeff4baea9d6a632cf7b1b54c?s=96&d=mm&r=g\",\"caption\":\"Bear Giles\"},\"sameAs\":[\"http:\/\/invariantproperties.com\/\"],\"url\":\"https:\/\/www.systemcodegeeks.com\/author\/bear-giles\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026","description":"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026","og_description":"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports","og_url":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/","og_site_name":"System Code Geeks","article_publisher":"https:\/\/www.facebook.com\/systemcodegeeks","article_published_time":"2016-03-14T15:11:47+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg","type":"image\/jpeg"}],"author":"Bear Giles","twitter_card":"summary_large_image","twitter_creator":"@systemcodegeeks","twitter_site":"@systemcodegeeks","twitter_misc":{"Written by":"Bear Giles","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/"},"author":{"name":"Bear Giles","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/01ab8791fbb81655c747119d2f9b589b"},"headline":"Creating User-Defined C Functions in PostgreSQL","datePublished":"2016-03-14T15:11:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/"},"wordCount":553,"commentCount":0,"publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg","articleSection":["PostgreSQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/","url":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/","name":"Creating User-Defined C Functions in PostgreSQL - System Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg","datePublished":"2016-03-14T15:11:47+00:00","description":"Many experienced database developers are familiar with user-defined functions implemented in SQL or a procedural language. PostgreSQL itself supports","breadcrumb":{"@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#primaryimage","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/postgresql-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.systemcodegeeks.com\/databases\/postgresql\/creating-user-defined-c-functions-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.systemcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Databases","item":"https:\/\/www.systemcodegeeks.com\/category\/databases\/"},{"@type":"ListItem","position":3,"name":"PostgreSQL","item":"https:\/\/www.systemcodegeeks.com\/category\/databases\/postgresql\/"},{"@type":"ListItem","position":4,"name":"Creating User-Defined C Functions in PostgreSQL"}]},{"@type":"WebSite","@id":"https:\/\/www.systemcodegeeks.com\/#website","url":"https:\/\/www.systemcodegeeks.com\/","name":"System Code Geeks","description":"Operating System Developers Resource Center","publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.systemcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.systemcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/systemcodegeeks","https:\/\/x.com\/systemcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/01ab8791fbb81655c747119d2f9b589b","name":"Bear Giles","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c4e8f47b520b4147cb7f173f9d78cf8862974fdeeff4baea9d6a632cf7b1b54c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c4e8f47b520b4147cb7f173f9d78cf8862974fdeeff4baea9d6a632cf7b1b54c?s=96&d=mm&r=g","caption":"Bear Giles"},"sameAs":["http:\/\/invariantproperties.com\/"],"url":"https:\/\/www.systemcodegeeks.com\/author\/bear-giles\/"}]}},"_links":{"self":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/comments?post=247"}],"version-history":[{"count":0,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/247\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media\/198"}],"wp:attachment":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media?parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/categories?post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/tags?post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}