Changeset 14765 for release/4/postgresql/trunk/postgresql.scm
- Timestamp:
- 05/25/09 00:07:23 (16 months ago)
- Files:
-
- 1 modified
-
release/4/postgresql/trunk/postgresql.scm (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
release/4/postgresql/trunk/postgresql.scm
r14764 r14765 29 29 exec-simple-queries exec-query 30 30 31 result? clear-result! result-row-count result-column-count 32 result-column-index result-column-name result-column-names 33 result-column-format result-column-type result-column-type-modifier 34 result-table-oid result-table-column-index 35 result-value result-row result-row-alist result-column 36 result-affected-rows result-inserted-oid 31 result? clear-result! row-count column-count 32 column-index column-name column-names column-format 33 column-type column-type-modifier table-oid table-column-index 34 value-at row-values row-alist column-values affected-rows inserted-oid 37 35 38 36 invalid-oid … … 315 313 (PQclear result-ptr))) 316 314 317 (define (r esult-row-count result)315 (define (row-count result) 318 316 (PQntuples (pg-result-ptr result))) 319 317 320 (define ( result-column-count result)318 (define (column-count result) 321 319 (PQnfields (pg-result-ptr result))) 322 320 323 321 ;; Helper procedures for bounds checking; so we can distinguish between 324 322 ;; out of bounds and nonexistant columns, and signal it. 325 (define (check- result-column-index! result index location)326 (when (>= index ( result-column-count result))323 (define (check-column-index! result index location) 324 (when (>= index (column-count result)) 327 325 (postgresql-error 328 326 location (sprintf "Result column ~A out of bounds" index) result index))) 329 327 330 (define (check-r esult-row-index! result index location)331 (when (>= index (r esult-row-count result))328 (define (check-row-index! result index location) 329 (when (>= index (row-count result)) 332 330 (postgresql-error 333 331 location (sprintf "Result row ~A out of bounds" index) result index))) 334 332 335 (define ( result-column-name result index)336 (check- result-column-index! result index 'result-column)333 (define (column-name result index) 334 (check-column-index! result index 'column-name) 337 335 (string->symbol (PQfname (pg-result-ptr result) index))) 338 336 339 (define ( result-column-names result)340 (let loop ((ptr (pg-result-ptr result))341 (row'())342 (idx (result-column-count result)))343 (if (= idx0)344 row345 (loop ptr (cons (string->symbol346 (PQfname ptr (sub1 idx))) row) (sub1 idx)))))347 348 (define ( result-column-index result name)337 (define (column-names result) 338 (let ((ptr (pg-result-ptr result))) 339 (let loop ((names '()) 340 (column (column-count result))) 341 (if (= column 0) 342 names 343 (loop (cons (string->symbol (PQfname ptr (sub1 column))) names) 344 (sub1 column)))))) 345 346 (define (column-index result name) 349 347 (let ((idx (PQfnumber (pg-result-ptr result) (symbol->string name)))) 350 348 (and (>= idx 0) idx))) 351 349 352 (define ( result-table-oid result index)353 (check- result-column-index! result index 'result-table-oid)350 (define (table-oid result index) 351 (check-column-index! result index 'table-oid) 354 352 (let ((oid (PQftable (pg-result-ptr result) index))) 355 353 (and (not (= oid invalid-oid)) oid))) … … 358 356 ;; consistent with the rest of Scheme. However, this is inconsistent with 359 357 ;; almost all other PostgreSQL interfaces... 360 (define ( result-table-column-index result index)361 (check- result-column-index! result index 'result-table-column-index)358 (define (table-column-index result index) 359 (check-column-index! result index 'table-column-index) 362 360 (let ((idx (PQftablecol (pg-result-ptr result) index))) 363 361 (and (> idx 0) (sub1 idx)))) … … 375 373 (postgresql-error 'format->symbol "Unknown format" symbol))) 376 374 377 (define ( result-column-format result index)378 (check- result-column-index! result index 'result-column-format)375 (define (column-format result index) 376 (check-column-index! result index 'column-format) 379 377 (format->symbol (PQfformat (pg-result-ptr result) index))) 380 378 381 (define ( result-column-type result index)382 (check- result-column-index! result index 'result-column-type)379 (define (column-type result index) 380 (check-column-index! result index 'column-type) 383 381 (PQftype (pg-result-ptr result) index)) 384 382 385 383 ;; This is really not super-useful as it requires intimate knowledge 386 384 ;; about the internal implementations of types in PostgreSQL. 387 (define ( result-column-type-modifier result index)388 (check- result-column-index! result index 'result-column-type)385 (define (column-type-modifier result index) 386 (check-column-index! result index 'column-type) 389 387 (let ((mod (PQfmod (pg-result-ptr result) index))) 390 388 (and (>= mod 0) mod))) 391 389 392 390 ;; Unchecked version, for speed 393 (define ( result-value* result row column #!key raw)391 (define (value-at* result row column #!key raw) 394 392 (if (PQgetisnull (pg-result-ptr result) row column) 395 393 (sql-null) … … 409 407 ((vector-ref (pg-result-value-parsers result) column) value))))) 410 408 411 (define ( result-valueresult row column #!key raw)412 (check-r esult-row-index! result row 'result-value)413 (check- result-column-index! result column 'result-value)414 ( result-value* result row column raw: raw))415 416 (define (r esult-rowresult row #!key raw)417 (check-r esult-row-index! result row 'result-list)409 (define (value-at result row column #!key raw) 410 (check-row-index! result row 'value) 411 (check-column-index! result column 'value) 412 (value-at* result row column raw: raw)) 413 414 (define (row-values result row #!key raw) 415 (check-row-index! result row 'row) 418 416 (let loop ((list '()) 419 (column ( result-column-count result)))417 (column (column-count result))) 420 418 (if (= column 0) 421 419 list 422 (loop (cons ( result-value* result row (sub1 column) raw: raw) list)420 (loop (cons (value-at* result row (sub1 column) raw: raw) list) 423 421 (sub1 column))))) 424 422 425 (define ( result-columnresult column #!key raw)426 (check- result-column-index! result column 'result-list)423 (define (column-values result column #!key raw) 424 (check-column-index! result column 'column) 427 425 (let loop ((list '()) 428 (row (r esult-row-count result)))426 (row (row-count result))) 429 427 (if (= row 0) 430 428 list 431 (loop (cons ( result-value* result (sub1 row) column raw: raw) list)429 (loop (cons (value-at* result (sub1 row) column raw: raw) list) 432 430 (sub1 row))))) 433 431 434 ;; (define (r esult-row-alist result row)435 ;; (map cons ( result-column-names result) (result-rowresult row)))436 (define (r esult-row-alist result row)437 (check-r esult-row-index! result row 'result-alist)432 ;; (define (row-alist result row) 433 ;; (map cons (column-names result) (row-values result row))) 434 (define (row-alist result row) 435 (check-row-index! result row 'row-alist) 438 436 (let loop ((alist '()) 439 (column ( result-column-count result)))437 (column (column-count result))) 440 438 (if (= column 0) 441 439 alist 442 440 (loop (cons (cons (string->symbol 443 441 (PQfname (pg-result-ptr result) (sub1 column))) 444 ( result-value* result row (sub1 column))) alist)442 (value-at* result row (sub1 column))) alist) 445 443 (sub1 column))))) 446 444 447 445 ;;; TODO: Do we want/need PQnparams and PQparamtype bindings? 448 446 449 (define ( result-affected-rows result)447 (define (affected-rows result) 450 448 (string->number (PQcmdTuples (pg-result-ptr result)))) 451 449 452 (define ( result-inserted-oid result)450 (define (inserted-oid result) 453 451 (let ((oid (PQoidValue (pg-result-ptr result)))) 454 452 (and (not (= oid invalid-oid)) oid))) … … 686 684 (define (%query-fold kons knil conn query params) 687 685 (let* ((result (exec-query conn query params)) 688 (rows (r esult-row-count result)))686 (rows (row-count result))) 689 687 (let loop ((seed knil) 690 688 (row 0)) 691 689 (if (= row rows) 692 690 seed 693 (loop (kons (r esult-rowresult row) seed) (add1 row))))))691 (loop (kons (row-values result row) seed) (add1 row)))))) 694 692 695 693 (define (%query-fold-right kons knil conn query params) 696 694 (let* ((result (exec-query conn query params)) 697 (rows (r esult-row-count result)))695 (rows (row-count result))) 698 696 (let loop ((seed knil) 699 697 (row 0)) 700 698 (if (= row rows) 701 699 seed 702 (kons (r esult-rowresult row) (loop seed (add1 row)))))))700 (kons (row-values result row) (loop seed (add1 row))))))) 703 701 704 702 (define (query-fold kons knil conn query . params) … … 726 724 (define (%query-map proc conn query params) 727 725 (let ((result (exec-query conn query params))) 728 (let loop (( ans'())729 (row (r esult-row-count result)))726 (let loop ((lst '()) 727 (row (row-count result))) 730 728 (if (= row 0) 731 ans732 (loop (cons (proc (r esult-row result (sub1 row))) ans) (sub1 row))))))729 lst 730 (loop (cons (proc (row-values result (sub1 row))) lst) (sub1 row)))))) 733 731 (define (query-map proc conn query . params) 734 732 (%query-map proc conn query params))
