]>
git.saurik.com Git - apt.git/blob - cmdline/apt-cache.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: apt-cache.cc,v 1.37 1999/07/15 03:15:49 jgg Exp $
4 /* ######################################################################
6 apt-cache - Manages the cache files
8 apt-cache provides some functions fo manipulating the cache files.
9 It uses the command line interface common to all the APT tools. The
10 only really usefull function right now is dumpavail which is used
11 by the dselect method. Everything else is meant as a debug aide.
13 Returns 100 on failure, 0 on success.
15 ##################################################################### */
17 // Include Files /*{{{*/
18 #include <apt-pkg/error.h>
19 #include <apt-pkg/pkgcachegen.h>
20 #include <apt-pkg/deblistparser.h>
21 #include <apt-pkg/init.h>
22 #include <apt-pkg/progress.h>
23 #include <apt-pkg/sourcelist.h>
24 #include <apt-pkg/cmndline.h>
25 #include <apt-pkg/strutl.h>
26 #include <apt-pkg/pkgrecords.h>
37 // UnMet - Show unmet dependencies /*{{{*/
38 // ---------------------------------------------------------------------
40 bool UnMet(CommandLine
&CmdL
)
42 pkgCache
&Cache
= *GCache
;
43 bool Important
= _config
->FindB("APT::Cache::Important",false);
45 for (pkgCache::PkgIterator P
= Cache
.PkgBegin(); P
.end() == false; P
++)
47 for (pkgCache::VerIterator V
= P
.VersionList(); V
.end() == false; V
++)
50 for (pkgCache::DepIterator D
= V
.DependsList(); D
.end() == false;)
53 pkgCache::DepIterator Start
;
54 pkgCache::DepIterator End
;
57 /* cout << "s: Check " << Start.TargetPkg().Name() << ',' <<
58 End.TargetPkg().Name() << endl;*/
60 // Skip conflicts and replaces
61 if (End
->Type
!= pkgCache::Dep::PreDepends
&&
62 End
->Type
!= pkgCache::Dep::Depends
&&
63 End
->Type
!= pkgCache::Dep::Suggests
&&
64 End
->Type
!= pkgCache::Dep::Recommends
)
67 // Important deps only
68 if (Important
== true)
69 if (End
->Type
!= pkgCache::Dep::PreDepends
&&
70 End
->Type
!= pkgCache::Dep::Depends
)
73 // Verify the or group
75 pkgCache::DepIterator RealStart
= Start
;
78 // See if this dep is Ok
79 pkgCache::Version
**VList
= Start
.AllTargets();
100 cout
<< "Package " << P
.Name() << " version " <<
101 V
.VerStr() << " has an unmet dep:" << endl
;
104 // Print out the dep type
105 cout
<< " " << End
.DepType() << ": ";
111 cout
<< Start
.TargetPkg().Name();
112 if (Start
.TargetVer() != 0)
113 cout
<< " (" << Start
.CompType() << " " << Start
.TargetVer() <<
129 // DumpPackage - Show a dump of a package record /*{{{*/
130 // ---------------------------------------------------------------------
132 bool DumpPackage(CommandLine
&CmdL
)
134 pkgCache
&Cache
= *GCache
;
135 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++)
137 pkgCache::PkgIterator Pkg
= Cache
.FindPkg(*I
);
138 if (Pkg
.end() == true)
140 _error
->Warning("Unable to locate package %s",*I
);
144 cout
<< "Package: " << Pkg
.Name() << endl
;
145 cout
<< "Versions: ";
146 for (pkgCache::VerIterator Cur
= Pkg
.VersionList(); Cur
.end() != true; Cur
++)
148 cout
<< Cur
.VerStr();
149 for (pkgCache::VerFileIterator Vf
= Cur
.FileList(); Vf
.end() == false; Vf
++)
150 cout
<< "(" << Vf
.File().FileName() << ")";
156 cout
<< "Reverse Depends: " << endl
;
157 for (pkgCache::DepIterator D
= Pkg
.RevDependsList(); D
.end() != true; D
++)
158 cout
<< " " << D
.ParentPkg().Name() << ',' << D
.TargetPkg().Name() << endl
;
160 cout
<< "Dependencies: " << endl
;
161 for (pkgCache::VerIterator Cur
= Pkg
.VersionList(); Cur
.end() != true; Cur
++)
163 cout
<< Cur
.VerStr() << " - ";
164 for (pkgCache::DepIterator Dep
= Cur
.DependsList(); Dep
.end() != true; Dep
++)
165 cout
<< Dep
.TargetPkg().Name() << " (" << (int)Dep
->CompareOp
<< " " << Dep
.TargetVer() << ") ";
169 cout
<< "Provides: " << endl
;
170 for (pkgCache::VerIterator Cur
= Pkg
.VersionList(); Cur
.end() != true; Cur
++)
172 cout
<< Cur
.VerStr() << " - ";
173 for (pkgCache::PrvIterator Prv
= Cur
.ProvidesList(); Prv
.end() != true; Prv
++)
174 cout
<< Prv
.ParentPkg().Name() << " ";
177 cout
<< "Reverse Provides: " << endl
;
178 for (pkgCache::PrvIterator Prv
= Pkg
.ProvidesList(); Prv
.end() != true; Prv
++)
179 cout
<< Prv
.OwnerPkg().Name() << " " << Prv
.OwnerVer().VerStr() << endl
;
185 // Stats - Dump some nice statistics /*{{{*/
186 // ---------------------------------------------------------------------
188 bool Stats(CommandLine
&Cmd
)
190 pkgCache
&Cache
= *GCache
;
191 cout
<< "Total Package Names : " << Cache
.Head().PackageCount
<< " (" <<
192 SizeToStr(Cache
.Head().PackageCount
*Cache
.Head().PackageSz
) << ')' << endl
;
193 pkgCache::PkgIterator I
= Cache
.PkgBegin();
200 for (;I
.end() != true; I
++)
202 if (I
->VersionList
!= 0 && I
->ProvidesList
== 0)
208 if (I
->VersionList
!= 0 && I
->ProvidesList
!= 0)
214 if (I
->VersionList
== 0 && I
->ProvidesList
!= 0)
217 if (I
.ProvidesList()->NextProvides
== 0)
225 if (I
->VersionList
== 0 && I
->ProvidesList
== 0)
231 cout
<< " Normal Packages: " << Normal
<< endl
;
232 cout
<< " Pure Virtual Packages: " << Virtual
<< endl
;
233 cout
<< " Single Virtual Packages: " << DVirt
<< endl
;
234 cout
<< " Mixed Virtual Packages: " << NVirt
<< endl
;
235 cout
<< " Missing: " << Missing
<< endl
;
237 cout
<< "Total Distinct Versions: " << Cache
.Head().VersionCount
<< " (" <<
238 SizeToStr(Cache
.Head().VersionCount
*Cache
.Head().VersionSz
) << ')' << endl
;
239 cout
<< "Total Dependencies: " << Cache
.Head().DependsCount
<< " (" <<
240 SizeToStr(Cache
.Head().DependsCount
*Cache
.Head().DependencySz
) << ')' << endl
;
242 cout
<< "Total Ver/File relations: " << Cache
.Head().VerFileCount
<< " (" <<
243 SizeToStr(Cache
.Head().VerFileCount
*Cache
.Head().VerFileSz
) << ')' << endl
;
244 cout
<< "Total Provides Mappings: " << Cache
.Head().ProvidesCount
<< " (" <<
245 SizeToStr(Cache
.Head().ProvidesCount
*Cache
.Head().ProvidesSz
) << ')' << endl
;
248 unsigned long Size
= 0;
249 unsigned long Count
= 0;
250 for (pkgCache::StringItem
*I
= Cache
.StringItemP
+ Cache
.Head().StringList
;
251 I
!= Cache
.StringItemP
; I
= Cache
.StringItemP
+ I
->NextItem
)
254 Size
+= strlen(Cache
.StrP
+ I
->String
);
256 cout
<< "Total Globbed Strings: " << Count
<< " (" << SizeToStr(Size
) << ')' << endl
;
258 unsigned long Slack
= 0;
259 for (int I
= 0; I
!= 7; I
++)
260 Slack
+= Cache
.Head().Pools
[I
].ItemSize
*Cache
.Head().Pools
[I
].Count
;
261 cout
<< "Total Slack space: " << SizeToStr(Slack
) << endl
;
263 unsigned long Total
= 0;
264 Total
= Slack
+ Size
+ Cache
.Head().DependsCount
*Cache
.Head().DependencySz
+
265 Cache
.Head().VersionCount
*Cache
.Head().VersionSz
+
266 Cache
.Head().PackageCount
*Cache
.Head().PackageSz
+
267 Cache
.Head().VerFileCount
*Cache
.Head().VerFileSz
+
268 Cache
.Head().ProvidesCount
*Cache
.Head().ProvidesSz
;
269 cout
<< "Total Space Accounted for: " << SizeToStr(Total
) << endl
;
274 // Check - Check some things about the cache /*{{{*/
275 // ---------------------------------------------------------------------
276 /* Debug aide mostly */
277 bool Check(CommandLine
&Cmd
)
279 pkgCache
&Cache
= *GCache
;
280 pkgCache::PkgIterator Pkg
= Cache
.PkgBegin();
281 for (;Pkg
.end() != true; Pkg
++)
283 if (Pkg
.Section() == 0 && Pkg
->VersionList
!= 0)
284 cout
<< "Bad section " << Pkg
.Name() << endl
;
286 for (pkgCache::VerIterator Cur
= Pkg
.VersionList();
287 Cur
.end() != true; Cur
++)
289 if (Cur
->Priority
< 1 || Cur
->Priority
> 5)
290 cout
<< "Bad prio " << Pkg
.Name() << ',' << Cur
.VerStr() << " == " << (int)Cur
->Priority
<< endl
;
296 // Dump - show everything /*{{{*/
297 // ---------------------------------------------------------------------
299 bool Dump(CommandLine
&Cmd
)
301 pkgCache
&Cache
= *GCache
;
302 for (pkgCache::PkgIterator P
= Cache
.PkgBegin(); P
.end() == false; P
++)
304 cout
<< "Package: " << P
.Name() << endl
;
305 for (pkgCache::VerIterator V
= P
.VersionList(); V
.end() == false; V
++)
307 cout
<< " Version: " << V
.VerStr() << endl
;
308 cout
<< " File: " << V
.FileList().File().FileName() << endl
;
309 for (pkgCache::DepIterator D
= V
.DependsList(); D
.end() == false; D
++)
310 cout
<< " Depends: " << D
.TargetPkg().Name() << ' ' << D
.TargetVer() << endl
;
314 for (pkgCache::PkgFileIterator
F(Cache
); F
.end() == false; F
++)
316 cout
<< "File: " << F
.FileName() << endl
;
317 cout
<< " Size: " << F
->Size
<< endl
;
318 cout
<< " ID: " << F
->ID
<< endl
;
319 cout
<< " Flags: " << F
->Flags
<< endl
;
320 cout
<< " Time: " << TimeRFC1123(F
->mtime
) << endl
;
321 cout
<< " Archive: " << F
.Archive() << endl
;
322 cout
<< " Component: " << F
.Component() << endl
;
323 cout
<< " Version: " << F
.Version() << endl
;
324 cout
<< " Origin: " << F
.Origin() << endl
;
325 cout
<< " Label: " << F
.Label() << endl
;
326 cout
<< " Architecture: " << F
.Architecture() << endl
;
332 // DumpAvail - Print out the available list /*{{{*/
333 // ---------------------------------------------------------------------
334 /* This is needed to make dpkg --merge happy */
335 bool DumpAvail(CommandLine
&Cmd
)
337 pkgCache
&Cache
= *GCache
;
338 unsigned char *Buffer
= new unsigned char[Cache
.HeaderP
->MaxVerFileSize
];
340 for (pkgCache::PkgFileIterator I
= Cache
.FileBegin(); I
.end() == false; I
++)
342 if ((I
->Flags
& pkgCache::Flag::NotSource
) != 0)
345 if (I
.IsOk() == false)
348 return _error
->Error("Package file %s is out of sync.",I
.FileName());
351 FileFd
PkgF(I
.FileName(),FileFd::ReadOnly
);
352 if (_error
->PendingError() == true)
358 /* Write all of the records from this package file, we search the entire
359 structure to find them */
360 for (pkgCache::PkgIterator P
= Cache
.PkgBegin(); P
.end() == false; P
++)
362 // Find the proper version to use. We should probably use the DepCache.
363 pkgCache::VerIterator V
= Cache
.GetCandidateVer(P
,false);
365 if (V
.end() == true || V
.FileList().File() != I
)
368 // Read the record and then write it out again.
369 if (PkgF
.Seek(V
.FileList()->Offset
) == false ||
370 PkgF
.Read(Buffer
,V
.FileList()->Size
) == false ||
371 write(STDOUT_FILENO
,Buffer
,V
.FileList()->Size
) != V
.FileList()->Size
)
382 // Depends - Print out a dependency tree /*{{{*/
383 // ---------------------------------------------------------------------
385 bool Depends(CommandLine
&CmdL
)
387 pkgCache
&Cache
= *GCache
;
389 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++)
391 pkgCache::PkgIterator Pkg
= Cache
.FindPkg(*I
);
392 if (Pkg
.end() == true)
394 _error
->Warning("Unable to locate package %s",*I
);
398 pkgCache::VerIterator Ver
= Pkg
.VersionList();
399 if (Ver
.end() == true)
401 cout
<< '<' << Pkg
.Name() << '>' << endl
;
405 cout
<< Pkg
.Name() << endl
;
407 for (pkgCache::DepIterator D
= Ver
.DependsList(); D
.end() == false; D
++)
409 if ((D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
)
415 pkgCache::PkgIterator Trg
= D
.TargetPkg();
416 if (Trg
->VersionList
== 0)
417 cout
<< D
.DepType() << ": <" << Trg
.Name() << ">" << endl
;
419 cout
<< D
.DepType() << ": " << Trg
.Name() << endl
;
421 // Display all solutions
422 pkgCache::Version
**List
= D
.AllTargets();
423 for (pkgCache::Version
**I
= List
; *I
!= 0; I
++)
425 pkgCache::VerIterator
V(Cache
,*I
);
426 if (V
!= Cache
.VerP
+ V
.ParentPkg()->VersionList
||
427 V
->ParentPkg
== D
->Package
)
429 cout
<< " " << V
.ParentPkg().Name() << endl
;
438 // DoAdd - Perform an adding operation /*{{{*/
439 // ---------------------------------------------------------------------
441 bool DoAdd(CommandLine
&CmdL
)
443 // Make sure there is at least one argument
444 if (CmdL
.FileSize() <= 1)
445 return _error
->Error("You must give at least one file name");
448 FileFd
CacheF(_config
->FindFile("Dir::Cache::pkgcache"),FileFd::WriteAny
);
449 if (_error
->PendingError() == true)
452 DynamicMMap
Map(CacheF
,MMap::Public
);
453 if (_error
->PendingError() == true)
456 OpTextProgress
Progress(*_config
);
457 pkgCacheGenerator
Gen(Map
,Progress
);
458 if (_error
->PendingError() == true)
461 unsigned long Length
= CmdL
.FileSize() - 1;
462 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++)
464 Progress
.OverallProgress(I
- CmdL
.FileList
,Length
,1,"Generating cache");
465 Progress
.SubProgress(Length
);
468 FileFd
TagF(*I
,FileFd::ReadOnly
);
469 debListParser
Parser(TagF
);
470 if (_error
->PendingError() == true)
471 return _error
->Error("Problem opening %s",*I
);
473 if (Gen
.SelectFile(*I
) == false)
474 return _error
->Error("Problem with SelectFile");
476 if (Gen
.MergeList(Parser
) == false)
477 return _error
->Error("Problem with MergeList");
481 GCache
= &Gen
.GetCache();
487 // DisplayRecord - Displays the complete record for the package /*{{{*/
488 // ---------------------------------------------------------------------
489 /* This displays the package record from the proper package index file.
490 It is not used by DumpAvail for performance reasons. */
491 bool DisplayRecord(pkgCache::VerIterator V
)
493 // Find an appropriate file
494 pkgCache::VerFileIterator Vf
= V
.FileList();
495 for (; Vf
.end() == false; Vf
++)
496 if ((Vf
.File()->Flags
& pkgCache::Flag::NotSource
) == 0)
498 if (Vf
.end() == true)
501 // Check and load the package list file
502 pkgCache::PkgFileIterator I
= Vf
.File();
503 if (I
.IsOk() == false)
504 return _error
->Error("Package file %s is out of sync.",I
.FileName());
506 FileFd
PkgF(I
.FileName(),FileFd::ReadOnly
);
507 if (_error
->PendingError() == true)
510 // Read the record and then write it out again.
511 unsigned char *Buffer
= new unsigned char[GCache
->HeaderP
->MaxVerFileSize
];
512 if (PkgF
.Seek(V
.FileList()->Offset
) == false ||
513 PkgF
.Read(Buffer
,V
.FileList()->Size
) == false ||
514 write(STDOUT_FILENO
,Buffer
,V
.FileList()->Size
) != V
.FileList()->Size
)
525 // Search - Perform a search /*{{{*/
526 // ---------------------------------------------------------------------
527 /* This searches the package names and pacakge descriptions for a pattern */
528 bool Search(CommandLine
&CmdL
)
530 pkgCache
&Cache
= *GCache
;
531 bool ShowFull
= _config
->FindB("APT::Cache::ShowFull",false);
532 bool NamesOnly
= _config
->FindB("APT::Cache::NamesOnly",false);
534 // Make sure there is at least one argument
535 if (CmdL
.FileSize() != 2)
536 return _error
->Error("You must give exactly one pattern");
538 // Compile the regex pattern
540 if (regcomp(&Pattern
,CmdL
.FileList
[1],REG_EXTENDED
| REG_ICASE
|
542 return _error
->Error("Regex compilation error");
544 // Create the text record parser
545 pkgRecords
Recs(Cache
);
546 if (_error
->PendingError() == true)
549 // Search package names
550 pkgCache::PkgIterator I
= Cache
.PkgBegin();
551 for (;I
.end() != true; I
++)
553 // We search against the install version as that makes the most sense..
554 pkgCache::VerIterator V
= Cache
.GetCandidateVer(I
);
558 pkgRecords::Parser
&P
= Recs
.Lookup(V
.FileList());
560 if (regexec(&Pattern
,I
.Name(),0,0,0) == 0 ||
561 (NamesOnly
== false &&
562 regexec(&Pattern
,P
.LongDesc().c_str(),0,0,0) == 0))
564 if (ShowFull
== true)
567 cout
<< I
.Name() << " - " << P
.ShortDesc() << endl
;
575 // ShowPackage - Dump the package record to the screen /*{{{*/
576 // ---------------------------------------------------------------------
578 bool ShowPackage(CommandLine
&CmdL
)
580 pkgCache
&Cache
= *GCache
;
581 for (const char **I
= CmdL
.FileList
+ 1; *I
!= 0; I
++)
583 pkgCache::PkgIterator Pkg
= Cache
.FindPkg(*I
);
584 if (Pkg
.end() == true)
586 _error
->Warning("Unable to locate package %s",*I
);
590 // Find the proper version to use. We should probably use the DepCache.
591 pkgCache::VerIterator V
= Cache
.GetCandidateVer(Pkg
);
592 if (V
.end() == true || V
.FileList().end() == true)
594 if (DisplayRecord(V
) == false)
600 // GenCaches - Call the main cache generator /*{{{*/
601 // ---------------------------------------------------------------------
603 bool GenCaches(CommandLine
&Cmd
)
605 OpTextProgress
Progress(*_config
);
609 return pkgMakeStatusCache(List
,Progress
);
612 // ShowHelp - Show a help screen /*{{{*/
613 // ---------------------------------------------------------------------
615 bool ShowHelp(CommandLine
&Cmd
)
617 cout
<< PACKAGE
<< ' ' << VERSION
<< " for " << ARCHITECTURE
<<
618 " compiled on " << __DATE__
<< " " << __TIME__
<< endl
;
619 if (_config
->FindB("version") == true)
622 cout
<< "Usage: apt-cache [options] command" << endl
;
623 cout
<< " apt-cache [options] add file1 [file1 ...]" << endl
;
624 cout
<< " apt-cache [options] showpkg pkg1 [pkg2 ...]" << endl
;
626 cout
<< "apt-cache is a low-level tool used to manipulate APT's binary" << endl
;
627 cout
<< "cache files stored in " << _config
->FindFile("Dir::Cache") << endl
;
628 cout
<< "It is not meant for ordinary use only as a debug aide." << endl
;
630 cout
<< "Commands:" << endl
;
631 cout
<< " add - Add an package file to the source cache" << endl
;
632 cout
<< " gencaches - Build both the package and source cache" << endl
;
633 cout
<< " showpkg - Show some general information for a single package" << endl
;
634 cout
<< " stats - Show some basic statistics" << endl
;
635 cout
<< " dump - Show the entire file in a terse form" << endl
;
636 cout
<< " dumpavail - Print an available file to stdout" << endl
;
637 cout
<< " unmet - Show unmet dependencies" << endl
;
638 cout
<< " check - Check the cache a bit" << endl
;
639 cout
<< " search - Search the package list for a regex pattern" << endl
;
640 cout
<< " show - Show a readable record for the package" << endl
;
641 cout
<< " depends - Show raw dependency information for a package" << endl
;
643 cout
<< "Options:" << endl
;
644 cout
<< " -h This help text." << endl
;
645 cout
<< " -p=? The package cache. [" << _config
->FindFile("Dir::Cache::pkgcache") << ']' << endl
;
646 cout
<< " -s=? The source cache. [" << _config
->FindFile("Dir::Cache::srcpkgcache") << ']' << endl
;
647 cout
<< " -q Disable progress indicator." << endl
;
648 cout
<< " -i Show only important deps for the unmet command." << endl
;
649 cout
<< " -c=? Read this configuration file" << endl
;
650 cout
<< " -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp" << endl
;
651 cout
<< "See the apt-cache(8) and apt.conf(5) manual pages for more information." << endl
;
655 // CacheInitialize - Initialize things for apt-cache /*{{{*/
656 // ---------------------------------------------------------------------
658 void CacheInitialize()
660 _config
->Set("quiet",0);
661 _config
->Set("help",false);
665 int main(int argc
,const char *argv
[])
667 CommandLine::Args Args
[] = {
668 {'h',"help","help",0},
669 {'v',"version","version",0},
670 {'p',"pkg-cache","Dir::Cache::pkgcache",CommandLine::HasArg
},
671 {'s',"src-cache","Dir::Cache::srcpkgcache",CommandLine::HasArg
},
672 {'q',"quiet","quiet",CommandLine::IntLevel
},
673 {'i',"important","APT::Cache::Important",0},
674 {'f',"full","APT::Cache::ShowFull",0},
675 {0,"names-only","APT::Cache::NamesOnly",0},
676 {'c',"config-file",0,CommandLine::ConfigFile
},
677 {'o',"option",0,CommandLine::ArbItem
},
679 CommandLine::Dispatch CmdsA
[] = {{"help",&ShowHelp
},
681 {"gencaches",&GenCaches
},
683 CommandLine::Dispatch CmdsB
[] = {{"showpkg",&DumpPackage
},
686 {"dumpavail",&DumpAvail
},
690 {"depends",&Depends
},
691 {"show",&ShowPackage
},
696 // Parse the command line and initialize the package library
697 CommandLine
CmdL(Args
,_config
);
698 if (pkgInitialize(*_config
) == false ||
699 CmdL
.Parse(argc
,argv
) == false)
701 _error
->DumpErrors();
705 // See if the help should be shown
706 if (_config
->FindB("help") == true ||
707 CmdL
.FileSize() == 0)
708 return ShowHelp(CmdL
);
710 // Deal with stdout not being a tty
711 if (ttyname(STDOUT_FILENO
) == 0 && _config
->FindI("quiet",0) < 1)
712 _config
->Set("quiet","1");
714 if (CmdL
.DispatchArg(CmdsA
,false) == false && _error
->PendingError() == false)
716 // Open the cache file
720 // Generate it and map it
722 MMap
*Map
= pkgMakeStatusCacheMem(List
,Prog
);
723 if (_error
->PendingError() == false)
725 pkgCache
Cache(*Map
);
727 if (_error
->PendingError() == false)
728 CmdL
.DispatchArg(CmdsB
);
733 // Print any errors or warnings found during parsing
734 if (_error
->empty() == false)
736 bool Errors
= _error
->PendingError();
737 _error
->DumpErrors();
738 return Errors
== true?100:0;