{"name":"pg_optional.nu","source":"// examples/pg_optional.nu — PostgreSQL with the language's option types.\n//\n// Shows the option-typed surface of `stdlib/ext/postgres.nu` end to end:\n//\n//   * Binding parameters with `Vec ?String` — `T text` binds a value,\n//     `F` (None) binds SQL NULL — via `pg_exec_params_opt`. Internally\n//     that walks the params with `vec_get [?String]` → `??String`.\n//   * Reading nullable columns back as `?String` / `?i` via\n//     `pg_get_opt` / `pg_get_opt_int`, matched with `??`.\n//\n// Connect via a conninfo argument or $PG_CONNINFO, e.g.\n//   ./pg_optional \"host=/tmp port=5433 user=postgres dbname=postgres\"\n//   PG_CONNINFO=\"host=/tmp …\" ./pg_optional\n//\n// Build:  ./nurl.sh examples/pg_optional.nu pg_optional\n\n$ `stdlib/core/string.nu`\n$ `stdlib/core/vec.nu`\n$ `stdlib/ext/env.nu`\n$ `stdlib/ext/postgres.nu`\n\n// Push a `T value` (some text) onto a `Vec ?String`.\n@ push_some ( Vec ? String ) ps s text → v {\n    ( vec_push [? String] ps @ ?String { T ( string_from text ) } )\n}\n\n// Push an `F` (None) — binds SQL NULL.\n@ push_null ( Vec ? String ) ps → v {\n    ( vec_push [? String] ps @ ?String { F # String 0 } )\n}\n\n// Insert one (name, nickname) row where nickname may be NULL.\n@ insert_person Connection c s name b has_nick s nick → v {\n    : ( Vec ? String ) ps ( vec_with_cap [? String] 2 )\n    ( push_some ps name )\n    ? has_nick { ( push_some ps nick ) } { ( push_null ps ) }\n    : !PgResult PgErr r ( pg_exec_params_opt c `INSERT INTO people (name, nickname) VALUES ($1, $2)` ps )\n    ?? r {\n        F e → {\n            : String em ( pg_err_msg c )\n            ( nurl_print `insert failed: ` ) ( nurl_print ( string_data em ) )\n            ( string_free em )\n        }\n        T res → ( pg_clear res )\n    }\n}\n\n@ run Connection c → v {\n    // Schema — TEMP TABLE auto-drops at session end.\n    : !i PgErr ddl ( pg_run c `CREATE TEMP TABLE people (id SERIAL PRIMARY KEY, name TEXT NOT NULL, nickname TEXT)` )\n    ?? ddl { F _ → ( nurl_print `ddl failed\\n` ) T _ → {} }\n\n    ( insert_person c `Ada` T `Countess` )\n    ( insert_person c `Alan` F `` )\n    ( insert_person c `Grace` T `Amazing` )\n    ( insert_person c `Dijkstra` F `` )\n\n    // Read back, treating nickname as an optional value.\n    : !PgResult PgErr q ( pg_exec c `SELECT name, nickname FROM people ORDER BY id` )\n    ?? q {\n        F e → {\n            : String em ( pg_err_msg c )\n            ( nurl_print `select failed: ` ) ( nurl_print ( string_data em ) )\n            ( string_free em )\n        }\n        T r → {\n            : i nrows ( pg_ntuples r )\n            : ~ i row 0\n            ~ < row nrows {\n                : String name ( pg_get_value r row 0 )\n                ( nurl_print ( string_data name ) ) ( nurl_print ` — ` )\n                // pg_get_opt → ?String: None means the column was SQL NULL.\n                ?? ( pg_get_opt r row 1 ) {\n                    T nick → {\n                        ( nurl_print `\"` ) ( nurl_print ( string_data nick ) ) ( nurl_print `\"\\n` )\n                        ( string_free nick )\n                    }\n                    F _ → ( nurl_print `(no nickname)\\n` )\n                }\n                ( string_free name )\n                = row + row 1\n            }\n            ( nurl_print `(` ) ( nurl_print ( nurl_str_int nrows ) ) ( nurl_print ` rows)\\n` )\n            ( pg_clear r )\n        }\n    }\n}\n\n@ main → i {\n    : ~ s conninfo ``\n    : ( Vec String ) args ( env_args_list )\n    ? > ( vec_len [String] args ) 1 {\n        ?? ( vec_get [String] args 1 ) { T a → = conninfo ( string_data a ) F _ → {} }\n    } {}\n    ? == 0 ( nurl_str_len conninfo ) {\n        ?? ( env_get `PG_CONNINFO` ) { T ev → = conninfo ( string_data ev ) F _ → {} }\n    } {}\n\n    : Connection c ( pg_connect conninfo )\n    ? ! ( pg_ok c ) {\n        : String em ( pg_err_msg c )\n        ( nurl_print `connect failed: ` ) ( nurl_print ( string_data em ) )\n        ( string_free em )\n        ( pg_close c )\n        ^ 1\n    } {}\n    ( run c )\n    ( pg_close c )\n    ^ 0\n}\n","bytes":4033}