1"use strict";(self.webpackChunkerpl_docusaurus=self.webpackChunkerpl_docusaurus||[]).push([[8291],{28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var i=s(96540);const a={},r=i.createContext(a);function t(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),i.createElement(r.Provider,{value:n},e.children)}},75661:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"erpl-web/index","title":"ERPL-Web Overview","description":"Production-grade DuckDB extension for HTTP, OData, and SAP Datasphere integration","source":"@site/docs/erpl-web/index.md","sourceDirName":"erpl-web","slug":"/erpl-web/","permalink":"/docs/erpl-web/","draft":false,"unlisted":false,"editUrl":"https://github.com/datazoode/erpl-landingpage/tree/main/docs/erpl-web/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"ERPL-Web Overview","description":"Production-grade DuckDB extension for HTTP, OData, and SAP Datasphere integration","keywords":["erpl-web","cloud","web","sap","odata","datasphere","http","rest","api"]},"sidebar":"docs","previous":{"title":"The Segment Dictionary","permalink":"/docs/erpl-idoc/dictionary"},"next":{"title":"HTTP Functions","permalink":"/docs/erpl-web/http-functions"}}');var a=s(74848),r=s(28453);const t={sidebar_position:1,title:"ERPL-Web Overview",description:"Production-grade DuckDB extension for HTTP, OData, and SAP Datasphere integration",keywords:["erpl-web","cloud","web","sap","odata","datasphere","http","rest","api"]},l="ERPL-Web Overview",d={},c=[{value:"Core Capabilities",id:"core-capabilities",level:2},{value:"Installation",id:"installation",level:2},{value:"Quick Start",id:"quick-start",level:2},{value:"HTTP in One Line",id:"http-in-one-line",level:3},{value:"OData as a Database",id:"odata-as-a-database",level:3},{value:"SAP Datasphere",id:"sap-datasphere",level:3},{value:"Delta Replication from SAP",id:"delta-replication-from-sap",level:3},{value:"Documentation",id:"documentation",level:2},{value:"Getting Started",id:"getting-started",level:3},{value:"Advanced Topics",id:"advanced-topics",level:3},{value:"Examples",id:"examples",level:3},{value:"Features",id:"features",level:2},{value:"HTTP Client",id:"http-client",level:3},{value:"OData Support",id:"odata-support",level:3},{value:"SAP Datasphere",id:"sap-datasphere-1",level:3},{value:"ODP via OData",id:"odp-via-odata",level:3},{value:"Security",id:"security",level:3},{value:"Observability",id:"observability",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Performance & Resilience",id:"performance--resilience",level:2},{value:"Next Steps",id:"next-steps",level:2},{value:"Community & Support",id:"community--support",level:2},{value:"License",id:"license",level:2}];function o(e){const n={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"erpl-web-overview",children:"ERPL-Web Overview"})}),"\n",(0,a.jsx)(n.p,{children:"ERPL-Web is a production-grade DuckDB extension for HTTP, OData, and SAP Datasphere integration. Query APIs, web services, and cloud data sources directly from SQL."}),"\n",(0,a.jsx)(n.h2,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"HTTP from SQL"}),(0,a.jsx)(n.br,{}),"\n","Call any REST API with GET, POST, PUT, PATCH, DELETE. Full support for headers, authentication, and custom timeouts."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"OData v2/v4"}),(0,a.jsx)(n.br,{}),"\n","Universal OData reader with ATTACH support, automatic version detection, predicate pushdown ($filter, $select, $top, $skip), and expand navigation for complex queries."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"SAP Datasphere"}),(0,a.jsx)(n.br,{}),"\n","First-class DuckDB integration for SAP Datasphere. OAuth2 authentication, discover spaces and assets, query relational and analytical data with full metadata support."]}
1),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"ODP via OData"}),(0,a.jsx)(n.br,{}),"\n","Delta replication from SAP using ODP OData protocol. Automatic subscription management, change tracking (Insert/Update/Delete), and comprehensive audit logging."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Secrets Management"}),(0,a.jsx)(n.br,{}),"\n","Secure credential storage with OAuth2, config, and file providers. Automatic token refresh for cloud services."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Tracing & Diagnostics"}),(0,a.jsx)(n.br,{}),"\n","Configurable logging for debugging network calls, performance tuning, and troubleshooting."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"-- Install from ERPL repository\nINSTALL 'erpl_web' FROM 'http://get.erpl.io';\nLOAD 'erpl_web';\n"})}),"\n",(0,a.jsx)(n.p,{children:"Build from source (developers):"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"make debug\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,a.jsx)(n.h3,{id:"http-in-one-line",children:"HTTP in One Line"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"SELECT content::JSON->>'ip' AS ip\nFROM http_get('https://api.ipify.org?format=json');\n"})}),"\n",(0,a.jsx)(n.h3,{id:"odata-as-a-database",children:"OData as a Database"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"ATTACH 'https://services.odata.org/TripPinRESTierService' \n AS trippin (TYPE odata);\n\nSELECT UserName, FirstName, LastName \nFROM trippin.People \nWHERE Gender = 'Female';\n"})}),"\n",(0,a.jsx)(n.h3,{id:"sap-datasphere",children:"SAP Datasphere"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"-- Create OAuth2 secret\nCREATE SECRET datasphere (\n TYPE datasphere,\n PROVIDER oauth2,\n tenant_name 'your-tenant',\n data_center 'eu10'\n);\n\n-- Discover and query\nSELECT * FROM datasphere_show_spaces();\nSELECT * FROM datasphere_read_relational('SALES', 'CUSTOMERS');\n"})}),"\n",(0,a.jsx)(n.h3,{id:"delta-replication-from-sap",children:"Delta Replication from SAP"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"-- Create auth secret\nCREATE SECRET sap_system (\n TYPE http_basic,\n username 'SAP_USER',\n password 'SAP_PASSWORD'\n);\n\n-- Initial load (creates subscription)\nSELECT * FROM odp_odata_read(\n 'https://sap/odata/Z_ODP_BW_1_SRV/SalesData',\n secret='sap_system'\n);\n\n-- Delta updates (only changed records)\nSELECT RECORD_MODE, COUNT(*) \nFROM odp_odata_read(\n 'https://sap/odata/Z_ODP_BW_1_SRV/SalesData',\n secret='sap_system'\n)\nGROUP BY RECORD_MODE;\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"documentation",children:"Documentation"}),"\n",(0,a.jsx)(n.h3,{id:"getting-started",children:"Getting Started"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/http-functions",children:"HTTP Functions"})," - Call REST APIs from SQL"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/odata",children:"OData Guide"})," - Query OData v2/v4 services"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/datasphere",children:"Datasphere Guide"})," - SAP Datasphere integration"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/odp-web",children:"ODP via OData"})," - Delta replication from SAP"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"advanced-topics",children:"Advanced Topics"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/secrets",children:"Secrets Management"})," - Secure authentication"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/erpl-web/tracing",children:"Tracing & Diagnostics"})," - Debug and optimize"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/reference/erpl-web-functions",children:"Functions Reference"})," - Complete API reference"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/examples/erpl-web-examples",children:"ERPL-Web Examples"})," - Real-world patterns"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/examples/real-world-use-cases",children:"Use Cases"})," - Integration scenarios"]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"features",children:"Features"}),"\n",(0,a.jsx)(n.h3,{id:"http-client",children:"HTTP Client"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 GET, HEAD, POST, PUT, PATCH, DELETE"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Custom headers and authentication"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Bearer and Basic auth support"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Timeout configuration"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Automatic retries"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"odata-support",children:"OData Support"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 OData v2 and v4 auto-detection"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 ATTACH as database"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Predicate pushdown ($filter, $select, $top, $skip)"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Expand navigation properties"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 EDM type mapping"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Automatic pagination"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"sap-datasphere-1",children:"SAP Datasphere"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 OAuth2 flows (authorization code, client credentials)"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Space and asset discovery"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Relational data access"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Analytical data access with metrics/dimensions"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Parameterized views support"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Automatic token refresh"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"odp-via-odata",children:"ODP via OData"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 Automatic delta replication"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Subscription management"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Change tracking (Insert/Update/Delete)"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Audit logging"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 SAP-approved extraction method"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Incremental data synchronization"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"security",children:"Security"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 DuckDB secrets integration"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 OAuth2 provider"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Config file provider"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 File-based secrets"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Encrypted credential storage"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"observability",children:"Observability"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"\u2705 Configurable tracing"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 File and console output"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Log rotation"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Performance metrics"}),"\n",(0,a.jsx)(n.li,{children:"\u2705 Detailed debugging"}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"API Integration"}),(0,a.jsx)(n.br,{}),"\n","Query REST APIs, aggregate data from multiple sources, build data pipelines from web services."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"SAP Data Extraction"}),(0,a.jsx)(n.br,{}),"\n","Extract data from SAP systems using approved ODP OData protocol with automatic delta synchronization."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Cloud Analytics"}),(0,a.jsx)(n.br,{}),"\n","Access SAP Datasphere, combine cloud and on-premise data, build federated analytics."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Data Lake Population"}),(0,a.jsx)(n.br,{}),"\n","Stream data from APIs and SAP to Parquet files, maintain incremental updates, build data lakes."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"ETL & ELT"}),(0,a.jsx)(n.br,{}),"\n","Transform API data with SQL, sync SAP data to warehouses, orchestrate data flows."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"performance--resilience",children:"Performance & Resilience"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Response caching"})," - HTTP and OData metadata caching"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Exponential backoff"})," - Automatic retry with intelligent delays"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Connection reuse"})," - Keep-alive for efficient throughput"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Predicate pushdown"})," - Server-side filtering for OData"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Pagination handling"})," - Automatic chunking for large datasets"]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Install"})," - ",(0,a.jsx)(n.code,{children:"INSTALL 'erpl_web' FROM 'http://get.erpl.io'"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Learn"}
1)," - Start with ",(0,a.jsx)(n.a,{href:"/docs/erpl-web/http-functions",children:"HTTP Functions"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Explore"})," - Try ",(0,a.jsx)(n.a,{href:"/docs/erpl-web/odata",children:"OData"})," and ",(0,a.jsx)(n.a,{href:"/docs/erpl-web/datasphere",children:"Datasphere"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Build"})," - Check ",(0,a.jsx)(n.a,{href:"/docs/examples/erpl-web-examples",children:"Examples"})," for patterns"]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"community--support",children:"Community & Support"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"GitHub"}),": ",(0,a.jsx)(n.a,{href:"https://github.com/datazoode/erpl-web",children:"datazoode/erpl-web"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Documentation"}),": This site"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Issues"}),": GitHub Issues"]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,a.jsxs)(n.p,{children:["ERPL-Web is licensed under the Business Source License (BSL) 1.1. See ",(0,a.jsx)(n.a,{href:"https://github.com/datazoode/erpl-web/blob/main/LICENSE",children:"LICENSE"}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Build API-powered analytics with DuckDB + ERPL-Web. Query the web like it's a table. \ud83d\ude80"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(o,{...e})}):o(e)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.