[{"data":1,"prerenderedAt":2877},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-dbx-pg":442,"-hu-dbx-pg-surround":2872},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":414,"body":444,"description":2865,"extension":2866,"links":2867,"meta":2868,"navigation":2869,"path":415,"seo":2870,"stem":416,"__hash__":2871},"docs_hu\u002Fhu\u002F8.dbx\u002F2.pg.md",{"type":445,"value":446,"toc":2855},"minimark",[447,487,538,556,561,643,675,682,793,809,813,976,999,1021,1025,1053,1071,1077,1081,1104,1216,1227,1848,1855,2101,2146,2150,2313,2337,2341,2344,2404,2422,2429,2433,2441,2819,2823,2851],[448,449,450,451,455,456,461,462,467,468,474,475,478,479,482,483,486],"p",{},"A ",[452,453,454],"code",{},"dbx\u002Fpg"," a ",[457,458,459],"a",{"href":411},[452,460,405],{}," alapértelmezett, pgx-natív implementációja: ",[457,463,414],{"href":464,"rel":465},"https:\u002F\u002Fgithub.com\u002Fjackc\u002Fpgx",[466],"nofollow","-re épül, a Go legszélesebb körben használt PostgreSQL-driverére. Három dolgot ad: pool építését a ",[457,469,471],{"href":470},"\u002Fhu\u002Fdbx\u002Foverview#config",[452,472,473],{},"dbx.Config"," alapján, egy query executort (",[452,476,477],{},"DB","), amely figyeli, fut-e éppen tranzakció, és egy ",[452,480,481],{},"dbx.Transactor"," implementációt, ami ",[452,484,485],{},"pgx.Tx","-et hordoz a contextben. Önálló package: semmihez sem kell hozzá a gpsystem kit.",[488,489,494],"pre",{"className":490,"code":491,"language":492,"meta":493,"style":493},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import (\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n)\n","go","",[452,495,496,509,522,532],{"__ignoreMap":493},[497,498,501,505],"span",{"class":499,"line":500},"line",1,[497,502,504],{"class":503},"s7zQu","import",[497,506,508],{"class":507},"sMK4o"," (\n",[497,510,512,515,519],{"class":499,"line":511},2,[497,513,514],{"class":507},"    \"",[497,516,518],{"class":517},"sBMFI","github.com\u002Fgp-system\u002Fdbx",[497,520,521],{"class":507},"\"\n",[497,523,525,527,530],{"class":499,"line":524},3,[497,526,514],{"class":507},[497,528,529],{"class":517},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[497,531,521],{"class":507},[497,533,535],{"class":499,"line":534},4,[497,536,537],{"class":507},")\n",[448,539,540,541,544,545,548,549,552,553,555],{},"Nincs wrapper-API: a csomag ",[452,542,543],{},"pgxpool.Pool","-t, ",[452,546,547],{},"pgx.Rows","-t és ",[452,550,551],{},"pgconn.CommandTag","-et ad vissza. Ami a pgx dokumentációjában áll, az itt is igaz. A ",[452,554,454],{}," csak a pool-építést, az instrumentációt és a tranzakció-plumbingot központosítja.",[557,558,560],"h2",{"id":559},"pool","Pool",[488,562,564],{"className":490,"code":563,"language":492,"meta":493,"style":493},"pool, err := pg.NewPool(ctx, cfg.DB)  \u002F\u002F DSN a konfigból, connect, ping\npool := pg.MustNewPool(ctx, cfg.DB)   \u002F\u002F ugyanez, hibára panic, main()-be\n",[452,565,566,612],{"__ignoreMap":493},[497,567,568,571,574,577,580,583,586,590,593,596,598,601,603,605,608],{"class":499,"line":500},[497,569,559],{"class":570},"sTEyZ",[497,572,573],{"class":507},",",[497,575,576],{"class":570}," err ",[497,578,579],{"class":507},":=",[497,581,582],{"class":570}," pg",[497,584,585],{"class":507},".",[497,587,589],{"class":588},"s2Zo4","NewPool",[497,591,592],{"class":507},"(",[497,594,595],{"class":570},"ctx",[497,597,573],{"class":507},[497,599,600],{"class":570}," cfg",[497,602,585],{"class":507},[497,604,477],{"class":570},[497,606,607],{"class":507},")",[497,609,611],{"class":610},"sHwdD","  \u002F\u002F DSN a konfigból, connect, ping\n",[497,613,614,617,619,621,623,626,628,630,632,634,636,638,640],{"class":499,"line":511},[497,615,616],{"class":570},"pool ",[497,618,579],{"class":507},[497,620,582],{"class":570},[497,622,585],{"class":507},[497,624,625],{"class":588},"MustNewPool",[497,627,592],{"class":507},[497,629,595],{"class":570},[497,631,573],{"class":507},[497,633,600],{"class":570},[497,635,585],{"class":507},[497,637,477],{"class":570},[497,639,607],{"class":507},[497,641,642],{"class":610},"   \u002F\u002F ugyanez, hibára panic, main()-be\n",[448,644,450,645,455,647,650,651,654,655,658,659,663,664,666,667,670,671,674],{},[452,646,589],{},[452,648,649],{},"cfg.DB.DSN()","-ből parse-olja a pool-konfigot, beállítja a ",[452,652,653],{},"MaxConns","-t (",[452,656,657],{},"DB_MAX_CONNS",", default 10), csatlakozik, és ",[660,661,662],"strong",{},"pinggel ellenőrzi"," a kapcsolatot, így a rossz jelszó vagy elérhetetlen adatbázis már startupkor bukik, nem az első kérésnél. A ",[452,665,625],{}," ugyanez ",[452,668,669],{},"panic","-kel; a generált ",[452,672,673],{},"main.go","-k ezt hívják.",[448,676,677,678,681],{},"A kitre épülő projektben a generált belépési pont a lezárást a ",[457,679,680],{"href":259},"server-életciklusra"," köti:",[488,683,685],{"className":490,"code":684,"language":492,"meta":493,"style":493},"err := server.Run(ctx, cfg.Server, register,\n    server.WithCloser(\"pgxpool\", func(context.Context) error {\n        pool.Close()\n        return nil\n    }))\n",[452,686,687,723,766,779,787],{"__ignoreMap":493},[497,688,689,692,694,697,699,702,704,706,708,710,712,715,717,720],{"class":499,"line":500},[497,690,691],{"class":570},"err ",[497,693,579],{"class":507},[497,695,696],{"class":570}," server",[497,698,585],{"class":507},[497,700,701],{"class":588},"Run",[497,703,592],{"class":507},[497,705,595],{"class":570},[497,707,573],{"class":507},[497,709,600],{"class":570},[497,711,585],{"class":507},[497,713,714],{"class":570},"Server",[497,716,573],{"class":507},[497,718,719],{"class":570}," register",[497,721,722],{"class":507},",\n",[497,724,725,728,730,733,735,738,742,744,746,749,752,754,757,759,763],{"class":499,"line":511},[497,726,727],{"class":570},"    server",[497,729,585],{"class":507},[497,731,732],{"class":588},"WithCloser",[497,734,592],{"class":507},[497,736,737],{"class":507},"\"",[497,739,741],{"class":740},"sfazB","pgxpool",[497,743,737],{"class":507},[497,745,573],{"class":507},[497,747,748],{"class":507}," func(",[497,750,751],{"class":517},"context",[497,753,585],{"class":507},[497,755,756],{"class":517},"Context",[497,758,607],{"class":507},[497,760,762],{"class":761},"spNyl"," error",[497,764,765],{"class":507}," {\n",[497,767,768,771,773,776],{"class":499,"line":524},[497,769,770],{"class":570},"        pool",[497,772,585],{"class":507},[497,774,775],{"class":588},"Close",[497,777,778],{"class":507},"()\n",[497,780,781,784],{"class":499,"line":534},[497,782,783],{"class":503},"        return",[497,785,786],{"class":507}," nil\n",[497,788,790],{"class":499,"line":789},5,[497,791,792],{"class":507},"    }))\n",[448,794,795,796,801,802,805,806,808],{},"A poolt az ",[457,797,800],{"href":798,"rel":799},"https:\u002F\u002Fgithub.com\u002Fexaring\u002Fotelpgx",[466],"otelpgx"," instrumentálja: minden query egy OTel spant bocsát ki a statementtel és az idejével, az aktív request\u002Ftask span alá ágyazva. No-op tracer providerrel (dev mód, telemetria ki) ez gyakorlatilag ingyenes; bekapcsolt telemetriával a query-k megjelennek a ",[457,803,804],{"href":189},"trace waterfallban"," és a ",[457,807,193],{"href":194}," hiba-eseményeinél is.",[557,810,812],{"id":811},"dbtx-a-repositoryk-query-felülete","DBTX: a repositoryk query-felülete",[488,814,816],{"className":490,"code":815,"language":492,"meta":493,"style":493},"type DBTX interface {\n    Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error)\n    Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)\n    QueryRow(ctx context.Context, sql string, args ...any) pgx.Row\n}\n",[452,817,818,831,886,932,971],{"__ignoreMap":493},[497,819,820,823,826,829],{"class":499,"line":500},[497,821,822],{"class":507},"type",[497,824,825],{"class":517}," DBTX",[497,827,828],{"class":507}," interface",[497,830,765],{"class":507},[497,832,833,836,838,841,844,846,848,850,853,856,858,861,864,867,869,872,875,877,880,882,884],{"class":499,"line":511},[497,834,835],{"class":588},"    Exec",[497,837,592],{"class":507},[497,839,595],{"class":840},"sHdIc",[497,842,843],{"class":517}," context",[497,845,585],{"class":507},[497,847,756],{"class":517},[497,849,573],{"class":507},[497,851,852],{"class":840}," sql",[497,854,855],{"class":761}," string",[497,857,573],{"class":507},[497,859,860],{"class":840}," args",[497,862,863],{"class":507}," ...",[497,865,866],{"class":517},"any",[497,868,607],{"class":507},[497,870,871],{"class":507}," (",[497,873,874],{"class":517},"pgconn",[497,876,585],{"class":507},[497,878,879],{"class":517},"CommandTag",[497,881,573],{"class":507},[497,883,762],{"class":761},[497,885,537],{"class":507},[497,887,888,891,893,895,897,899,901,903,905,907,909,911,913,915,917,919,921,923,926,928,930],{"class":499,"line":524},[497,889,890],{"class":588},"    Query",[497,892,592],{"class":507},[497,894,595],{"class":840},[497,896,843],{"class":517},[497,898,585],{"class":507},[497,900,756],{"class":517},[497,902,573],{"class":507},[497,904,852],{"class":840},[497,906,855],{"class":761},[497,908,573],{"class":507},[497,910,860],{"class":840},[497,912,863],{"class":507},[497,914,866],{"class":517},[497,916,607],{"class":507},[497,918,871],{"class":507},[497,920,414],{"class":517},[497,922,585],{"class":507},[497,924,925],{"class":517},"Rows",[497,927,573],{"class":507},[497,929,762],{"class":761},[497,931,537],{"class":507},[497,933,934,937,939,941,943,945,947,949,951,953,955,957,959,961,963,966,968],{"class":499,"line":534},[497,935,936],{"class":588},"    QueryRow",[497,938,592],{"class":507},[497,940,595],{"class":840},[497,942,843],{"class":517},[497,944,585],{"class":507},[497,946,756],{"class":517},[497,948,573],{"class":507},[497,950,852],{"class":840},[497,952,855],{"class":761},[497,954,573],{"class":507},[497,956,860],{"class":840},[497,958,863],{"class":507},[497,960,866],{"class":517},[497,962,607],{"class":507},[497,964,965],{"class":517}," pgx",[497,967,585],{"class":507},[497,969,970],{"class":517},"Row\n",[497,972,973],{"class":499,"line":789},[497,974,975],{"class":507},"}\n",[448,977,978,979,871,982,984,985,984,987,990,991,994,995,998],{},"Ettől a három metódustól függ minden repository. A visszatérési típusok ",[660,980,981],{},"szándékosan nyers pgx-típusok",[452,983,551],{},", ",[452,986,547],{},[452,988,989],{},"pgx.Row","), nem kit-wrapperek: a scanelés, a ",[452,992,993],{},"CollectRows",", a ",[452,996,997],{},"RowsAffected()"," pontosan úgy működik, ahogy a pgx dokumentációjában olvasod.",[448,1000,450,1001,1004,1005,455,1008,1013,1014,1016,1017,1020],{},[452,1002,1003],{},"DBTX"," ráadásul ",[660,1006,1007],{},"metódusról metódusra azonos",[457,1009,1012],{"href":1010,"rel":1011},"https:\u002F\u002Fsqlc.dev",[466],"sqlc"," által generált ",[452,1015,1003],{}," interfésszel. A kit generátorai kézzel írt repositorykat vázolnak fel, de ha egy projekt sqlc-vel generálna query-kódot, annak structjai változtatás nélkül elfogadják a ",[452,1018,1019],{},"pg.NewDB(pool)","-t, és ugyanazokban a context-hordozta tranzakciókban vesznek részt.",[557,1022,1024],{"id":1023},"db-az-executor-ami-a-contextet-figyeli","DB: az executor, ami a contextet figyeli",[488,1026,1028],{"className":490,"code":1027,"language":492,"meta":493,"style":493},"db := pg.NewDB(pool) \u002F\u002F DBTX-et implementál\n",[452,1029,1030],{"__ignoreMap":493},[497,1031,1032,1035,1037,1039,1041,1044,1046,1048,1050],{"class":499,"line":500},[497,1033,1034],{"class":570},"db ",[497,1036,579],{"class":507},[497,1038,582],{"class":570},[497,1040,585],{"class":507},[497,1042,1043],{"class":588},"NewDB",[497,1045,592],{"class":507},[497,1047,559],{"class":570},[497,1049,607],{"class":507},[497,1051,1052],{"class":610}," \u002F\u002F DBTX-et implementál\n",[448,1054,450,1055,455,1058,1060,1061,1064,1065,1070],{},[452,1056,1057],{},"pg.DB",[452,1059,1003],{}," egyetlen kit-beli implementációja, és egyetlen trükkje van: ",[660,1062,1063],{},"minden hívás előbb tranzakciót keres a contextben",". Ha a ",[457,1066,1067],{"href":423},[452,1068,1069],{},"WithinTransaction"," nyitott egyet, a hívás azon fut; ha nincs, a poolon. A repository sosem tudja, és nem is kell tudnia, melyik eset áll fenn.",[448,1072,1073,1074,1076],{},"Ez az a pont, ahol a kit tranzakció-modellje összeér: a service ",[452,1075,1069],{},"-t hív, a repositoryk pedig változatlan szignatúrával, automatikusan csatlakoznak.",[557,1078,1080],{"id":1079},"egy-shop-repository","Egy shop repository",[448,1082,450,1083,1086,1087,1090,1091,1094,1095,455,1097,1099,1100,1103],{},[457,1084,1085],{"href":41},"shop mintaalkalmazás"," modul-szintű termék-repositoryja (",[452,1088,1089],{},"internal\u002Fmodules\u002Fshop\u002Frepository\u002F",", minden surface számára közös). A repository egyetlen ",[452,1092,1093],{},"pg.DBTX"," mezőt fog. A ",[452,1096,673],{},[452,1098,1019],{},"-t injektálja a ",[452,1101,1102],{},"Dependencies","-en át:",[488,1105,1107],{"className":490,"code":1106,"language":492,"meta":493,"style":493},"package repository\n\ntype ProductRepository struct {\n    db pg.DBTX\n}\n\nfunc NewProductRepository(db pg.DBTX) *ProductRepository {\n    return &ProductRepository{db: db}\n}\n",[452,1108,1109,1117,1123,1135,1148,1152,1157,1187,1211],{"__ignoreMap":493},[497,1110,1111,1114],{"class":499,"line":500},[497,1112,1113],{"class":507},"package",[497,1115,1116],{"class":517}," repository\n",[497,1118,1119],{"class":499,"line":511},[497,1120,1122],{"emptyLinePlaceholder":1121},true,"\n",[497,1124,1125,1127,1130,1133],{"class":499,"line":524},[497,1126,822],{"class":507},[497,1128,1129],{"class":517}," ProductRepository",[497,1131,1132],{"class":507}," struct",[497,1134,765],{"class":507},[497,1136,1137,1140,1143,1145],{"class":499,"line":534},[497,1138,1139],{"class":570},"    db ",[497,1141,1142],{"class":517},"pg",[497,1144,585],{"class":507},[497,1146,1147],{"class":517},"DBTX\n",[497,1149,1150],{"class":499,"line":789},[497,1151,975],{"class":507},[497,1153,1155],{"class":499,"line":1154},6,[497,1156,1122],{"emptyLinePlaceholder":1121},[497,1158,1160,1163,1166,1168,1171,1173,1175,1177,1179,1182,1185],{"class":499,"line":1159},7,[497,1161,1162],{"class":507},"func",[497,1164,1165],{"class":588}," NewProductRepository",[497,1167,592],{"class":507},[497,1169,1170],{"class":840},"db",[497,1172,582],{"class":517},[497,1174,585],{"class":507},[497,1176,1003],{"class":517},[497,1178,607],{"class":507},[497,1180,1181],{"class":507}," *",[497,1183,1184],{"class":517},"ProductRepository",[497,1186,765],{"class":507},[497,1188,1190,1193,1196,1198,1201,1203,1206,1209],{"class":499,"line":1189},8,[497,1191,1192],{"class":503},"    return",[497,1194,1195],{"class":507}," &",[497,1197,1184],{"class":517},[497,1199,1200],{"class":507},"{",[497,1202,1170],{"class":570},[497,1204,1205],{"class":507},":",[497,1207,1208],{"class":570}," db",[497,1210,975],{"class":507},[497,1212,1214],{"class":499,"line":1213},9,[497,1215,975],{"class":507},[448,1217,1218,1219,1222,1223,1226],{},"A terméklistázás ",[457,1220,1221],{"href":440},"cursor-lapozással"," (keyset seek, nem ",[452,1224,1225],{},"OFFSET","):",[488,1228,1230],{"className":490,"code":1229,"language":492,"meta":493,"style":493},"const productSort = \"created_at DESC, id DESC\" \u002F\u002F egyezik az ORDER BY-jal\n\nfunc (r *ProductRepository) ListProducts(\n    ctx context.Context, p paginate.CursorParams,\n) (paginate.CursorPage[Product], error) {\n    args := []any{p.FetchLimit()}\n    query := `SELECT id, name, price_cents, stock, created_at FROM products`\n    if p.HasCursor() {\n        var createdAt time.Time\n        var id int64\n        if err := p.DecodeKey(&createdAt, &id); err != nil {\n            return paginate.CursorPage[Product]{}, err\n        }\n        query += ` WHERE (created_at, id) \u003C ($2, $3)`\n        args = append(args, createdAt, id)\n    }\n    query += ` ORDER BY ` + productSort + ` LIMIT $1`\n\n    rows, err := r.db.Query(ctx, query, args...)\n    if err != nil {\n        return paginate.CursorPage[Product]{}, errs.Wrap(err, \"products: list\")\n    }\n    products, err := pgx.CollectRows(rows, pgx.RowToStructByName[Product])\n    if err != nil {\n        return paginate.CursorPage[Product]{}, errs.Wrap(err, \"products: scan\")\n    }\n    return paginate.NewCursorPage(products, p, func(last Product) []any {\n        return []any{last.CreatedAt, last.ID}\n    })\n}\n",[452,1231,1232,1254,1258,1280,1306,1334,1358,1374,1391,1407,1418,1461,1483,1489,1505,1533,1539,1569,1574,1614,1627,1668,1673,1712,1725,1763,1768,1807,1837,1843],{"__ignoreMap":493},[497,1233,1234,1237,1240,1243,1246,1249,1251],{"class":499,"line":500},[497,1235,1236],{"class":507},"const",[497,1238,1239],{"class":570}," productSort ",[497,1241,1242],{"class":507},"=",[497,1244,1245],{"class":507}," \"",[497,1247,1248],{"class":740},"created_at DESC, id DESC",[497,1250,737],{"class":507},[497,1252,1253],{"class":610}," \u002F\u002F egyezik az ORDER BY-jal\n",[497,1255,1256],{"class":499,"line":511},[497,1257,1122],{"emptyLinePlaceholder":1121},[497,1259,1260,1262,1264,1267,1270,1272,1274,1277],{"class":499,"line":524},[497,1261,1162],{"class":507},[497,1263,871],{"class":507},[497,1265,1266],{"class":840},"r ",[497,1268,1269],{"class":507},"*",[497,1271,1184],{"class":517},[497,1273,607],{"class":507},[497,1275,1276],{"class":588}," ListProducts",[497,1278,1279],{"class":507},"(\n",[497,1281,1282,1285,1287,1289,1291,1293,1296,1299,1301,1304],{"class":499,"line":534},[497,1283,1284],{"class":840},"    ctx",[497,1286,843],{"class":517},[497,1288,585],{"class":507},[497,1290,756],{"class":517},[497,1292,573],{"class":507},[497,1294,1295],{"class":840}," p",[497,1297,1298],{"class":517}," paginate",[497,1300,585],{"class":507},[497,1302,1303],{"class":517},"CursorParams",[497,1305,722],{"class":507},[497,1307,1308,1310,1312,1314,1316,1319,1322,1325,1328,1330,1332],{"class":499,"line":789},[497,1309,607],{"class":507},[497,1311,871],{"class":507},[497,1313,431],{"class":517},[497,1315,585],{"class":507},[497,1317,1318],{"class":517},"CursorPage",[497,1320,1321],{"class":507},"[",[497,1323,1324],{"class":517},"Product",[497,1326,1327],{"class":507},"],",[497,1329,762],{"class":761},[497,1331,607],{"class":507},[497,1333,765],{"class":507},[497,1335,1336,1339,1341,1344,1346,1348,1350,1352,1355],{"class":499,"line":1154},[497,1337,1338],{"class":570},"    args ",[497,1340,579],{"class":507},[497,1342,1343],{"class":507}," []",[497,1345,866],{"class":517},[497,1347,1200],{"class":507},[497,1349,448],{"class":570},[497,1351,585],{"class":507},[497,1353,1354],{"class":588},"FetchLimit",[497,1356,1357],{"class":507},"()}\n",[497,1359,1360,1363,1365,1368,1371],{"class":499,"line":1159},[497,1361,1362],{"class":570},"    query ",[497,1364,579],{"class":507},[497,1366,1367],{"class":507}," `",[497,1369,1370],{"class":740},"SELECT id, name, price_cents, stock, created_at FROM products",[497,1372,1373],{"class":507},"`\n",[497,1375,1376,1379,1381,1383,1386,1389],{"class":499,"line":1189},[497,1377,1378],{"class":503},"    if",[497,1380,1295],{"class":570},[497,1382,585],{"class":507},[497,1384,1385],{"class":588},"HasCursor",[497,1387,1388],{"class":507},"()",[497,1390,765],{"class":507},[497,1392,1393,1396,1399,1402,1404],{"class":499,"line":1213},[497,1394,1395],{"class":507},"        var",[497,1397,1398],{"class":570}," createdAt ",[497,1400,1401],{"class":517},"time",[497,1403,585],{"class":507},[497,1405,1406],{"class":517},"Time\n",[497,1408,1410,1412,1415],{"class":499,"line":1409},10,[497,1411,1395],{"class":507},[497,1413,1414],{"class":570}," id ",[497,1416,1417],{"class":761},"int64\n",[497,1419,1421,1424,1426,1428,1430,1432,1435,1438,1441,1443,1445,1448,1451,1453,1456,1459],{"class":499,"line":1420},11,[497,1422,1423],{"class":503},"        if",[497,1425,576],{"class":570},[497,1427,579],{"class":507},[497,1429,1295],{"class":570},[497,1431,585],{"class":507},[497,1433,1434],{"class":588},"DecodeKey",[497,1436,1437],{"class":507},"(&",[497,1439,1440],{"class":570},"createdAt",[497,1442,573],{"class":507},[497,1444,1195],{"class":507},[497,1446,1447],{"class":570},"id",[497,1449,1450],{"class":507},");",[497,1452,576],{"class":570},[497,1454,1455],{"class":507},"!=",[497,1457,1458],{"class":507}," nil",[497,1460,765],{"class":507},[497,1462,1464,1467,1469,1471,1473,1475,1477,1480],{"class":499,"line":1463},12,[497,1465,1466],{"class":503},"            return",[497,1468,1298],{"class":517},[497,1470,585],{"class":507},[497,1472,1318],{"class":517},[497,1474,1321],{"class":507},[497,1476,1324],{"class":517},[497,1478,1479],{"class":507},"]{},",[497,1481,1482],{"class":570}," err\n",[497,1484,1486],{"class":499,"line":1485},13,[497,1487,1488],{"class":507},"        }\n",[497,1490,1492,1495,1498,1500,1503],{"class":499,"line":1491},14,[497,1493,1494],{"class":570},"        query ",[497,1496,1497],{"class":507},"+=",[497,1499,1367],{"class":507},[497,1501,1502],{"class":740}," WHERE (created_at, id) \u003C ($2, $3)",[497,1504,1373],{"class":507},[497,1506,1508,1511,1513,1516,1518,1521,1523,1526,1528,1531],{"class":499,"line":1507},15,[497,1509,1510],{"class":570},"        args ",[497,1512,1242],{"class":507},[497,1514,1515],{"class":588}," append",[497,1517,592],{"class":507},[497,1519,1520],{"class":570},"args",[497,1522,573],{"class":507},[497,1524,1525],{"class":570}," createdAt",[497,1527,573],{"class":507},[497,1529,1530],{"class":570}," id",[497,1532,537],{"class":507},[497,1534,1536],{"class":499,"line":1535},16,[497,1537,1538],{"class":507},"    }\n",[497,1540,1542,1544,1546,1548,1551,1554,1557,1559,1562,1564,1567],{"class":499,"line":1541},17,[497,1543,1362],{"class":570},[497,1545,1497],{"class":507},[497,1547,1367],{"class":507},[497,1549,1550],{"class":740}," ORDER BY ",[497,1552,1553],{"class":507},"`",[497,1555,1556],{"class":507}," +",[497,1558,1239],{"class":570},[497,1560,1561],{"class":507},"+",[497,1563,1367],{"class":507},[497,1565,1566],{"class":740}," LIMIT $1",[497,1568,1373],{"class":507},[497,1570,1572],{"class":499,"line":1571},18,[497,1573,1122],{"emptyLinePlaceholder":1121},[497,1575,1577,1580,1582,1584,1586,1589,1591,1593,1595,1598,1600,1602,1604,1607,1609,1611],{"class":499,"line":1576},19,[497,1578,1579],{"class":570},"    rows",[497,1581,573],{"class":507},[497,1583,576],{"class":570},[497,1585,579],{"class":507},[497,1587,1588],{"class":570}," r",[497,1590,585],{"class":507},[497,1592,1170],{"class":570},[497,1594,585],{"class":507},[497,1596,1597],{"class":588},"Query",[497,1599,592],{"class":507},[497,1601,595],{"class":570},[497,1603,573],{"class":507},[497,1605,1606],{"class":570}," query",[497,1608,573],{"class":507},[497,1610,860],{"class":570},[497,1612,1613],{"class":507},"...)\n",[497,1615,1617,1619,1621,1623,1625],{"class":499,"line":1616},20,[497,1618,1378],{"class":503},[497,1620,576],{"class":570},[497,1622,1455],{"class":507},[497,1624,1458],{"class":507},[497,1626,765],{"class":507},[497,1628,1630,1632,1634,1636,1638,1640,1642,1644,1647,1649,1652,1654,1657,1659,1661,1664,1666],{"class":499,"line":1629},21,[497,1631,783],{"class":503},[497,1633,1298],{"class":517},[497,1635,585],{"class":507},[497,1637,1318],{"class":517},[497,1639,1321],{"class":507},[497,1641,1324],{"class":517},[497,1643,1479],{"class":507},[497,1645,1646],{"class":570}," errs",[497,1648,585],{"class":507},[497,1650,1651],{"class":588},"Wrap",[497,1653,592],{"class":507},[497,1655,1656],{"class":570},"err",[497,1658,573],{"class":507},[497,1660,1245],{"class":507},[497,1662,1663],{"class":740},"products: list",[497,1665,737],{"class":507},[497,1667,537],{"class":507},[497,1669,1671],{"class":499,"line":1670},22,[497,1672,1538],{"class":507},[497,1674,1676,1679,1681,1683,1685,1687,1689,1691,1693,1696,1698,1700,1702,1705,1707,1709],{"class":499,"line":1675},23,[497,1677,1678],{"class":570},"    products",[497,1680,573],{"class":507},[497,1682,576],{"class":570},[497,1684,579],{"class":507},[497,1686,965],{"class":570},[497,1688,585],{"class":507},[497,1690,993],{"class":588},[497,1692,592],{"class":507},[497,1694,1695],{"class":570},"rows",[497,1697,573],{"class":507},[497,1699,965],{"class":570},[497,1701,585],{"class":507},[497,1703,1704],{"class":570},"RowToStructByName",[497,1706,1321],{"class":507},[497,1708,1324],{"class":570},[497,1710,1711],{"class":507},"])\n",[497,1713,1715,1717,1719,1721,1723],{"class":499,"line":1714},24,[497,1716,1378],{"class":503},[497,1718,576],{"class":570},[497,1720,1455],{"class":507},[497,1722,1458],{"class":507},[497,1724,765],{"class":507},[497,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1759,1761],{"class":499,"line":1727},25,[497,1729,783],{"class":503},[497,1731,1298],{"class":517},[497,1733,585],{"class":507},[497,1735,1318],{"class":517},[497,1737,1321],{"class":507},[497,1739,1324],{"class":517},[497,1741,1479],{"class":507},[497,1743,1646],{"class":570},[497,1745,585],{"class":507},[497,1747,1651],{"class":588},[497,1749,592],{"class":507},[497,1751,1656],{"class":570},[497,1753,573],{"class":507},[497,1755,1245],{"class":507},[497,1757,1758],{"class":740},"products: scan",[497,1760,737],{"class":507},[497,1762,537],{"class":507},[497,1764,1766],{"class":499,"line":1765},26,[497,1767,1538],{"class":507},[497,1769,1771,1773,1775,1777,1780,1782,1785,1787,1789,1791,1793,1796,1799,1801,1803,1805],{"class":499,"line":1770},27,[497,1772,1192],{"class":503},[497,1774,1298],{"class":570},[497,1776,585],{"class":507},[497,1778,1779],{"class":588},"NewCursorPage",[497,1781,592],{"class":507},[497,1783,1784],{"class":570},"products",[497,1786,573],{"class":507},[497,1788,1295],{"class":570},[497,1790,573],{"class":507},[497,1792,748],{"class":507},[497,1794,1795],{"class":840},"last",[497,1797,1798],{"class":517}," Product",[497,1800,607],{"class":507},[497,1802,1343],{"class":507},[497,1804,866],{"class":517},[497,1806,765],{"class":507},[497,1808,1810,1812,1814,1816,1818,1820,1822,1825,1827,1830,1832,1835],{"class":499,"line":1809},28,[497,1811,783],{"class":503},[497,1813,1343],{"class":507},[497,1815,866],{"class":517},[497,1817,1200],{"class":507},[497,1819,1795],{"class":570},[497,1821,585],{"class":507},[497,1823,1824],{"class":570},"CreatedAt",[497,1826,573],{"class":507},[497,1828,1829],{"class":570}," last",[497,1831,585],{"class":507},[497,1833,1834],{"class":570},"ID",[497,1836,975],{"class":507},[497,1838,1840],{"class":499,"line":1839},29,[497,1841,1842],{"class":507},"    })\n",[497,1844,1846],{"class":499,"line":1845},30,[497,1847,975],{"class":507},[448,1849,1850,1851,1854],{},"És a készletcsökkentés, amit a ",[452,1852,1853],{},"PlaceOrder"," tranzakcióból hív a service:",[488,1856,1858],{"className":490,"code":1857,"language":492,"meta":493,"style":493},"func (r *ProductRepository) DecrementStock(ctx context.Context, productID int64, qty int) error {\n    tag, err := r.db.Exec(ctx,\n        `UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2`,\n        productID, qty)\n    if err != nil {\n        return errs.Wrap(err, \"products: decrement stock\")\n    }\n    if tag.RowsAffected() == 0 {\n        return errs.New(\"insufficient stock\",\n            errs.Code(\"insufficient_stock\"), errs.Public(\"A termék elfogyott.\"))\n    }\n    return nil\n}\n",[452,1859,1860,1909,1937,1949,1960,1972,1997,2001,2024,2046,2087,2091,2097],{"__ignoreMap":493},[497,1861,1862,1864,1866,1868,1870,1872,1874,1877,1879,1881,1883,1885,1887,1889,1892,1895,1897,1900,1903,1905,1907],{"class":499,"line":500},[497,1863,1162],{"class":507},[497,1865,871],{"class":507},[497,1867,1266],{"class":840},[497,1869,1269],{"class":507},[497,1871,1184],{"class":517},[497,1873,607],{"class":507},[497,1875,1876],{"class":588}," DecrementStock",[497,1878,592],{"class":507},[497,1880,595],{"class":840},[497,1882,843],{"class":517},[497,1884,585],{"class":507},[497,1886,756],{"class":517},[497,1888,573],{"class":507},[497,1890,1891],{"class":840}," productID",[497,1893,1894],{"class":761}," int64",[497,1896,573],{"class":507},[497,1898,1899],{"class":840}," qty",[497,1901,1902],{"class":761}," int",[497,1904,607],{"class":507},[497,1906,762],{"class":761},[497,1908,765],{"class":507},[497,1910,1911,1914,1916,1918,1920,1922,1924,1926,1928,1931,1933,1935],{"class":499,"line":511},[497,1912,1913],{"class":570},"    tag",[497,1915,573],{"class":507},[497,1917,576],{"class":570},[497,1919,579],{"class":507},[497,1921,1588],{"class":570},[497,1923,585],{"class":507},[497,1925,1170],{"class":570},[497,1927,585],{"class":507},[497,1929,1930],{"class":588},"Exec",[497,1932,592],{"class":507},[497,1934,595],{"class":570},[497,1936,722],{"class":507},[497,1938,1939,1942,1945,1947],{"class":499,"line":524},[497,1940,1941],{"class":507},"        `",[497,1943,1944],{"class":740},"UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2",[497,1946,1553],{"class":507},[497,1948,722],{"class":507},[497,1950,1951,1954,1956,1958],{"class":499,"line":534},[497,1952,1953],{"class":570},"        productID",[497,1955,573],{"class":507},[497,1957,1899],{"class":570},[497,1959,537],{"class":507},[497,1961,1962,1964,1966,1968,1970],{"class":499,"line":789},[497,1963,1378],{"class":503},[497,1965,576],{"class":570},[497,1967,1455],{"class":507},[497,1969,1458],{"class":507},[497,1971,765],{"class":507},[497,1973,1974,1976,1978,1980,1982,1984,1986,1988,1990,1993,1995],{"class":499,"line":1154},[497,1975,783],{"class":503},[497,1977,1646],{"class":570},[497,1979,585],{"class":507},[497,1981,1651],{"class":588},[497,1983,592],{"class":507},[497,1985,1656],{"class":570},[497,1987,573],{"class":507},[497,1989,1245],{"class":507},[497,1991,1992],{"class":740},"products: decrement stock",[497,1994,737],{"class":507},[497,1996,537],{"class":507},[497,1998,1999],{"class":499,"line":1159},[497,2000,1538],{"class":507},[497,2002,2003,2005,2008,2010,2013,2015,2018,2022],{"class":499,"line":1189},[497,2004,1378],{"class":503},[497,2006,2007],{"class":570}," tag",[497,2009,585],{"class":507},[497,2011,2012],{"class":588},"RowsAffected",[497,2014,1388],{"class":507},[497,2016,2017],{"class":507}," ==",[497,2019,2021],{"class":2020},"sbssI"," 0",[497,2023,765],{"class":507},[497,2025,2026,2028,2030,2032,2035,2037,2039,2042,2044],{"class":499,"line":1213},[497,2027,783],{"class":503},[497,2029,1646],{"class":570},[497,2031,585],{"class":507},[497,2033,2034],{"class":588},"New",[497,2036,592],{"class":507},[497,2038,737],{"class":507},[497,2040,2041],{"class":740},"insufficient stock",[497,2043,737],{"class":507},[497,2045,722],{"class":507},[497,2047,2048,2051,2053,2056,2058,2060,2063,2065,2068,2070,2072,2075,2077,2079,2082,2084],{"class":499,"line":1409},[497,2049,2050],{"class":570},"            errs",[497,2052,585],{"class":507},[497,2054,2055],{"class":588},"Code",[497,2057,592],{"class":507},[497,2059,737],{"class":507},[497,2061,2062],{"class":740},"insufficient_stock",[497,2064,737],{"class":507},[497,2066,2067],{"class":507},"),",[497,2069,1646],{"class":570},[497,2071,585],{"class":507},[497,2073,2074],{"class":588},"Public",[497,2076,592],{"class":507},[497,2078,737],{"class":507},[497,2080,2081],{"class":740},"A termék elfogyott.",[497,2083,737],{"class":507},[497,2085,2086],{"class":507},"))\n",[497,2088,2089],{"class":499,"line":1420},[497,2090,1538],{"class":507},[497,2092,2093,2095],{"class":499,"line":1463},[497,2094,1192],{"class":503},[497,2096,786],{"class":507},[497,2098,2099],{"class":499,"line":1485},[497,2100,975],{"class":507},[448,2102,2103,2104,2107,2108,2111,2112,455,2115,2117,2118,2121,2122,2124,2125,2128,2129,2131,2132,2128,2135,2137,2138,2141,2142,2145],{},"Figyeld meg, mi ",[660,2105,2106],{},"nincs"," a kódban: tranzakció-paraméter. A ",[452,2109,2110],{},"ListProducts"," a publikus listázó endpointból poolon fut; a ",[452,2113,2114],{},"DecrementStock",[452,2116,1853],{}," ",[457,2119,2120],{"href":423},"tranzakcióján belül"," hívva ugyanabba a ",[452,2123,485],{},"-be csatlakozik, mindkettő ugyanazzal a szignatúrával. A ",[452,2126,2127],{},"pgx.CollectRows"," + ",[452,2130,1704],{}," a pgx beépített scanelése; a ",[452,2133,2134],{},"WHERE ... AND stock >= $2",[452,2136,997],{}," páros pedig az atomikus készlet-ellenőrzés, ",[452,2139,2140],{},"SELECT","-majd-",[452,2143,2144],{},"UPDATE"," verseny nélkül.",[557,2147,2149],{"id":2148},"transactor","Transactor",[488,2151,2153],{"className":490,"code":2152,"language":492,"meta":493,"style":493},"tx := pg.NewTransactor(pool) \u002F\u002F dbx.Transactor\n\nerr := tx.WithinTransaction(ctx, func(ctx context.Context) error {\n    if err := s.orders.Insert(ctx, o); err != nil {\n        return err\n    }\n    return s.products.DecrementStock(ctx, o.ProductID, o.Qty) \u002F\u002F ugyanaz a tx\n})\n",[452,2154,2155,2178,2182,2217,2257,2263,2267,2308],{"__ignoreMap":493},[497,2156,2157,2160,2162,2164,2166,2169,2171,2173,2175],{"class":499,"line":500},[497,2158,2159],{"class":570},"tx ",[497,2161,579],{"class":507},[497,2163,582],{"class":570},[497,2165,585],{"class":507},[497,2167,2168],{"class":588},"NewTransactor",[497,2170,592],{"class":507},[497,2172,559],{"class":570},[497,2174,607],{"class":507},[497,2176,2177],{"class":610}," \u002F\u002F dbx.Transactor\n",[497,2179,2180],{"class":499,"line":511},[497,2181,1122],{"emptyLinePlaceholder":1121},[497,2183,2184,2186,2188,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215],{"class":499,"line":524},[497,2185,691],{"class":570},[497,2187,579],{"class":507},[497,2189,2190],{"class":570}," tx",[497,2192,585],{"class":507},[497,2194,1069],{"class":588},[497,2196,592],{"class":507},[497,2198,595],{"class":570},[497,2200,573],{"class":507},[497,2202,748],{"class":507},[497,2204,595],{"class":840},[497,2206,843],{"class":517},[497,2208,585],{"class":507},[497,2210,756],{"class":517},[497,2212,607],{"class":507},[497,2214,762],{"class":761},[497,2216,765],{"class":507},[497,2218,2219,2221,2223,2225,2228,2230,2233,2235,2238,2240,2242,2244,2247,2249,2251,2253,2255],{"class":499,"line":534},[497,2220,1378],{"class":503},[497,2222,576],{"class":570},[497,2224,579],{"class":507},[497,2226,2227],{"class":570}," s",[497,2229,585],{"class":507},[497,2231,2232],{"class":570},"orders",[497,2234,585],{"class":507},[497,2236,2237],{"class":588},"Insert",[497,2239,592],{"class":507},[497,2241,595],{"class":570},[497,2243,573],{"class":507},[497,2245,2246],{"class":570}," o",[497,2248,1450],{"class":507},[497,2250,576],{"class":570},[497,2252,1455],{"class":507},[497,2254,1458],{"class":507},[497,2256,765],{"class":507},[497,2258,2259,2261],{"class":499,"line":789},[497,2260,783],{"class":503},[497,2262,1482],{"class":570},[497,2264,2265],{"class":499,"line":1154},[497,2266,1538],{"class":507},[497,2268,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287,2289,2291,2294,2296,2298,2300,2303,2305],{"class":499,"line":1159},[497,2270,1192],{"class":503},[497,2272,2227],{"class":570},[497,2274,585],{"class":507},[497,2276,1784],{"class":570},[497,2278,585],{"class":507},[497,2280,2114],{"class":588},[497,2282,592],{"class":507},[497,2284,595],{"class":570},[497,2286,573],{"class":507},[497,2288,2246],{"class":570},[497,2290,585],{"class":507},[497,2292,2293],{"class":570},"ProductID",[497,2295,573],{"class":507},[497,2297,2246],{"class":570},[497,2299,585],{"class":507},[497,2301,2302],{"class":570},"Qty",[497,2304,607],{"class":507},[497,2306,2307],{"class":610}," \u002F\u002F ugyanaz a tx\n",[497,2309,2310],{"class":499,"line":1189},[497,2311,2312],{"class":507},"})\n",[448,2314,450,2315,2317,2318,2320,2321,2324,2325,2117,2327,2330,2331,2333,2334,2336],{},[452,2316,1069],{}," tranzakciót nyit a poolon, a ",[452,2319,485],{},"-et a contextbe injektálja, és az ",[452,2322,2323],{},"fn"," lefutása után commitol. Bármilyen hiba, vagy panic, ami rollback után újradobódik, visszagörgeti az egészet. Ha a context már hordoz tranzakciót, az ",[452,2326,2323],{},[660,2328,2329],{},"ahhoz csatlakozik"," új tranzakció helyett: a nesting lapos, savepoint nincs, a commitot\u002Frollbacket mindig a legkülső hívás birtokolja. A minta teljes tárgyalása, a shop ",[452,2332,1853],{}," példájával, a ",[457,2335,422],{"href":423}," oldalon.",[557,2338,2340],{"id":2339},"escape-hatch-a-context-plumbing","Escape hatch: a context-plumbing",[448,2342,2343],{},"Saját executorhoz (pl. batch-íróhoz vagy egy kézzel instrumentált query-úthoz) a tranzakció-hordozás exportált:",[488,2345,2347],{"className":490,"code":2346,"language":492,"meta":493,"style":493},"ctx = pg.ContextWithTx(ctx, tx)   \u002F\u002F tranzakció a contextbe\ntx, ok := pg.TxFromContext(ctx)   \u002F\u002F tranzakció a contextből\n",[452,2348,2349,2376],{"__ignoreMap":493},[497,2350,2351,2354,2356,2358,2360,2363,2365,2367,2369,2371,2373],{"class":499,"line":500},[497,2352,2353],{"class":570},"ctx ",[497,2355,1242],{"class":507},[497,2357,582],{"class":570},[497,2359,585],{"class":507},[497,2361,2362],{"class":588},"ContextWithTx",[497,2364,592],{"class":507},[497,2366,595],{"class":570},[497,2368,573],{"class":507},[497,2370,2190],{"class":570},[497,2372,607],{"class":507},[497,2374,2375],{"class":610},"   \u002F\u002F tranzakció a contextbe\n",[497,2377,2378,2381,2383,2386,2388,2390,2392,2395,2397,2399,2401],{"class":499,"line":511},[497,2379,2380],{"class":570},"tx",[497,2382,573],{"class":507},[497,2384,2385],{"class":570}," ok ",[497,2387,579],{"class":507},[497,2389,582],{"class":570},[497,2391,585],{"class":507},[497,2393,2394],{"class":588},"TxFromContext",[497,2396,592],{"class":507},[497,2398,595],{"class":570},[497,2400,607],{"class":507},[497,2402,2403],{"class":610},"   \u002F\u002F tranzakció a contextből\n",[448,2405,2406,2407,805,2409,2411,2412,2414,2415,984,2418,2421],{},"Alkalmazáskód ezeket normál esetben sosem hívja: a ",[452,2408,1057],{},[452,2410,2149],{}," együtt lefedi. Akkor kellenek, ha a ",[452,2413,1003],{},"-nél gazdagabb pgx-felületre van szükséged (pl. ",[452,2416,2417],{},"CopyFrom",[452,2419,2420],{},"SendBatch",") egy tranzakción belül.",[2423,2424,2425,2426,585],"tip",{},"A tranzakció-szemantikát (commit\u002Frollback\u002Fnesting\u002Fpanic) a dbx saját integrációs tesztjei rögzítik valós PostgreSQL ellen: ",[452,2427,2428],{},"go test -tags=integration .\u002Fdbx\u002Fpg\u002F",[557,2430,2432],{"id":2431},"önálló-példa","Önálló példa",[448,2434,450,2435,2437,2438,2440],{},[452,2436,454],{},"-hez semmi nem kell a kitből: egy pool, egy ",[452,2439,1003],{},"-alapú repository és egy transactor önmagában is elég.",[488,2442,2444],{"className":490,"code":2443,"filename":673,"language":492,"meta":493,"style":493},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, dbx.Config{\n        Host: \"localhost\", Port: 5432,\n        User: \"shop\", Password: \"secret\", Database: \"shop\",\n    })\n    defer pool.Close()\n\n    db := pg.NewDB(pool)\n    tx := pg.NewTransactor(pool)\n\n    err := tx.WithinTransaction(ctx, func(ctx context.Context) error {\n        _, err := db.Exec(ctx, `UPDATE products SET stock = stock - 1 WHERE id = $1`, \"prod_42\")\n        return err\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n",[452,2445,2446,2453,2457,2463,2471,2480,2484,2492,2500,2504,2508,2519,2535,2565,2591,2634,2638,2652,2656,2674,2693,2697,2732,2773,2779,2783,2795,2811,2815],{"__ignoreMap":493},[497,2447,2448,2450],{"class":499,"line":500},[497,2449,1113],{"class":507},[497,2451,2452],{"class":517}," main\n",[497,2454,2455],{"class":499,"line":511},[497,2456,1122],{"emptyLinePlaceholder":1121},[497,2458,2459,2461],{"class":499,"line":524},[497,2460,504],{"class":503},[497,2462,508],{"class":507},[497,2464,2465,2467,2469],{"class":499,"line":534},[497,2466,514],{"class":507},[497,2468,751],{"class":517},[497,2470,521],{"class":507},[497,2472,2473,2475,2478],{"class":499,"line":789},[497,2474,514],{"class":507},[497,2476,2477],{"class":517},"log",[497,2479,521],{"class":507},[497,2481,2482],{"class":499,"line":1154},[497,2483,1122],{"emptyLinePlaceholder":1121},[497,2485,2486,2488,2490],{"class":499,"line":1159},[497,2487,514],{"class":507},[497,2489,518],{"class":517},[497,2491,521],{"class":507},[497,2493,2494,2496,2498],{"class":499,"line":1189},[497,2495,514],{"class":507},[497,2497,529],{"class":517},[497,2499,521],{"class":507},[497,2501,2502],{"class":499,"line":1213},[497,2503,537],{"class":507},[497,2505,2506],{"class":499,"line":1409},[497,2507,1122],{"emptyLinePlaceholder":1121},[497,2509,2510,2512,2515,2517],{"class":499,"line":1420},[497,2511,1162],{"class":507},[497,2513,2514],{"class":588}," main",[497,2516,1388],{"class":507},[497,2518,765],{"class":507},[497,2520,2521,2524,2526,2528,2530,2533],{"class":499,"line":1463},[497,2522,2523],{"class":570},"    ctx ",[497,2525,579],{"class":507},[497,2527,843],{"class":570},[497,2529,585],{"class":507},[497,2531,2532],{"class":588},"Background",[497,2534,778],{"class":507},[497,2536,2537,2540,2542,2544,2546,2548,2550,2552,2554,2557,2559,2562],{"class":499,"line":1485},[497,2538,2539],{"class":570},"    pool ",[497,2541,579],{"class":507},[497,2543,582],{"class":570},[497,2545,585],{"class":507},[497,2547,625],{"class":588},[497,2549,592],{"class":507},[497,2551,595],{"class":570},[497,2553,573],{"class":507},[497,2555,2556],{"class":517}," dbx",[497,2558,585],{"class":507},[497,2560,2561],{"class":517},"Config",[497,2563,2564],{"class":507},"{\n",[497,2566,2567,2570,2572,2574,2577,2579,2581,2584,2586,2589],{"class":499,"line":1491},[497,2568,2569],{"class":570},"        Host",[497,2571,1205],{"class":507},[497,2573,1245],{"class":507},[497,2575,2576],{"class":740},"localhost",[497,2578,737],{"class":507},[497,2580,573],{"class":507},[497,2582,2583],{"class":570}," Port",[497,2585,1205],{"class":507},[497,2587,2588],{"class":2020}," 5432",[497,2590,722],{"class":507},[497,2592,2593,2596,2598,2600,2603,2605,2607,2610,2612,2614,2617,2619,2621,2624,2626,2628,2630,2632],{"class":499,"line":1507},[497,2594,2595],{"class":570},"        User",[497,2597,1205],{"class":507},[497,2599,1245],{"class":507},[497,2601,2602],{"class":740},"shop",[497,2604,737],{"class":507},[497,2606,573],{"class":507},[497,2608,2609],{"class":570}," Password",[497,2611,1205],{"class":507},[497,2613,1245],{"class":507},[497,2615,2616],{"class":740},"secret",[497,2618,737],{"class":507},[497,2620,573],{"class":507},[497,2622,2623],{"class":570}," Database",[497,2625,1205],{"class":507},[497,2627,1245],{"class":507},[497,2629,2602],{"class":740},[497,2631,737],{"class":507},[497,2633,722],{"class":507},[497,2635,2636],{"class":499,"line":1535},[497,2637,1842],{"class":507},[497,2639,2640,2643,2646,2648,2650],{"class":499,"line":1541},[497,2641,2642],{"class":503},"    defer",[497,2644,2645],{"class":570}," pool",[497,2647,585],{"class":507},[497,2649,775],{"class":588},[497,2651,778],{"class":507},[497,2653,2654],{"class":499,"line":1571},[497,2655,1122],{"emptyLinePlaceholder":1121},[497,2657,2658,2660,2662,2664,2666,2668,2670,2672],{"class":499,"line":1576},[497,2659,1139],{"class":570},[497,2661,579],{"class":507},[497,2663,582],{"class":570},[497,2665,585],{"class":507},[497,2667,1043],{"class":588},[497,2669,592],{"class":507},[497,2671,559],{"class":570},[497,2673,537],{"class":507},[497,2675,2676,2679,2681,2683,2685,2687,2689,2691],{"class":499,"line":1616},[497,2677,2678],{"class":570},"    tx ",[497,2680,579],{"class":507},[497,2682,582],{"class":570},[497,2684,585],{"class":507},[497,2686,2168],{"class":588},[497,2688,592],{"class":507},[497,2690,559],{"class":570},[497,2692,537],{"class":507},[497,2694,2695],{"class":499,"line":1629},[497,2696,1122],{"emptyLinePlaceholder":1121},[497,2698,2699,2702,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730],{"class":499,"line":1670},[497,2700,2701],{"class":570},"    err ",[497,2703,579],{"class":507},[497,2705,2190],{"class":570},[497,2707,585],{"class":507},[497,2709,1069],{"class":588},[497,2711,592],{"class":507},[497,2713,595],{"class":570},[497,2715,573],{"class":507},[497,2717,748],{"class":507},[497,2719,595],{"class":840},[497,2721,843],{"class":517},[497,2723,585],{"class":507},[497,2725,756],{"class":517},[497,2727,607],{"class":507},[497,2729,762],{"class":761},[497,2731,765],{"class":507},[497,2733,2734,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2760,2762,2764,2766,2769,2771],{"class":499,"line":1675},[497,2735,2736],{"class":570},"        _",[497,2738,573],{"class":507},[497,2740,576],{"class":570},[497,2742,579],{"class":507},[497,2744,1208],{"class":570},[497,2746,585],{"class":507},[497,2748,1930],{"class":588},[497,2750,592],{"class":507},[497,2752,595],{"class":570},[497,2754,573],{"class":507},[497,2756,1367],{"class":507},[497,2758,2759],{"class":740},"UPDATE products SET stock = stock - 1 WHERE id = $1",[497,2761,1553],{"class":507},[497,2763,573],{"class":507},[497,2765,1245],{"class":507},[497,2767,2768],{"class":740},"prod_42",[497,2770,737],{"class":507},[497,2772,537],{"class":507},[497,2774,2775,2777],{"class":499,"line":1714},[497,2776,783],{"class":503},[497,2778,1482],{"class":570},[497,2780,2781],{"class":499,"line":1727},[497,2782,1842],{"class":507},[497,2784,2785,2787,2789,2791,2793],{"class":499,"line":1765},[497,2786,1378],{"class":503},[497,2788,576],{"class":570},[497,2790,1455],{"class":507},[497,2792,1458],{"class":507},[497,2794,765],{"class":507},[497,2796,2797,2800,2802,2805,2807,2809],{"class":499,"line":1770},[497,2798,2799],{"class":570},"        log",[497,2801,585],{"class":507},[497,2803,2804],{"class":588},"Fatal",[497,2806,592],{"class":507},[497,2808,1656],{"class":570},[497,2810,537],{"class":507},[497,2812,2813],{"class":499,"line":1809},[497,2814,1538],{"class":507},[497,2816,2817],{"class":499,"line":1839},[497,2818,975],{"class":507},[557,2820,2822],{"id":2821},"használt-patternek","Használt patternek",[2824,2825,2826,2838],"ul",{},[2827,2828,2829,871,2832,2834,2835,585],"li",{},[660,2830,2831],{},"Szűk, sqlc-kompatibilis repository-interfész",[452,2833,1003],{},"): ",[457,2836,238],{"href":2837},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#sz%C5%B1k-repository-interf%C3%A9sz-sqlc-kompatibilis",[2827,2839,2840,871,2843,984,2845,2834,2848,585],{},[660,2841,2842],{},"Unit of Work \u002F tranzakció a contextben",[452,2844,1069],{},[452,2846,2847],{},"txKey{}",[457,2849,238],{"href":2850},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#unit-of-work--tranzakci%C3%B3-a-contextben",[2852,2853,2854],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":493,"searchDepth":511,"depth":511,"links":2856},[2857,2858,2859,2860,2861,2862,2863,2864],{"id":559,"depth":511,"text":560},{"id":811,"depth":511,"text":812},{"id":1023,"depth":511,"text":1024},{"id":1079,"depth":511,"text":1080},{"id":2148,"depth":511,"text":2149},{"id":2339,"depth":511,"text":2340},{"id":2431,"depth":511,"text":2432},{"id":2821,"depth":511,"text":2822},"A pgx-natív adatbázis-stack: pool, a DBTX query executor és a contextet figyelő DB.","md",null,{},{"icon":106},{"title":414,"description":2865},"EDIMGVO4rjUn2MCofmRuVMdZKhNHvxSD7B0g-xJkRGY",[2873,2875],{"title":52,"path":411,"stem":412,"description":2874,"icon":406,"children":-1},"A dbx modul, az adatbázis-agnosztikus kontrakt, amitől a kódod függ, és a két implementáció, amit importtal választasz.",{"title":418,"path":419,"stem":420,"description":2876,"icon":47,"children":-1},"Az opcionális bun adapter: query builder és struct-modellek, a Transactor kontrakt változatlanul.",1785445887549]