Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
b4d9dce8
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b4d9dce8
编写于
5月 22, 2018
作者:
S
serge-rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#2102 PostgreSQL: lazy data type loading
Former-commit-id:
aa43c9da
上级
1f82e3fa
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
154 addition
and
78 deletion
+154
-78
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java
...ql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java
+6
-0
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java
...beaver/ext/postgresql/edit/PostgreTableColumnManager.java
+3
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java
.../jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java
+14
-18
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
...jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
+2
-1
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java
...g/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java
+8
-13
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataTypeAttribute.java
...beaver/ext/postgresql/model/PostgreDataTypeAttribute.java
+3
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataTypeCache.java
...ss/dbeaver/ext/postgresql/model/PostgreDataTypeCache.java
+64
-4
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
...g/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
+31
-17
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java
...dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java
+3
-6
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreOperatorClass.java
...ss/dbeaver/ext/postgresql/model/PostgreOperatorClass.java
+2
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java
.../jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java
+7
-6
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java
...org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java
+2
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableColumn.java
...kiss/dbeaver/ext/postgresql/model/PostgreTableColumn.java
+2
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java
...r/ext/postgresql/model/data/PostgreArrayValueHandler.java
+1
-1
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/cache/JDBCObjectCache.java
.../jkiss/dbeaver/model/impl/jdbc/cache/JDBCObjectCache.java
+6
-2
未找到文件。
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java
浏览文件 @
b4d9dce8
...
...
@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import
org.jkiss.dbeaver.model.impl.AbstractObjectCache
;
import
org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction
;
import
org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistActionComment
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
...
...
@@ -127,6 +128,10 @@ public class PostgreUtils {
return
null
;
}
public
static
boolean
supportsTypeCategory
(
JDBCDataSource
dataSource
)
{
return
dataSource
.
isServerVersionAtLeast
(
8
,
4
);
}
@Nullable
public
static
<
OWNER
extends
DBSObject
,
OBJECT
extends
PostgreObject
>
OBJECT
getObjectById
(
@NotNull
DBRProgressMonitor
monitor
,
...
...
@@ -575,4 +580,5 @@ public class PostgreUtils {
}
}
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java
浏览文件 @
b4d9dce8
...
...
@@ -31,6 +31,7 @@ import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract;
import
org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction
;
import
org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.sql.SQLUtils
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
org.jkiss.dbeaver.ui.TextUtils
;
...
...
@@ -66,7 +67,7 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
return
;
}
}
final
PostgreDataType
rawType
=
dataType
.
getElementType
();
final
PostgreDataType
rawType
=
dataType
.
getElementType
(
new
VoidProgressMonitor
()
);
if
(
rawType
!=
null
)
{
sql
.
append
(
rawType
.
getTypeName
());
}
else
{
...
...
@@ -164,7 +165,7 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
protected
PostgreTableColumn
runTask
()
{
final
PostgreTableColumn
column
=
new
PostgreTableColumn
(
parent
);
column
.
setName
(
getNewColumnName
(
monitor
,
context
,
parent
));
final
PostgreDataType
dataType
=
parent
.
getDatabase
().
getDataType
(
PostgreOid
.
VARCHAR
);
final
PostgreDataType
dataType
=
parent
.
getDatabase
().
getDataType
(
monitor
,
PostgreOid
.
VARCHAR
);
column
.
setDataType
(
dataType
);
//$NON-NLS-1$
column
.
setOrdinalPosition
(-
1
);
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java
浏览文件 @
b4d9dce8
...
...
@@ -26,10 +26,13 @@ import org.jkiss.dbeaver.model.*;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.impl.DBPositiveNumberTransformer
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCDataType
;
import
org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableColumn
;
import
org.jkiss.dbeaver.model.meta.IPropertyValueListProvider
;
import
org.jkiss.dbeaver.model.meta.IPropertyValueTransformer
;
import
org.jkiss.dbeaver.model.meta.Property
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.DBSEntity
;
import
org.jkiss.dbeaver.model.struct.DBSTypedObjectEx
;
import
org.jkiss.utils.CommonUtils
;
...
...
@@ -66,12 +69,12 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
}
public
PostgreAttribute
(
OWNER
table
,
DBRProgressMonitor
monitor
,
OWNER
table
,
JDBCResultSet
dbResult
)
throws
DBException
{
super
(
table
,
true
);
loadInfo
(
dbResult
);
loadInfo
(
monitor
,
dbResult
);
}
@Override
...
...
@@ -85,7 +88,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
return
objectId
;
}
private
void
loadInfo
(
JDBCResultSet
dbResult
)
private
void
loadInfo
(
DBRProgressMonitor
monitor
,
JDBCResultSet
dbResult
)
throws
DBException
{
setName
(
JDBCUtils
.
safeGetString
(
dbResult
,
"attname"
));
...
...
@@ -93,16 +96,16 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
setRequired
(
JDBCUtils
.
safeGetBoolean
(
dbResult
,
"attnotnull"
));
objectId
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"attr_id"
);
final
long
typeId
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"atttypid"
);
dataType
=
getTable
().
getDatabase
().
getDataType
(
typeId
);
dataType
=
getTable
().
getDatabase
().
getDataType
(
monitor
,
typeId
);
if
(
dataType
==
null
)
{
log
.
error
(
"Attribute data type '"
+
typeId
+
"' not found. Use "
+
PostgreConstants
.
TYPE_VARCHAR
);
dataType
=
getTable
().
getDatabase
().
getDataType
(
PostgreConstants
.
TYPE_VARCHAR
);
dataType
=
getTable
().
getDatabase
().
getDataType
(
monitor
,
PostgreConstants
.
TYPE_VARCHAR
);
}
else
{
// TODO: [#2824] Perhaps we should just use type names declared in pg_catalog
// Replacing them with "convenient" types names migh cause some issues
if
(
false
&&
dataType
.
getCanonicalName
()
!=
null
&&
getDataSource
().
isServerVersionAtLeast
(
9
,
6
))
{
// se canonical type names. But only for PG >= 9.6 (because I can't test with earlier versions)
PostgreDataType
canonicalType
=
getTable
().
getDatabase
().
getDataType
(
dataType
.
getCanonicalName
());
PostgreDataType
canonicalType
=
getTable
().
getDatabase
().
getDataType
(
monitor
,
dataType
.
getCanonicalName
());
if
(
canonicalType
!=
null
)
{
this
.
dataType
=
canonicalType
;
}
...
...
@@ -204,7 +207,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
}
@Nullable
@Property
(
viewable
=
true
,
editable
=
true
,
updatable
=
false
,
order
=
24
)
@Property
(
viewable
=
true
,
editable
=
true
,
order
=
24
)
public
PostgreAttributeIdentity
getIdentity
()
{
return
identity
;
}
...
...
@@ -213,7 +216,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
this
.
identity
=
identity
;
}
@Property
(
viewable
=
false
,
order
=
25
)
@Property
(
order
=
25
)
public
boolean
isLocal
()
{
return
isLocal
;
}
...
...
@@ -283,15 +286,8 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
@Override
public
Object
[]
getPossibleValues
(
PostgreAttribute
column
)
{
Set
<
PostgreDataType
>
types
=
new
TreeSet
<>(
new
Comparator
<
PostgreDataType
>()
{
@Override
public
int
compare
(
PostgreDataType
o1
,
PostgreDataType
o2
)
{
return
o1
.
getTypeName
().
compareTo
(
o2
.
getTypeName
());
}
});
for
(
PostgreDataType
type
:
column
.
getDataSource
().
getLocalDataTypes
())
{
types
.
add
(
type
);
}
Set
<
PostgreDataType
>
types
=
new
TreeSet
<>(
Comparator
.
comparing
(
JDBCDataType:
:
getTypeName
));
types
.
addAll
(
column
.
getDataSource
().
getLocalDataTypes
());
return
types
.
toArray
(
new
PostgreDataType
[
types
.
size
()]);
}
}
...
...
@@ -300,7 +296,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
@Override
public
PostgreDataType
transform
(
PostgreAttribute
object
,
Object
value
)
{
if
(
value
instanceof
String
)
{
PostgreDataType
dataType
=
object
.
getDataSource
().
getDefaultInstance
().
getDataType
(
(
String
)
value
);
PostgreDataType
dataType
=
object
.
getDataSource
().
getDefaultInstance
().
getDataType
(
new
VoidProgressMonitor
(),
(
String
)
value
);
if
(
dataType
==
null
)
{
throw
new
IllegalArgumentException
(
"Bad data type name specified: "
+
value
);
}
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
浏览文件 @
b4d9dce8
...
...
@@ -42,6 +42,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectLookupCache;
import
org.jkiss.dbeaver.model.impl.sql.QueryTransformerLimit
;
import
org.jkiss.dbeaver.model.net.DBWHandlerConfiguration
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.*
;
import
org.jkiss.dbeaver.runtime.net.DefaultCallbackHandler
;
import
org.jkiss.dbeaver.tools.transfer.IDataTransferProducer
;
...
...
@@ -438,7 +439,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSObjectSelect
@Override
public
PostgreDataType
getLocalDataType
(
String
typeName
)
{
return
getDefaultInstance
().
getDataType
(
typeName
);
return
getDefaultInstance
().
getDataType
(
new
VoidProgressMonitor
(),
typeName
);
}
@Override
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java
浏览文件 @
b4d9dce8
...
...
@@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement
;
import
org.jkiss.dbeaver.model.impl.DBPositiveNumberTransformer
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache
;
...
...
@@ -277,7 +276,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
@Nullable
@Override
public
DBSDataType
getComponentType
(
@NotNull
DBRProgressMonitor
monitor
)
throws
DBException
{
return
getElementType
();
return
getElementType
(
monitor
);
}
@Nullable
...
...
@@ -302,13 +301,13 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
}
@Property
(
category
=
CAT_MAIN
,
viewable
=
true
,
order
=
12
)
public
PostgreDataType
getBaseType
()
{
return
resolveType
(
baseTypeId
);
public
PostgreDataType
getBaseType
(
DBRProgressMonitor
monitor
)
{
return
getDatabase
().
getDataType
(
monitor
,
baseTypeId
);
}
@Property
(
category
=
CAT_MAIN
,
viewable
=
true
,
order
=
13
)
public
PostgreDataType
getElementType
()
{
return
elementTypeId
==
0
?
null
:
resolveType
(
elementTypeId
);
public
PostgreDataType
getElementType
(
DBRProgressMonitor
monitor
)
{
return
elementTypeId
==
0
?
null
:
getDatabase
().
getDataType
(
monitor
,
elementTypeId
);
}
@Property
(
category
=
CAT_MAIN
,
order
=
15
)
...
...
@@ -397,8 +396,8 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
}
@Property
(
category
=
CAT_ARRAY
)
public
PostgreDataType
getArrayItemType
()
{
return
arrayItemTypeId
==
0
?
null
:
resolveType
(
arrayItemTypeId
);
public
PostgreDataType
getArrayItemType
(
DBRProgressMonitor
monitor
)
{
return
arrayItemTypeId
==
0
?
null
:
getDatabase
().
getDataType
(
monitor
,
arrayItemTypeId
);
}
// Plain type
...
...
@@ -415,10 +414,6 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
return
typeType
==
PostgreTypeType
.
c
&&
classId
>=
0
;
}
private
PostgreDataType
resolveType
(
long
typeId
)
{
return
getDatabase
().
getDataType
(
typeId
);
}
@NotNull
@Override
public
DBSEntityType
getEntityType
()
{
...
...
@@ -531,7 +526,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
@Override
protected
PostgreDataTypeAttribute
fetchObject
(
@NotNull
JDBCSession
session
,
@NotNull
PostgreDataType
postgreDataType
,
@NotNull
JDBCResultSet
resultSet
)
throws
SQLException
,
DBException
{
return
new
PostgreDataTypeAttribute
(
postgreDataType
,
resultSet
);
return
new
PostgreDataTypeAttribute
(
session
.
getProgressMonitor
(),
postgreDataType
,
resultSet
);
}
}
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataTypeAttribute.java
浏览文件 @
b4d9dce8
...
...
@@ -18,14 +18,15 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
/**
* PostgreDataTypeAttribute
*/
public
class
PostgreDataTypeAttribute
extends
PostgreAttribute
<
PostgreDataType
>
{
public
PostgreDataTypeAttribute
(
PostgreDataType
dataType
,
JDBCResultSet
dbResult
)
throws
DBException
{
super
(
dataType
,
dbResult
);
public
PostgreDataTypeAttribute
(
DBRProgressMonitor
monitor
,
PostgreDataType
dataType
,
JDBCResultSet
dbResult
)
throws
DBException
{
super
(
monitor
,
dataType
,
dbResult
);
}
@Override
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataTypeCache.java
浏览文件 @
b4d9dce8
...
...
@@ -19,11 +19,14 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import
org.jkiss.code.NotNull
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.ext.postgresql.PostgreConstants
;
import
org.jkiss.dbeaver.ext.postgresql.PostgreUtils
;
import
org.jkiss.dbeaver.model.DBUtils
;
import
org.jkiss.dbeaver.model.exec.DBCExecutionPurpose
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.utils.LongKeyMap
;
...
...
@@ -43,6 +46,11 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
setListOrderComparator
(
DBUtils
.
nameComparator
());
}
@Override
protected
String
getCacheName
()
{
return
"Data type cache"
;
}
@Override
protected
synchronized
void
loadObjects
(
DBRProgressMonitor
monitor
,
PostgreSchema
postgreSchema
)
throws
DBException
{
super
.
loadObjects
(
monitor
,
postgreSchema
);
...
...
@@ -103,10 +111,16 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
@Override
protected
JDBCStatement
prepareObjectsStatement
(
@NotNull
JDBCSession
session
,
@NotNull
PostgreSchema
owner
)
throws
SQLException
{
final
JDBCPreparedStatement
dbStat
=
session
.
prepareStatement
(
"SELECT t.oid,t.* \n"
+
"FROM pg_catalog.pg_type t WHERE typnamespace=?\n"
+
"ORDER by t.oid"
);
// Initially cache only base types (everything but composite and arrays)
StringBuilder
sql
=
new
StringBuilder
();
sql
.
append
(
"SELECT t.oid,t.* \n"
).
append
(
"FROM pg_catalog.pg_type t WHERE typnamespace=? "
);
if
(
PostgreUtils
.
supportsTypeCategory
(
session
.
getDataSource
()))
{
sql
.
append
(
"AND typcategory not in ('A','C')"
);
}
else
{
sql
.
append
(
"AND typtype <> 'c'"
);
}
sql
.
append
(
"\nORDER by t.oid"
);
final
JDBCPreparedStatement
dbStat
=
session
.
prepareStatement
(
sql
.
toString
());
dbStat
.
setLong
(
1
,
owner
.
getObjectId
());
return
dbStat
;
}
...
...
@@ -121,4 +135,50 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
return
dataTypeMap
.
get
(
oid
);
}
@NotNull
static
PostgreDataType
resolveDataType
(
@NotNull
DBRProgressMonitor
monitor
,
@NotNull
PostgreDatabase
database
,
long
oid
)
throws
SQLException
,
DBException
{
// Initially cache only base types (everything but composite and arrays)
try
(
JDBCSession
session
=
database
.
getDefaultContext
(
true
).
openSession
(
monitor
,
DBCExecutionPurpose
.
META
,
"Resolve data type by OID"
))
{
try
(
final
JDBCPreparedStatement
dbStat
=
session
.
prepareStatement
(
"SELECT t.oid,t.* FROM pg_catalog.pg_type t WHERE oid=? "
))
{
dbStat
.
setLong
(
1
,
oid
);
try
(
JDBCResultSet
dbResult
=
dbStat
.
executeQuery
())
{
if
(
dbResult
.
next
())
{
long
schemaOid
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"typnamespace"
);
PostgreSchema
schema
=
database
.
getSchema
(
monitor
,
schemaOid
);
if
(
schema
==
null
)
{
throw
new
DBException
(
"Schema "
+
schemaOid
+
" not found for data type "
+
oid
);
}
return
PostgreDataType
.
readDataType
(
session
,
schema
,
dbResult
);
}
else
{
throw
new
DBException
(
"Data type "
+
oid
+
" not found in database "
+
database
.
getName
());
}
}
}
//dbStat;
}
}
@NotNull
static
PostgreDataType
resolveDataType
(
@NotNull
DBRProgressMonitor
monitor
,
@NotNull
PostgreDatabase
database
,
String
name
)
throws
SQLException
,
DBException
{
// Initially cache only base types (everything but composite and arrays)
try
(
JDBCSession
session
=
database
.
getDefaultContext
(
true
).
openSession
(
monitor
,
DBCExecutionPurpose
.
META
,
"Resolve data type by name"
))
{
try
(
final
JDBCPreparedStatement
dbStat
=
session
.
prepareStatement
(
"SELECT t.oid,t.* FROM pg_catalog.pg_type t WHERE typname=? "
))
{
dbStat
.
setString
(
1
,
name
);
try
(
JDBCResultSet
dbResult
=
dbStat
.
executeQuery
())
{
if
(
dbResult
.
next
())
{
long
schemaOid
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"typnamespace"
);
PostgreSchema
schema
=
database
.
getSchema
(
monitor
,
schemaOid
);
if
(
schema
==
null
)
{
throw
new
DBException
(
"Schema "
+
schemaOid
+
" not found for data type "
+
name
);
}
return
PostgreDataType
.
readDataType
(
session
,
schema
,
dbResult
);
}
else
{
throw
new
DBException
(
"Data type "
+
name
+
" not found in database "
+
database
.
getName
());
}
}
}
//dbStat;
}
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
浏览文件 @
b4d9dce8
...
...
@@ -51,7 +51,6 @@ import java.sql.SQLException;
import
java.util.*
;
import
java.util.Map.Entry
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
/**
* PostgreDatabase
...
...
@@ -173,37 +172,37 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return
templateName
;
}
@Property
(
viewable
=
false
,
order
=
3
)
@Property
(
order
=
3
)
public
PostgreRole
getDBA
(
DBRProgressMonitor
monitor
)
throws
DBException
{
return
PostgreUtils
.
getObjectById
(
monitor
,
roleCache
,
this
,
ownerId
);
}
@Property
(
viewable
=
false
,
order
=
5
)
@Property
(
order
=
5
)
public
PostgreCharset
getDefaultEncoding
(
DBRProgressMonitor
monitor
)
throws
DBException
{
return
PostgreUtils
.
getObjectById
(
monitor
,
encodingCache
,
this
,
encodingId
);
}
@Property
(
viewable
=
false
,
order
=
10
)
@Property
(
order
=
10
)
public
String
getCollate
()
{
return
collate
;
}
@Property
(
viewable
=
false
,
order
=
11
)
@Property
(
order
=
11
)
public
String
getCtype
()
{
return
ctype
;
}
@Property
(
viewable
=
false
,
order
=
12
)
@Property
(
order
=
12
)
public
boolean
isTemplate
()
{
return
isTemplate
;
}
@Property
(
viewable
=
false
,
order
=
13
)
@Property
(
order
=
13
)
public
boolean
isAllowConnect
()
{
return
allowConnect
;
}
@Property
(
viewable
=
false
,
order
=
14
)
@Property
(
order
=
14
)
public
int
getConnectionLimit
()
{
return
connectionLimit
;
}
...
...
@@ -213,7 +212,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
@NotNull
@Override
public
DBCExecutionContext
getDefaultContext
(
boolean
meta
)
{
public
J
DBCExecutionContext
getDefaultContext
(
boolean
meta
)
{
return
dataSource
.
getDefaultContext
(
meta
);
}
...
...
@@ -287,7 +286,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return
tablespaceCache
.
getAllObjects
(
monitor
,
this
);
}
@Property
(
viewable
=
false
,
order
=
4
)
@Property
(
order
=
4
)
public
PostgreTablespace
getDefaultTablespace
(
DBRProgressMonitor
monitor
)
throws
DBException
{
return
PostgreUtils
.
getObjectById
(
monitor
,
tablespaceCache
,
this
,
tablespaceId
);
}
...
...
@@ -504,7 +503,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return
null
;
}
public
PostgreDataType
getDataType
(
long
typeId
)
{
public
PostgreDataType
getDataType
(
DBRProgressMonitor
monitor
,
long
typeId
)
{
if
(
typeId
<=
0
)
{
return
null
;
}
...
...
@@ -519,11 +518,18 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return
dataType
;
}
}
log
.
debug
(
"Data type '"
+
typeId
+
"' not found"
);
return
null
;
// Type not found. Let's resolve it
try
{
dataType
=
PostgreDataTypeCache
.
resolveDataType
(
monitor
,
this
,
typeId
);
dataType
.
getParentObject
().
dataTypeCache
.
cacheObject
(
dataType
);
return
dataType
;
}
catch
(
Exception
e
)
{
log
.
debug
(
"Can't resolve data type "
+
typeId
,
e
);
return
null
;
}
}
public
PostgreDataType
getDataType
(
String
typeName
)
{
public
PostgreDataType
getDataType
(
DBRProgressMonitor
monitor
,
String
typeName
)
{
if
(
typeName
.
endsWith
(
"[]"
))
{
// In some cases ResultSetMetadata returns it as []
typeName
=
"_"
+
typeName
.
substring
(
0
,
typeName
.
length
()
-
2
);
...
...
@@ -560,8 +566,16 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return
dataType
;
}
}
log
.
debug
(
"Data type '"
+
typeName
+
"' not found in database '"
+
getName
()
+
"'"
);
return
null
;
// Type not found. Let's resolve it
try
{
PostgreDataType
dataType
=
PostgreDataTypeCache
.
resolveDataType
(
monitor
,
this
,
typeName
);
dataType
.
getParentObject
().
dataTypeCache
.
cacheObject
(
dataType
);
return
dataType
;
}
catch
(
Exception
e
)
{
log
.
debug
(
"Can't resolve data type "
+
typeName
,
e
);
return
null
;
}
}
@Override
...
...
@@ -597,7 +611,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
// FIXME: maybe some better workaround?
if
(
PostgreConstants
.
EC_PERMISSION_DENIED
.
equals
(
error
.
getDatabaseState
()))
{
log
.
warn
(
error
);
setCache
(
Collections
.
<
PostgreRole
>
emptyList
());
setCache
(
Collections
.
emptyList
());
return
true
;
}
return
false
;
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java
浏览文件 @
b4d9dce8
...
...
@@ -21,6 +21,7 @@ import org.jkiss.dbeaver.DBException;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.ext.generic.model.GenericStructContainer
;
import
org.jkiss.dbeaver.ext.postgresql.PostgreConstants
;
import
org.jkiss.dbeaver.ext.postgresql.PostgreUtils
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement
;
...
...
@@ -56,14 +57,10 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache<GenericStruc
super
(
owner
);
}
private
boolean
supportsTypeCategory
()
{
return
owner
.
getDataSource
().
isServerVersionAtLeast
(
8
,
4
);
}
@Override
protected
JDBCStatement
prepareObjectsStatement
(
@NotNull
JDBCSession
session
,
@NotNull
GenericStructContainer
owner
)
throws
SQLException
{
boolean
supportsCategory
=
supportsTypeCategory
(
);
boolean
supportsCategory
=
PostgreUtils
.
supportsTypeCategory
(
session
.
getDataSource
()
);
return
session
.
prepareStatement
(
"SELECT t.oid as typid,tn.nspname typnsname,t.* \n"
+
"FROM pg_catalog.pg_type t , pg_catalog.pg_namespace tn\n"
+
...
...
@@ -75,7 +72,7 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache<GenericStruc
@Override
protected
JDBCDataType
fetchObject
(
@NotNull
JDBCSession
session
,
@NotNull
GenericStructContainer
owner
,
@NotNull
JDBCResultSet
dbResult
)
throws
SQLException
,
DBException
{
boolean
supportsTypeCategory
=
supportsTypeCategory
(
);
boolean
supportsTypeCategory
=
PostgreUtils
.
supportsTypeCategory
(
session
.
getDataSource
()
);
String
name
=
JDBCUtils
.
safeGetString
(
dbResult
,
"typname"
);
if
(
CommonUtils
.
isEmpty
(
name
))
{
return
null
;
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreOperatorClass.java
浏览文件 @
b4d9dce8
...
...
@@ -93,7 +93,7 @@ public class PostgreOperatorClass extends PostgreInformation {
@Property
(
viewable
=
true
,
order
=
6
)
public
PostgreDataType
getType
(
DBRProgressMonitor
monitor
)
{
return
accessMethod
.
getDatabase
().
getDataType
(
typeId
);
return
accessMethod
.
getDatabase
().
getDataType
(
monitor
,
typeId
);
}
@Property
(
viewable
=
true
,
order
=
7
)
...
...
@@ -106,7 +106,7 @@ public class PostgreOperatorClass extends PostgreInformation {
if
(
keyTypeId
==
0
)
{
return
getType
(
monitor
);
}
return
accessMethod
.
getDatabase
().
getDataType
(
keyTypeId
);
return
accessMethod
.
getDatabase
().
getDataType
(
monitor
,
keyTypeId
);
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java
浏览文件 @
b4d9dce8
...
...
@@ -105,14 +105,15 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
}
public
PostgreProcedure
(
DBRProgressMonitor
monitor
,
PostgreSchema
schema
,
ResultSet
dbResult
)
{
super
(
schema
,
true
);
loadInfo
(
dbResult
);
loadInfo
(
monitor
,
dbResult
);
}
private
void
loadInfo
(
ResultSet
dbResult
)
{
private
void
loadInfo
(
DBRProgressMonitor
monitor
,
ResultSet
dbResult
)
{
this
.
oid
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"oid"
);
setName
(
JDBCUtils
.
safeGetString
(
dbResult
,
"proname"
));
this
.
ownerId
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"proowner"
);
...
...
@@ -127,7 +128,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
for
(
int
i
=
0
;
i
<
allArgTypes
.
length
;
i
++)
{
Long
paramType
=
allArgTypes
[
i
];
final
PostgreDataType
dataType
=
container
.
getDatabase
().
getDataType
(
paramType
.
intValue
());
final
PostgreDataType
dataType
=
container
.
getDatabase
().
getDataType
(
monitor
,
paramType
.
intValue
());
if
(
dataType
==
null
)
{
log
.
warn
(
"Parameter data type ["
+
paramType
+
"] not found"
);
continue
;
...
...
@@ -156,7 +157,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
if
(!
ArrayUtils
.
isEmpty
(
inArgTypes
))
{
for
(
int
i
=
0
;
i
<
inArgTypes
.
length
;
i
++)
{
Long
paramType
=
inArgTypes
[
i
];
final
PostgreDataType
dataType
=
container
.
getDatabase
().
getDataType
(
paramType
.
intValue
());
final
PostgreDataType
dataType
=
container
.
getDatabase
().
getDataType
(
monitor
,
paramType
.
intValue
());
if
(
dataType
==
null
)
{
log
.
warn
(
"Parameter data type ["
+
paramType
+
"] not found"
);
continue
;
...
...
@@ -175,7 +176,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
{
final
long
varTypeId
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"provariadic"
);
if
(
varTypeId
!=
0
)
{
varArrayType
=
container
.
getDatabase
().
getDataType
(
varTypeId
);
varArrayType
=
container
.
getDatabase
().
getDataType
(
monitor
,
varTypeId
);
}
}
this
.
procTransform
=
JDBCUtils
.
safeGetString
(
dbResult
,
"protransform"
);
...
...
@@ -193,7 +194,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
{
final
long
retTypeId
=
JDBCUtils
.
safeGetLong
(
dbResult
,
"prorettype"
);
if
(
retTypeId
!=
0
)
{
returnType
=
container
.
getDatabase
().
getDataType
(
retTypeId
);
returnType
=
container
.
getDatabase
().
getDataType
(
monitor
,
retTypeId
);
}
}
this
.
procSrc
=
JDBCUtils
.
safeGetString
(
dbResult
,
"prosrc"
);
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java
浏览文件 @
b4d9dce8
...
...
@@ -518,7 +518,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
throws
SQLException
,
DBException
{
try
{
return
new
PostgreTableColumn
(
table
,
dbResult
);
return
new
PostgreTableColumn
(
session
.
getProgressMonitor
(),
table
,
dbResult
);
}
catch
(
DBException
e
)
{
log
.
warn
(
"Error reading attribute info"
,
e
);
return
null
;
...
...
@@ -804,7 +804,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
protected
PostgreProcedure
fetchObject
(
@NotNull
JDBCSession
session
,
@NotNull
PostgreSchema
owner
,
@NotNull
JDBCResultSet
dbResult
)
throws
SQLException
,
DBException
{
return
new
PostgreProcedure
(
owner
,
dbResult
);
return
new
PostgreProcedure
(
session
.
getProgressMonitor
(),
owner
,
dbResult
);
}
}
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableColumn.java
浏览文件 @
b4d9dce8
...
...
@@ -32,8 +32,8 @@ public class PostgreTableColumn extends PostgreAttribute<PostgreTableBase> imple
super
(
table
);
}
public
PostgreTableColumn
(
PostgreTableBase
table
,
JDBCResultSet
dbResult
)
throws
DBException
{
super
(
table
,
dbResult
);
public
PostgreTableColumn
(
DBRProgressMonitor
monitor
,
PostgreTableBase
table
,
JDBCResultSet
dbResult
)
throws
DBException
{
super
(
monitor
,
table
,
dbResult
);
}
@Override
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java
浏览文件 @
b4d9dce8
...
...
@@ -51,7 +51,7 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler {
PostgreDataType
itemType
=
null
;
final
PostgreDataType
arrayType
=
PostgreUtils
.
findDataType
((
PostgreDataSource
)
session
.
getDataSource
(),
type
);
if
(
arrayType
!=
null
)
{
itemType
=
arrayType
.
getElementType
();
itemType
=
arrayType
.
getElementType
(
session
.
getProgressMonitor
()
);
}
if
(
itemType
!=
null
)
{
if
(
className
.
equals
(
PostgreConstants
.
PG_OBJECT_CLASS
))
{
...
...
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/cache/JDBCObjectCache.java
浏览文件 @
b4d9dce8
...
...
@@ -97,7 +97,7 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
try
{
try
(
JDBCSession
session
=
DBUtils
.
openMetaSession
(
monitor
,
dataSource
,
"Load objects from "
+
owner
.
getName
()))
{
try
(
JDBCStatement
dbStat
=
prepareObjectsStatement
(
session
,
owner
))
{
monitor
.
subTask
(
"Load "
+
getC
lass
().
getSimpl
eName
());
monitor
.
subTask
(
"Load "
+
getC
ach
eName
());
dbStat
.
setFetchSize
(
DBConstants
.
METADATA_FETCH_SIZE
);
dbStat
.
executeStatement
();
JDBCResultSet
dbResult
=
dbStat
.
getResultSet
();
...
...
@@ -137,7 +137,7 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
Comparator
<
OBJECT
>
comparator
=
getListOrderComparator
();
if
(
comparator
!=
null
)
{
Collections
.
sort
(
tmpObjectList
,
comparator
);
tmpObjectList
.
sort
(
comparator
);
}
detectCaseSensitivity
(
owner
);
...
...
@@ -145,6 +145,10 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
this
.
invalidateObjects
(
monitor
,
owner
,
new
CacheIterator
());
}
protected
String
getCacheName
()
{
return
getClass
().
getSimpleName
();
}
// Can be implemented to provide custom cache error handler
protected
boolean
handleCacheReadError
(
DBException
error
)
{
return
false
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录