Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
c3b193a5
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c3b193a5
编写于
9月 23, 2007
作者:
T
Tom Lane
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Replace linear searches with binary searches in pg_dump's code to
lookup objects by OID. Per gripe from nikitathespider.
上级
aabb7000
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
84 addition
and
42 deletion
+84
-42
src/bin/pg_dump/common.c
src/bin/pg_dump/common.c
+84
-42
未找到文件。
src/bin/pg_dump/common.c
浏览文件 @
c3b193a5
...
...
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/common.c,v 1.9
7 2007/08/21 01:11:20
tgl Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/common.c,v 1.9
8 2007/09/23 23:39:36
tgl Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -41,7 +41,11 @@ static int numCatalogIds = 0;
/*
* These variables are static to avoid the notational cruft of having to pass
* them into findTableByOid() and friends.
* them into findTableByOid() and friends. For each of these arrays, we
* build a sorted-by-OID index array immediately after it's built, and then
* we use binary search in findTableByOid() and friends. (qsort'ing the base
* arrays themselves would be simpler, but it doesn't work because pg_dump.c
* may have already established pointers between items.)
*/
static
TableInfo
*
tblinfo
;
static
TypeInfo
*
typinfo
;
...
...
@@ -51,12 +55,18 @@ static int numTables;
static
int
numTypes
;
static
int
numFuncs
;
static
int
numOperators
;
static
DumpableObject
**
tblinfoindex
;
static
DumpableObject
**
typinfoindex
;
static
DumpableObject
**
funinfoindex
;
static
DumpableObject
**
oprinfoindex
;
static
void
flagInhTables
(
TableInfo
*
tbinfo
,
int
numTables
,
InhInfo
*
inhinfo
,
int
numInherits
);
static
void
flagInhAttrs
(
TableInfo
*
tbinfo
,
int
numTables
,
InhInfo
*
inhinfo
,
int
numInherits
);
static
DumpableObject
**
buildIndexArray
(
void
*
objArray
,
int
numObjs
,
Size
objSize
);
static
int
DOCatalogIdCompare
(
const
void
*
p1
,
const
void
*
p2
);
static
void
findParentsByOid
(
TableInfo
*
self
,
InhInfo
*
inhinfo
,
int
numInherits
);
...
...
@@ -104,11 +114,13 @@ getSchemaData(int *numTablesPtr)
if
(
g_verbose
)
write_msg
(
NULL
,
"reading user-defined functions
\n
"
);
funinfo
=
getFuncs
(
&
numFuncs
);
funinfoindex
=
buildIndexArray
(
funinfo
,
numFuncs
,
sizeof
(
FuncInfo
));
/* this must be after getFuncs */
if
(
g_verbose
)
write_msg
(
NULL
,
"reading user-defined types
\n
"
);
typinfo
=
getTypes
(
&
numTypes
);
typinfoindex
=
buildIndexArray
(
typinfo
,
numTypes
,
sizeof
(
TypeInfo
));
/* this must be after getFuncs, too */
if
(
g_verbose
)
...
...
@@ -122,6 +134,7 @@ getSchemaData(int *numTablesPtr)
if
(
g_verbose
)
write_msg
(
NULL
,
"reading user-defined operators
\n
"
);
oprinfo
=
getOperators
(
&
numOperators
);
oprinfoindex
=
buildIndexArray
(
oprinfo
,
numOperators
,
sizeof
(
OprInfo
));
if
(
g_verbose
)
write_msg
(
NULL
,
"reading user-defined operator classes
\n
"
);
...
...
@@ -154,6 +167,7 @@ getSchemaData(int *numTablesPtr)
if
(
g_verbose
)
write_msg
(
NULL
,
"reading user-defined tables
\n
"
);
tblinfo
=
getTables
(
&
numTables
);
tblinfoindex
=
buildIndexArray
(
tblinfo
,
numTables
,
sizeof
(
TableInfo
));
if
(
g_verbose
)
write_msg
(
NULL
,
"reading table inheritance information
\n
"
);
...
...
@@ -540,6 +554,70 @@ findObjectByCatalogId(CatalogId catalogId)
return
NULL
;
}
/*
* Find a DumpableObject by OID, in a pre-sorted array of one type of object
*
* Returns NULL for unknown OID
*/
static
DumpableObject
*
findObjectByOid
(
Oid
oid
,
DumpableObject
**
indexArray
,
int
numObjs
)
{
DumpableObject
**
low
;
DumpableObject
**
high
;
/*
* This is the same as findObjectByCatalogId except we assume we need
* not look at table OID because the objects are all the same type.
*
* We could use bsearch() here, but the notational cruft of calling
* bsearch is nearly as bad as doing it ourselves; and the generalized
* bsearch function is noticeably slower as well.
*/
if
(
numObjs
<=
0
)
return
NULL
;
low
=
indexArray
;
high
=
indexArray
+
(
numObjs
-
1
);
while
(
low
<=
high
)
{
DumpableObject
**
middle
;
int
difference
;
middle
=
low
+
(
high
-
low
)
/
2
;
difference
=
oidcmp
((
*
middle
)
->
catId
.
oid
,
oid
);
if
(
difference
==
0
)
return
*
middle
;
else
if
(
difference
<
0
)
low
=
middle
+
1
;
else
high
=
middle
-
1
;
}
return
NULL
;
}
/*
* Build an index array of DumpableObject pointers, sorted by OID
*/
static
DumpableObject
**
buildIndexArray
(
void
*
objArray
,
int
numObjs
,
Size
objSize
)
{
DumpableObject
**
ptrs
;
int
i
;
ptrs
=
(
DumpableObject
**
)
malloc
(
numObjs
*
sizeof
(
DumpableObject
*
));
for
(
i
=
0
;
i
<
numObjs
;
i
++
)
ptrs
[
i
]
=
(
DumpableObject
*
)
((
char
*
)
objArray
+
i
*
objSize
);
/* We can use DOCatalogIdCompare to sort since its first key is OID */
if
(
numObjs
>
1
)
qsort
((
void
*
)
ptrs
,
numObjs
,
sizeof
(
DumpableObject
*
),
DOCatalogIdCompare
);
return
ptrs
;
}
/*
* qsort comparator for pointers to DumpableObjects
*/
static
int
DOCatalogIdCompare
(
const
void
*
p1
,
const
void
*
p2
)
{
...
...
@@ -630,80 +708,44 @@ removeObjectDependency(DumpableObject *dobj, DumpId refId)
* findTableByOid
* finds the entry (in tblinfo) of the table with the given oid
* returns NULL if not found
*
* NOTE: should hash this, but just do linear search for now
*/
TableInfo
*
findTableByOid
(
Oid
oid
)
{
int
i
;
for
(
i
=
0
;
i
<
numTables
;
i
++
)
{
if
(
tblinfo
[
i
].
dobj
.
catId
.
oid
==
oid
)
return
&
tblinfo
[
i
];
}
return
NULL
;
return
(
TableInfo
*
)
findObjectByOid
(
oid
,
tblinfoindex
,
numTables
);
}
/*
* findTypeByOid
* finds the entry (in typinfo) of the type with the given oid
* returns NULL if not found
*
* NOTE: should hash this, but just do linear search for now
*/
TypeInfo
*
findTypeByOid
(
Oid
oid
)
{
int
i
;
for
(
i
=
0
;
i
<
numTypes
;
i
++
)
{
if
(
typinfo
[
i
].
dobj
.
catId
.
oid
==
oid
)
return
&
typinfo
[
i
];
}
return
NULL
;
return
(
TypeInfo
*
)
findObjectByOid
(
oid
,
typinfoindex
,
numTypes
);
}
/*
* findFuncByOid
* finds the entry (in funinfo) of the function with the given oid
* returns NULL if not found
*
* NOTE: should hash this, but just do linear search for now
*/
FuncInfo
*
findFuncByOid
(
Oid
oid
)
{
int
i
;
for
(
i
=
0
;
i
<
numFuncs
;
i
++
)
{
if
(
funinfo
[
i
].
dobj
.
catId
.
oid
==
oid
)
return
&
funinfo
[
i
];
}
return
NULL
;
return
(
FuncInfo
*
)
findObjectByOid
(
oid
,
funinfoindex
,
numFuncs
);
}
/*
* findOprByOid
* finds the entry (in oprinfo) of the operator with the given oid
* returns NULL if not found
*
* NOTE: should hash this, but just do linear search for now
*/
OprInfo
*
findOprByOid
(
Oid
oid
)
{
int
i
;
for
(
i
=
0
;
i
<
numOperators
;
i
++
)
{
if
(
oprinfo
[
i
].
dobj
.
catId
.
oid
==
oid
)
return
&
oprinfo
[
i
];
}
return
NULL
;
return
(
OprInfo
*
)
findObjectByOid
(
oid
,
oprinfoindex
,
numOperators
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录