This file is indexed.

/usr/share/doc/libghc-postgresql-simple-doc/html/src/Database-PostgreSQL-Simple-TypeInfo.html is in libghc-postgresql-simple-doc 0.4.0.2-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Database/PostgreSQL/Simple/TypeInfo.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE RecordWildCards #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-4"></a><span class='hs-comment'>-- |</span>
<a name="line-5"></a><span class='hs-comment'>-- Module:      Database.PostgreSQL.Simple.TypeInfo</span>
<a name="line-6"></a><span class='hs-comment'>-- Copyright:   (c) 2013 Leon P Smith</span>
<a name="line-7"></a><span class='hs-comment'>-- License:     BSD3</span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer:  Leon P Smith &lt;leon@melding-monads.com&gt;</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability:   experimental</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- This module provides convenient and efficient access to parts of the</span>
<a name="line-12"></a><span class='hs-comment'>-- @pg_type@ metatable.  At the moment, this requires PostgreSQL 8.4 if</span>
<a name="line-13"></a><span class='hs-comment'>-- you need to work with types that do not appear in</span>
<a name="line-14"></a><span class='hs-comment'>-- 'Database.PostgreSQL.Simple.TypeInfo.Static'.</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- The current scheme could be more efficient, especially for some use</span>
<a name="line-17"></a><span class='hs-comment'>-- cases.  In particular,  connection pools that use many user-added</span>
<a name="line-18"></a><span class='hs-comment'>-- types and connect to a set of servers with identical (or at least</span>
<a name="line-19"></a><span class='hs-comment'>-- compatible) @pg_type@ and associated tables could share a common</span>
<a name="line-20"></a><span class='hs-comment'>-- typeinfo cache,  thus saving memory and communication between the</span>
<a name="line-21"></a><span class='hs-comment'>-- client and server.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeInfo</span>
<a name="line-26"></a>     <span class='hs-layout'>(</span> <span class='hs-varid'>getTypeInfo</span>
<a name="line-27"></a>     <span class='hs-layout'>,</span> <span class='hs-conid'>TypeInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-28"></a>     <span class='hs-layout'>,</span> <span class='hs-conid'>Attribute</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-29"></a>     <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>IntMap</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>IntMap</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>V</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Mutable</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>MV</span>
<a name="line-35"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Concurrent</span><span class='hs-varop'>.</span><span class='hs-conid'>MVar</span>
<a name="line-36"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-layout'>(</span><span class='hs-varid'>throw</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>LibPQ</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>PQ</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span>
<a name="line-40"></a><span class='hs-keyword'>import</span>                <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-41"></a><span class='hs-keyword'>import</span>                <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-42"></a><span class='hs-keyword'>import</span>                <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeInfo</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-43"></a><span class='hs-keyword'>import</span>                <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeInfo</span><span class='hs-varop'>.</span><span class='hs-conid'>Static</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-comment'>-- | Returns the metadata of the type with a particular oid.  To find</span>
<a name="line-46"></a><span class='hs-comment'>--   this data, 'getTypeInfo' first consults postgresql-simple's</span>
<a name="line-47"></a><span class='hs-comment'>--   built-in 'staticTypeInfo' table,  then checks  the connection's</span>
<a name="line-48"></a><span class='hs-comment'>--   typeinfo cache.   Finally,  the database's 'pg_type' table will</span>
<a name="line-49"></a><span class='hs-comment'>--   be queried only if necessary,  and the result will be stored</span>
<a name="line-50"></a><span class='hs-comment'>--   in the connections's cache.</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="getTypeInfo"></a><span class='hs-definition'>getTypeInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Connection</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PQ</span><span class='hs-varop'>.</span><span class='hs-conid'>Oid</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>TypeInfo</span>
<a name="line-53"></a><span class='hs-definition'>getTypeInfo</span> <span class='hs-varid'>conn</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Connection</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>oid</span> <span class='hs-keyglyph'>=</span>
<a name="line-54"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>staticTypeInfo</span> <span class='hs-varid'>oid</span> <span class='hs-keyword'>of</span>
<a name="line-55"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>name</span>
<a name="line-56"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>modifyMVar</span> <span class='hs-varid'>connectionObjects</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getTypeInfo'</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>oid</span>
<a name="line-57"></a>
<a name="line-58"></a><a name="getTypeInfo'"></a><span class='hs-definition'>getTypeInfo'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Connection</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PQ</span><span class='hs-varop'>.</span><span class='hs-conid'>Oid</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeInfoCache</span>
<a name="line-59"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypeInfoCache</span><span class='hs-layout'>,</span> <span class='hs-conid'>TypeInfo</span><span class='hs-layout'>)</span>
<a name="line-60"></a><span class='hs-definition'>getTypeInfo'</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>oid</span> <span class='hs-varid'>oidmap</span> <span class='hs-keyglyph'>=</span>
<a name="line-61"></a>  <span class='hs-keyword'>case</span> <span class='hs-conid'>IntMap</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>oid2int</span> <span class='hs-varid'>oid</span><span class='hs-layout'>)</span> <span class='hs-varid'>oidmap</span> <span class='hs-keyword'>of</span>
<a name="line-62"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>typeinfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeinfo</span><span class='hs-layout'>)</span>
<a name="line-63"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-64"></a>      <span class='hs-varid'>names</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>query</span> <span class='hs-varid'>conn</span> <span class='hs-str'>"SELECT oid, typcategory, typdelim, typname,\
<a name="line-65"></a>                         \ typelem, typrelid\
<a name="line-66"></a>                         \ FROM pg_type WHERE oid = ?"</span>
<a name="line-67"></a>                           <span class='hs-layout'>(</span><span class='hs-conid'>Only</span> <span class='hs-varid'>oid</span><span class='hs-layout'>)</span>
<a name="line-68"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span>
<a name="line-69"></a>          <span class='hs-keyword'>case</span> <span class='hs-varid'>names</span> <span class='hs-keyword'>of</span>
<a name="line-70"></a>            <span class='hs-conid'>[]</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>throw</span> <span class='hs-layout'>(</span><span class='hs-varid'>fatalError</span> <span class='hs-str'>"invalid type oid"</span><span class='hs-layout'>)</span>
<a name="line-71"></a>            <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>typoid</span><span class='hs-layout'>,</span> <span class='hs-varid'>typcategory</span><span class='hs-layout'>,</span> <span class='hs-varid'>typdelim</span><span class='hs-layout'>,</span> <span class='hs-varid'>typname</span><span class='hs-layout'>,</span> <span class='hs-varid'>typelem_</span><span class='hs-layout'>,</span> <span class='hs-varid'>typrelid</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-72"></a>               <span class='hs-keyword'>case</span> <span class='hs-varid'>typcategory</span> <span class='hs-keyword'>of</span>
<a name="line-73"></a>                 <span class='hs-chr'>'A'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-74"></a>                   <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typelem</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getTypeInfo'</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>typelem_</span> <span class='hs-varid'>oidmap</span>
<a name="line-75"></a>                   <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>typeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Array</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-76"></a>                   <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span>
<a name="line-77"></a>                 <span class='hs-chr'>'R'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-78"></a>                   <span class='hs-varid'>rngsubtypeOids</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>query</span> <span class='hs-varid'>conn</span> <span class='hs-str'>"SELECT rngsubtype\
<a name="line-79"></a>                                               \ FROM pg_range\
<a name="line-80"></a>                                               \ WHERE rngtypid = ?"</span>
<a name="line-81"></a>                                                <span class='hs-layout'>(</span><span class='hs-conid'>Only</span> <span class='hs-varid'>oid</span><span class='hs-layout'>)</span>
<a name="line-82"></a>                   <span class='hs-keyword'>case</span> <span class='hs-varid'>rngsubtypeOids</span> <span class='hs-keyword'>of</span>
<a name="line-83"></a>                     <span class='hs-keyglyph'>[</span><span class='hs-conid'>Only</span> <span class='hs-varid'>rngsubtype_</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-84"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>rngsubtype</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span>
<a name="line-85"></a>                            <span class='hs-varid'>getTypeInfo'</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>rngsubtype_</span> <span class='hs-varid'>oidmap</span>
<a name="line-86"></a>                        <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>typeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-87"></a>                        <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span>
<a name="line-88"></a>                     <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"range subtype query failed to return exactly one result"</span>
<a name="line-89"></a>                 <span class='hs-chr'>'C'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-90"></a>                   <span class='hs-varid'>cols</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>query</span> <span class='hs-varid'>conn</span> <span class='hs-str'>"SELECT attname, atttypid\
<a name="line-91"></a>                                     \ FROM pg_attribute\
<a name="line-92"></a>                                     \ WHERE attrelid = ?\
<a name="line-93"></a>                                       \ AND attnum &gt; 0\
<a name="line-94"></a>                                       \ AND NOT attisdropped\
<a name="line-95"></a>                                     \ ORDER BY attnum"</span>
<a name="line-96"></a>                                      <span class='hs-layout'>(</span><span class='hs-conid'>Only</span> <span class='hs-varid'>typrelid</span><span class='hs-layout'>)</span>
<a name="line-97"></a>                   <span class='hs-varid'>vec</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MV</span><span class='hs-varop'>.</span><span class='hs-varid'>new</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>length</span> <span class='hs-varid'>cols</span>
<a name="line-98"></a>                   <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>attributes</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getAttInfos</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>cols</span> <span class='hs-varid'>oidmap</span> <span class='hs-varid'>vec</span> <span class='hs-num'>0</span>
<a name="line-99"></a>                   <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>typeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Composite</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-100"></a>                   <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span>
<a name="line-101"></a>                 <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-102"></a>                   <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>typeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Basic</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-103"></a>                   <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span>
<a name="line-104"></a>            <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"typename query returned more than one result"</span>
<a name="line-105"></a>                   <span class='hs-comment'>-- oid is a primary key,  so the query should</span>
<a name="line-106"></a>                   <span class='hs-comment'>-- never return more than one result</span>
<a name="line-107"></a>      <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>oidmap''</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IntMap</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-layout'>(</span><span class='hs-varid'>oid2int</span> <span class='hs-varid'>oid</span><span class='hs-layout'>)</span> <span class='hs-varid'>typeInfo</span> <span class='hs-varid'>oidmap'</span>
<a name="line-108"></a>      <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap''</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeInfo</span><span class='hs-layout'>)</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="getAttInfos"></a><span class='hs-definition'>getAttInfos</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Connection</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>PQ</span><span class='hs-varop'>.</span><span class='hs-conid'>Oid</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeInfoCache</span>
<a name="line-111"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MV</span><span class='hs-varop'>.</span><span class='hs-conid'>IOVector</span> <span class='hs-conid'>Attribute</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-112"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypeInfoCache</span><span class='hs-layout'>,</span> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span> <span class='hs-conid'>Attribute</span><span class='hs-layout'>)</span>
<a name="line-113"></a><span class='hs-definition'>getAttInfos</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>cols</span> <span class='hs-varid'>oidmap</span> <span class='hs-varid'>vec</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span>
<a name="line-114"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>cols</span> <span class='hs-keyword'>of</span>
<a name="line-115"></a>      <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-116"></a>        <span class='hs-varop'>!</span><span class='hs-varid'>attributes</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeFreeze</span> <span class='hs-varid'>vec</span>
<a name="line-117"></a>        <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>oidmap</span><span class='hs-layout'>,</span> <span class='hs-varid'>attributes</span><span class='hs-layout'>)</span>
<a name="line-118"></a>      <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>attname</span><span class='hs-layout'>,</span> <span class='hs-varid'>attTypeOid</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-119"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>oidmap'</span><span class='hs-layout'>,</span> <span class='hs-varid'>atttype</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getTypeInfo'</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>attTypeOid</span> <span class='hs-varid'>oidmap</span>
<a name="line-120"></a>        <span class='hs-conid'>MV</span><span class='hs-varop'>.</span><span class='hs-varid'>write</span> <span class='hs-varid'>vec</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Attribute</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-121"></a>        <span class='hs-varid'>getAttInfos</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>oidmap'</span> <span class='hs-varid'>vec</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
</pre></body>
</html>