8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.6 2002/09/04 20:31:14 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.7 2002/11/02 02:33:03 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
30
30
#include "utils/acl.h"
31
31
#include "miscadmin.h"
32
32
33
- /* ----------------
33
+ /*
34
34
* ConversionCreate
35
35
*
36
- * Add a new tuple to pg_coversion.
37
- * ---------------
36
+ * Add a new tuple to pg_conversion.
38
37
*/
39
38
Oid
40
39
ConversionCreate (const char * conname , Oid connamespace ,
41
40
int32 conowner ,
42
- int4 conforencoding , int4 contoencoding ,
41
+ int32 conforencoding , int32 contoencoding ,
43
42
Oid conproc , bool def )
44
43
{
45
44
int i ;
@@ -58,7 +57,7 @@ ConversionCreate(const char *conname, Oid connamespace,
58
57
elog (ERROR , "no conversion name supplied" );
59
58
60
59
/* make sure there is no existing conversion of same name */
61
- if (SearchSysCacheExists (CONNAMESP ,
60
+ if (SearchSysCacheExists (CONNAMENSP ,
62
61
PointerGetDatum (conname ),
63
62
ObjectIdGetDatum (connamespace ),
64
63
0 , 0 ))
@@ -74,7 +73,8 @@ ConversionCreate(const char *conname, Oid connamespace,
74
73
conforencoding ,
75
74
contoencoding ))
76
75
elog (ERROR , "default conversion for %s to %s already exists" ,
77
- pg_encoding_to_char (conforencoding ), pg_encoding_to_char (contoencoding ));
76
+ pg_encoding_to_char (conforencoding ),
77
+ pg_encoding_to_char (contoencoding ));
78
78
}
79
79
80
80
/* open pg_conversion */
@@ -96,10 +96,7 @@ ConversionCreate(const char *conname, Oid connamespace,
96
96
values [Anum_pg_conversion_conforencoding - 1 ] = Int32GetDatum (conforencoding );
97
97
values [Anum_pg_conversion_contoencoding - 1 ] = Int32GetDatum (contoencoding );
98
98
values [Anum_pg_conversion_conproc - 1 ] = ObjectIdGetDatum (conproc );
99
- if (def == true)
100
- values [Anum_pg_conversion_condefault - 1 ] = BoolGetDatum (def );
101
- else
102
- nulls [Anum_pg_conversion_condefault - 1 ] = 'n' ;
99
+ values [Anum_pg_conversion_condefault - 1 ] = BoolGetDatum (def );
103
100
104
101
tup = heap_formtuple (tupDesc , values , nulls );
105
102
@@ -110,11 +107,11 @@ ConversionCreate(const char *conname, Oid connamespace,
110
107
/* update the index if any */
111
108
CatalogUpdateIndexes (rel , tup );
112
109
113
- myself .classId = get_system_catalog_relid ( ConversionRelationName );
110
+ myself .classId = RelationGetRelid ( rel );
114
111
myself .objectId = HeapTupleGetOid (tup );
115
112
myself .objectSubId = 0 ;
116
113
117
- /* dependency on conversion procedure */
114
+ /* create dependency on conversion procedure */
118
115
referenced .classId = RelOid_pg_proc ;
119
116
referenced .objectId = conproc ;
120
117
referenced .objectSubId = 0 ;
@@ -126,79 +123,46 @@ ConversionCreate(const char *conname, Oid connamespace,
126
123
return oid ;
127
124
}
128
125
129
- /* ----------------
126
+ /*
130
127
* ConversionDrop
131
128
*
132
- * Drop a conversion and do dependency check.
133
- * ---------------
129
+ * Drop a conversion after doing permission checks.
134
130
*/
135
131
void
136
- ConversionDrop (const char * conname , Oid connamespace ,
137
- int32 conowner , DropBehavior behavior )
132
+ ConversionDrop (Oid conversionOid , DropBehavior behavior )
138
133
{
139
- Relation rel ;
140
- TupleDesc tupDesc ;
141
134
HeapTuple tuple ;
142
- HeapScanDesc scan ;
143
- ScanKeyData scanKeyData ;
144
- Form_pg_conversion body ;
145
135
ObjectAddress object ;
146
- Oid myoid ;
147
-
148
- /* sanity checks */
149
- if (!conname )
150
- elog (ERROR , "no conversion name supplied" );
151
-
152
- ScanKeyEntryInitialize (& scanKeyData ,
153
- 0 ,
154
- Anum_pg_conversion_connamespace ,
155
- F_OIDEQ ,
156
- ObjectIdGetDatum (connamespace ));
157
-
158
- /* open pg_conversion */
159
- rel = heap_openr (ConversionRelationName , AccessShareLock );
160
- tupDesc = rel -> rd_att ;
161
-
162
- scan = heap_beginscan (rel , SnapshotNow ,
163
- 1 , & scanKeyData );
164
-
165
- /* search for the target tuple */
166
- while (HeapTupleIsValid (tuple = heap_getnext (scan , ForwardScanDirection )))
167
- {
168
- body = (Form_pg_conversion ) GETSTRUCT (tuple );
169
- if (!strncmp (NameStr (body -> conname ), conname , NAMEDATALEN ))
170
- break ;
171
- }
172
136
137
+ tuple = SearchSysCache (CONOID ,
138
+ ObjectIdGetDatum (conversionOid ),
139
+ 0 , 0 , 0 );
173
140
if (!HeapTupleIsValid (tuple ))
174
- {
175
- elog (ERROR , "conversion %s not found" , conname );
176
- return ;
177
- }
141
+ elog (ERROR , "Conversion %u search from syscache failed" ,
142
+ conversionOid );
178
143
179
- if (!superuser () && ((Form_pg_conversion ) GETSTRUCT (tuple ))-> conowner != GetUserId ())
144
+ if (!superuser () &&
145
+ ((Form_pg_conversion ) GETSTRUCT (tuple ))-> conowner != GetUserId ())
180
146
elog (ERROR , "permission denied" );
181
147
182
- myoid = HeapTupleGetOid (tuple );
183
- heap_endscan (scan );
184
- heap_close (rel , AccessShareLock );
148
+ ReleaseSysCache (tuple );
185
149
186
150
/*
187
151
* Do the deletion
188
152
*/
189
153
object .classId = get_system_catalog_relid (ConversionRelationName );
190
- object .objectId = myoid ;
154
+ object .objectId = conversionOid ;
191
155
object .objectSubId = 0 ;
192
156
193
157
performDeletion (& object , behavior );
194
158
}
195
159
196
- /* ----------------
160
+ /*
197
161
* RemoveConversionById
198
162
*
199
- * Remove a tuple from pg_conversion by Oid. This function is soley
163
+ * Remove a tuple from pg_conversion by Oid. This function is solely
200
164
* called inside catalog/dependency.c
201
- * --------------- * /
165
+ */
202
166
void
203
167
RemoveConversionById (Oid conversionOid )
204
168
{
@@ -230,26 +194,24 @@ RemoveConversionById(Oid conversionOid)
230
194
heap_close (rel , RowExclusiveLock );
231
195
}
232
196
233
- /* ----------------
197
+ /*
234
198
* FindDefaultConversion
235
199
*
236
- * Find "default" conversion proc by for_encoding and to_encoding in this name space.
237
- * If found, returns the procedure's oid, otherwise InvalidOid.
238
- * ---------------
200
+ * Find "default" conversion proc by for_encoding and to_encoding in the
201
+ * given namespace.
202
+ *
203
+ * If found, returns the procedure's oid, otherwise InvalidOid. Note that
204
+ * you get the procedure's OID not the conversion's OID!
239
205
*/
240
206
Oid
241
- FindDefaultConversion (Oid name_space , int4 for_encoding , int4 to_encoding )
207
+ FindDefaultConversion (Oid name_space , int32 for_encoding , int32 to_encoding )
242
208
{
243
209
CatCList * catlist ;
244
210
HeapTuple tuple ;
245
211
Form_pg_conversion body ;
246
212
Oid proc = InvalidOid ;
247
213
int i ;
248
214
249
- /* Check we have usage rights in target namespace */
250
- if (pg_namespace_aclcheck (name_space , GetUserId (), ACL_USAGE ) != ACLCHECK_OK )
251
- return proc ;
252
-
253
215
catlist = SearchSysCacheList (CONDEFAULT , 3 ,
254
216
ObjectIdGetDatum (name_space ),
255
217
Int32GetDatum (for_encoding ),
@@ -260,7 +222,7 @@ FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding)
260
222
{
261
223
tuple = & catlist -> members [i ]-> tuple ;
262
224
body = (Form_pg_conversion ) GETSTRUCT (tuple );
263
- if (body -> condefault == TRUE )
225
+ if (body -> condefault )
264
226
{
265
227
proc = body -> conproc ;
266
228
break ;
@@ -270,12 +232,11 @@ FindDefaultConversion(Oid name_space, int4 for_encoding, int4 to_encoding)
270
232
return proc ;
271
233
}
272
234
273
- /* ----------------
274
- * FindConversionByName
235
+ /*
236
+ * FindConversion
275
237
*
276
238
* Find conversion by namespace and conversion name.
277
- * Returns conversion oid.
278
- * ---------------
239
+ * Returns conversion OID.
279
240
*/
280
241
Oid
281
242
FindConversion (const char * conname , Oid connamespace )
@@ -286,13 +247,13 @@ FindConversion(const char *conname, Oid connamespace)
286
247
AclResult aclresult ;
287
248
288
249
/* search pg_conversion by connamespace and conversion name */
289
- tuple = SearchSysCache (CONNAMESP ,
250
+ tuple = SearchSysCache (CONNAMENSP ,
290
251
PointerGetDatum (conname ),
291
252
ObjectIdGetDatum (connamespace ),
292
253
0 , 0 );
293
-
294
254
if (!HeapTupleIsValid (tuple ))
295
255
return InvalidOid ;
256
+
296
257
procoid = ((Form_pg_conversion ) GETSTRUCT (tuple ))-> conproc ;
297
258
conoid = HeapTupleGetOid (tuple );
298
259
0 commit comments