5
5
import java .util .*;
6
6
import org .postgresql .core .BaseStatement ;
7
7
import org .postgresql .core .Field ;
8
+ import org .postgresql .core .Encoding ;
8
9
import org .postgresql .util .PSQLException ;
9
10
import org .postgresql .util .PSQLState ;
10
11
import org .postgresql .Driver ;
@@ -22,6 +23,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
22
23
"vacuum,verbose,version" ;
23
24
24
25
protected AbstractJdbc1Connection connection ;// The connection association
26
+ protected Encoding encoding ;
25
27
26
28
// These define various OID's. Hopefully they will stay constant.
27
29
protected static final int iVarcharOid =1043 ;// OID for varchar
@@ -73,6 +75,13 @@ protected int getMaxNameLength() throws SQLException {
73
75
public AbstractJdbc1DatabaseMetaData (AbstractJdbc1Connection conn )
74
76
{
75
77
this .connection =conn ;
78
+ try {
79
+ this .encoding =conn .getEncoding ();
80
+ }
81
+ catch (SQLException sqle ) {
82
+ this .encoding =Encoding .defaultEncoding ();
83
+ }
84
+
76
85
}
77
86
78
87
/*
@@ -1858,15 +1867,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
1858
1867
tuple [0 ] =null ;
1859
1868
tuple [1 ] =schema ;
1860
1869
tuple [2 ] =procedureName ;
1861
- tuple [3 ] ="returnValue" . getBytes ( );
1862
- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnReturn ). getBytes ( );
1863
- tuple [5 ] =Integer .toString (connection .getSQLType (returnType )). getBytes ( );
1864
- tuple [6 ] =connection .getPGType (returnType ). getBytes ( );
1870
+ tuple [3 ] =encoding . encode ( "returnValue" );
1871
+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnReturn ));
1872
+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (returnType )));
1873
+ tuple [6 ] =encoding . encode ( connection .getPGType (returnType ));
1865
1874
tuple [7 ] =null ;
1866
1875
tuple [8 ] =null ;
1867
1876
tuple [9 ] =null ;
1868
1877
tuple [10 ] =null ;
1869
- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1878
+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
1870
1879
tuple [12 ] =null ;
1871
1880
v .addElement (tuple );
1872
1881
}
@@ -1878,15 +1887,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
1878
1887
tuple [0 ] =null ;
1879
1888
tuple [1 ] =schema ;
1880
1889
tuple [2 ] =procedureName ;
1881
- tuple [3 ] = ("$" +(i +1 )). getBytes ( );
1882
- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnIn ). getBytes ( );
1883
- tuple [5 ] =Integer .toString (connection .getSQLType (argOid )). getBytes ( );
1884
- tuple [6 ] =connection .getPGType (argOid ). getBytes ( );
1890
+ tuple [3 ] =encoding . encode ("$" +(i +1 ));
1891
+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnIn ));
1892
+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (argOid )));
1893
+ tuple [6 ] =encoding . encode ( connection .getPGType (argOid ));
1885
1894
tuple [7 ] =null ;
1886
1895
tuple [8 ] =null ;
1887
1896
tuple [9 ] =null ;
1888
1897
tuple [10 ] =null ;
1889
- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1898
+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
1890
1899
tuple [12 ] =null ;
1891
1900
v .addElement (tuple );
1892
1901
}
@@ -1901,15 +1910,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
1901
1910
tuple [0 ] =null ;
1902
1911
tuple [1 ] =schema ;
1903
1912
tuple [2 ] =procedureName ;
1904
- tuple [3 ] =columnrs .getString ("attname" ). getBytes ( );
1905
- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnResult ). getBytes ( );
1906
- tuple [5 ] =Integer .toString (connection .getSQLType (columnTypeOid )). getBytes ( );
1907
- tuple [6 ] =connection .getPGType (columnTypeOid ). getBytes ( );
1913
+ tuple [3 ] =columnrs .getBytes ("attname" );
1914
+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnResult ));
1915
+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (columnTypeOid )));
1916
+ tuple [6 ] =encoding . encode ( connection .getPGType (columnTypeOid ));
1908
1917
tuple [7 ] =null ;
1909
1918
tuple [8 ] =null ;
1910
1919
tuple [9 ] =null ;
1911
1920
tuple [10 ] =null ;
1912
- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1921
+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
1913
1922
tuple [12 ] =null ;
1914
1923
v .addElement (tuple );
1915
1924
}
@@ -2205,7 +2214,7 @@ public java.sql.ResultSet getTableTypes() throws SQLException
2205
2214
for (i =0 ;i <types .length ;i ++)
2206
2215
{
2207
2216
byte [][]tuple =new byte [1 ][];
2208
- tuple [0 ] =types [i ]. getBytes ( );
2217
+ tuple [0 ] =encoding . encode ( types [i ]);
2209
2218
v .addElement (tuple );
2210
2219
}
2211
2220
@@ -2338,46 +2347,46 @@ public java.sql.ResultSet getColumns(String catalog, String schemaPattern, Strin
2338
2347
tuple [1 ] =rs .getBytes ("nspname" );// Schema
2339
2348
tuple [2 ] =rs .getBytes ("relname" );// Table name
2340
2349
tuple [3 ] =rs .getBytes ("attname" );// Column name
2341
- tuple [4 ] =Integer .toString (connection .getSQLType (typeOid )). getBytes ( );
2350
+ tuple [4 ] =encoding . encode ( Integer .toString (connection .getSQLType (typeOid )));
2342
2351
String pgType =connection .getPGType (typeOid );
2343
- tuple [5 ] =pgType . getBytes (); // Type name
2352
+ tuple [5 ] =encoding . encode ( pgType ); // Type name
2344
2353
2345
2354
// by default no decimal_digits
2346
2355
// if the type is numeric or decimal we will
2347
2356
// overwrite later.
2348
- tuple [8 ] ="0" . getBytes ( );
2357
+ tuple [8 ] =encoding . encode ( "0" );
2349
2358
2350
2359
if (pgType .equals ("bpchar" ) ||pgType .equals ("varchar" ))
2351
2360
{
2352
2361
int atttypmod =rs .getInt ("atttypmod" );
2353
- tuple [6 ] =Integer .toString (atttypmod != -1 ?atttypmod -VARHDRSZ :0 ). getBytes ( );
2362
+ tuple [6 ] =encoding . encode ( Integer .toString (atttypmod != -1 ?atttypmod -VARHDRSZ :0 ));
2354
2363
}
2355
2364
else if (pgType .equals ("numeric" ) ||pgType .equals ("decimal" ))
2356
2365
{
2357
2366
int attypmod =rs .getInt ("atttypmod" ) -VARHDRSZ ;
2358
- tuple [6 ] =Integer .toString ( (attypmod >>16 ) &0xffff ). getBytes ( );
2359
- tuple [8 ] =Integer .toString (attypmod &0xffff ). getBytes ( );
2360
- tuple [9 ] ="10" . getBytes ( );
2367
+ tuple [6 ] =encoding . encode ( Integer .toString ( (attypmod >>16 ) &0xffff ));
2368
+ tuple [8 ] =encoding . encode ( Integer .toString (attypmod &0xffff ));
2369
+ tuple [9 ] =encoding . encode ( "10" );
2361
2370
}
2362
2371
else if (pgType .equals ("bit" ) ||pgType .equals ("varbit" )) {
2363
2372
tuple [6 ] =rs .getBytes ("atttypmod" );
2364
- tuple [9 ] ="2" . getBytes ( );
2373
+ tuple [9 ] =encoding . encode ( "2" );
2365
2374
}
2366
2375
else {
2367
2376
tuple [6 ] =rs .getBytes ("attlen" );
2368
- tuple [9 ] ="10" . getBytes ( );
2377
+ tuple [9 ] =encoding . encode ( "10" );
2369
2378
}
2370
2379
2371
2380
tuple [7 ] =null ;// Buffer length
2372
2381
2373
- tuple [10 ] =Integer .toString (rs .getBoolean ("attnotnull" ) ?java .sql .DatabaseMetaData .columnNoNulls :java .sql .DatabaseMetaData .columnNullable ). getBytes ( );// Nullable
2382
+ tuple [10 ] =encoding . encode ( Integer .toString (rs .getBoolean ("attnotnull" ) ?java .sql .DatabaseMetaData .columnNoNulls :java .sql .DatabaseMetaData .columnNullable ));// Nullable
2374
2383
tuple [11 ] =rs .getBytes ("description" );// Description (if any)
2375
2384
tuple [12 ] =rs .getBytes ("adsrc" );// Column default
2376
2385
tuple [13 ] =null ;// sql data type (unused)
2377
2386
tuple [14 ] =null ;// sql datetime sub (unused)
2378
2387
tuple [15 ] =tuple [6 ];// char octet length
2379
2388
tuple [16 ] =rs .getBytes ("attnum" );// ordinal position
2380
- tuple [17 ] = (rs .getBoolean ("attnotnull" ) ?"NO" :"YES" ). getBytes ( );// Is nullable
2389
+ tuple [17 ] =encoding . encode (rs .getBoolean ("attnotnull" ) ?"NO" :"YES" );// Is nullable
2381
2390
2382
2391
v .addElement (tuple );
2383
2392
}
@@ -2476,7 +2485,7 @@ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, Str
2476
2485
}
2477
2486
sortStringArray (permNames );
2478
2487
for (i =0 ;i <permNames .length ;i ++) {
2479
- byte []privilege =permNames [i ]. getBytes ( );
2488
+ byte []privilege =encoding . encode ( permNames [i ]);
2480
2489
Vector grantees = (Vector )permissions .get (permNames [i ]);
2481
2490
for (int j =0 ;j <grantees .size ();j ++) {
2482
2491
String grantee = (String )grantees .elementAt (j );
@@ -2486,10 +2495,10 @@ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, Str
2486
2495
tuple [1 ] =schemaName ;
2487
2496
tuple [2 ] =tableName ;
2488
2497
tuple [3 ] =column ;
2489
- tuple [4 ] =owner . getBytes ( );
2490
- tuple [5 ] =grantee . getBytes ( );
2498
+ tuple [4 ] =encoding . encode ( owner );
2499
+ tuple [5 ] =encoding . encode ( grantee );
2491
2500
tuple [6 ] =privilege ;
2492
- tuple [7 ] =grantable . getBytes ( );
2501
+ tuple [7 ] =encoding . encode ( grantable );
2493
2502
v .addElement (tuple );
2494
2503
}
2495
2504
}
@@ -2579,7 +2588,7 @@ public java.sql.ResultSet getTablePrivileges(String catalog, String schemaPatter
2579
2588
}
2580
2589
sortStringArray (permNames );
2581
2590
for (i =0 ;i <permNames .length ;i ++) {
2582
- byte []privilege =permNames [i ]. getBytes ( );
2591
+ byte []privilege =encoding . encode ( permNames [i ]);
2583
2592
Vector grantees = (Vector )permissions .get (permNames [i ]);
2584
2593
for (int j =0 ;j <grantees .size ();j ++) {
2585
2594
String grantee = (String )grantees .elementAt (j );
@@ -2588,10 +2597,10 @@ public java.sql.ResultSet getTablePrivileges(String catalog, String schemaPatter
2588
2597
tuple [0 ] =null ;
2589
2598
tuple [1 ] =schema ;
2590
2599
tuple [2 ] =table ;
2591
- tuple [3 ] =owner . getBytes ( );
2592
- tuple [4 ] =grantee . getBytes ( );
2600
+ tuple [3 ] =encoding . encode ( owner );
2601
+ tuple [4 ] =encoding . encode ( grantee );
2593
2602
tuple [5 ] =privilege ;
2594
- tuple [6 ] =grantable . getBytes ( );
2603
+ tuple [6 ] =encoding . encode ( grantable );
2595
2604
v .addElement (tuple );
2596
2605
}
2597
2606
}
@@ -2785,14 +2794,14 @@ public java.sql.ResultSet getBestRowIdentifier(String catalog, String schema, St
2785
2794
while (rs .next ()) {
2786
2795
byte tuple [][] =new byte [8 ][];
2787
2796
int columnTypeOid =rs .getInt ("atttypid" );
2788
- tuple [0 ] =Integer .toString (scope ). getBytes ( );
2797
+ tuple [0 ] =encoding . encode ( Integer .toString (scope ));
2789
2798
tuple [1 ] =rs .getBytes ("attname" );
2790
- tuple [2 ] =Integer .toString (connection .getSQLType (columnTypeOid )). getBytes ( );
2791
- tuple [3 ] =connection .getPGType (columnTypeOid ). getBytes ( );
2799
+ tuple [2 ] =encoding . encode ( Integer .toString (connection .getSQLType (columnTypeOid )));
2800
+ tuple [3 ] =encoding . encode ( connection .getPGType (columnTypeOid ));
2792
2801
tuple [4 ] =null ;
2793
2802
tuple [5 ] =null ;
2794
2803
tuple [6 ] =null ;
2795
- tuple [7 ] =Integer .toString (java .sql .DatabaseMetaData .bestRowNotPseudo ). getBytes ( );
2804
+ tuple [7 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .bestRowNotPseudo ));
2796
2805
v .addElement (tuple );
2797
2806
}
2798
2807
@@ -2854,13 +2863,13 @@ public java.sql.ResultSet getVersionColumns(String catalog, String schema, Strin
2854
2863
*/
2855
2864
2856
2865
tuple [0 ] =null ;
2857
- tuple [1 ] ="ctid" . getBytes ( );
2858
- tuple [2 ] =Integer .toString (connection .getSQLType ("tid" )). getBytes ( );
2859
- tuple [3 ] ="tid" . getBytes ( );
2866
+ tuple [1 ] =encoding . encode ( "ctid" );
2867
+ tuple [2 ] =encoding . encode ( Integer .toString (connection .getSQLType ("tid" )));
2868
+ tuple [3 ] =encoding . encode ( "tid" );
2860
2869
tuple [4 ] =null ;
2861
2870
tuple [5 ] =null ;
2862
2871
tuple [6 ] =null ;
2863
- tuple [7 ] =Integer .toString (java .sql .DatabaseMetaData .versionColumnPseudo ). getBytes ( );
2872
+ tuple [7 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .versionColumnPseudo ));
2864
2873
v .addElement (tuple );
2865
2874
2866
2875
/* Perhaps we should check that the given
@@ -3157,7 +3166,7 @@ else if ("setdefault".equals(rule))
3157
3166
else if ("restrict" .equals (rule ))
3158
3167
action =java .sql .DatabaseMetaData .importedKeyRestrict ;
3159
3168
3160
- tuple [9 ] =Integer .toString (action ). getBytes ( );
3169
+ tuple [9 ] =encoding . encode ( Integer .toString (action ));
3161
3170
3162
3171
}
3163
3172
@@ -3177,7 +3186,7 @@ else if ("setdefault".equals(rule))
3177
3186
action =java .sql .DatabaseMetaData .importedKeySetDefault ;
3178
3187
else if ("restrict" .equals (rule ))
3179
3188
action =java .sql .DatabaseMetaData .importedKeyRestrict ;
3180
- tuple [10 ] =Integer .toString (action ). getBytes ( );
3189
+ tuple [10 ] =encoding . encode ( Integer .toString (action ));
3181
3190
}
3182
3191
3183
3192
@@ -3217,11 +3226,11 @@ else if ("restrict".equals(rule))
3217
3226
pkeyColumn = (String )tokens .elementAt (element );
3218
3227
}
3219
3228
3220
- tuple [3 ] =pkeyColumn . getBytes ( );//PKCOLUMN_NAME
3221
- tuple [7 ] =fkeyColumn . getBytes ( );//FKCOLUMN_NAME
3229
+ tuple [3 ] =encoding . encode ( pkeyColumn );//PKCOLUMN_NAME
3230
+ tuple [7 ] =encoding . encode ( fkeyColumn );//FKCOLUMN_NAME
3222
3231
3223
3232
tuple [8 ] =rs .getBytes (6 );//KEY_SEQ
3224
- tuple [11 ] =fkName . getBytes ( );//FK_NAME this will give us a unique name for the foreign key
3233
+ tuple [11 ] =encoding . encode ( fkName );//FK_NAME this will give us a unique name for the foreign key
3225
3234
tuple [12 ] =rs .getBytes (7 );//PK_NAME
3226
3235
3227
3236
// DEFERRABILITY
@@ -3235,7 +3244,7 @@ else if ("restrict".equals(rule))
3235
3244
else
3236
3245
deferrability =java .sql .DatabaseMetaData .importedKeyInitiallyImmediate ;
3237
3246
}
3238
- tuple [13 ] =Integer .toString (deferrability ). getBytes ( );
3247
+ tuple [13 ] =encoding . encode ( Integer .toString (deferrability ));
3239
3248
3240
3249
tuples .addElement (tuple );
3241
3250
}
@@ -3498,18 +3507,18 @@ public java.sql.ResultSet getTypeInfo() throws SQLException
3498
3507
ResultSet rs =connection .createStatement ().executeQuery (sql );
3499
3508
// cache some results, this will keep memory useage down, and speed
3500
3509
// things up a little.
3501
- byte b9 [] ="9" . getBytes ( );
3502
- byte b10 [] ="10" . getBytes ( );
3503
- byte bf [] ="f" . getBytes ( );
3504
- byte bnn [] =Integer .toString (java .sql .DatabaseMetaData .typeNoNulls ). getBytes ( );
3505
- byte bts [] =Integer .toString (java .sql .DatabaseMetaData .typeSearchable ). getBytes ( );
3510
+ byte b9 [] =encoding . encode ( "9" );
3511
+ byte b10 [] =encoding . encode ( "10" );
3512
+ byte bf [] =encoding . encode ( "f" );
3513
+ byte bnn [] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .typeNoNulls ));
3514
+ byte bts [] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .typeSearchable ));
3506
3515
3507
3516
while (rs .next ())
3508
3517
{
3509
3518
byte [][]tuple =new byte [18 ][];
3510
3519
String typname =rs .getString (1 );
3511
- tuple [0 ] =typname . getBytes ( );
3512
- tuple [1 ] =Integer .toString (connection .getSQLType (typname )). getBytes ( );
3520
+ tuple [0 ] =encoding . encode ( typname );
3521
+ tuple [1 ] =encoding . encode ( Integer .toString (connection .getSQLType (typname )));
3513
3522
tuple [2 ] =b9 ;// for now
3514
3523
tuple [6 ] =bnn ;// for now
3515
3524
tuple [7 ] =bf ;// false for now - not case sensitive