19 include_once (
'FDL/Class.Dir.php');
20 include_once (
'FDL/Class.DocSearch.php');
21 include_once (
'FDL/Class.DocRead.php');
22 include_once (
'FDL/Class.DocFam.php');
27 $qsql =
"select id from only doc2 where (doctype='D') order by id LIMIT 1;";
31 $tableq =
$query->Query(0, 0,
"TABLE", $qsql);
34 return $tableq[0][
"id"];
43 if (!($dirid > 0))
return array();
47 return getChildDoc(
$dbaccess, $dirid,
"0",
"ALL", array() , $userid, $restype, 2,
false,
"title");
52 ) , $userid, $restype, 2,
false,
"title") ,
getChildDoc(
$dbaccess, $dirid,
"0",
"ALL", array(
54 ) , $userid, $restype, 5,
false,
"title"));
60 if (!is_array($sqlfilters))
return true;
61 static $props =
false;
66 $props = array_merge($props,
$d->sup_fields);
67 $props[] =
"fulltext";
71 foreach ($sqlfilters as $k => $v) {
72 $tok = ltrim($v,
"(");
73 $tok = ltrim($tok,
" ");
74 $tok = strtok($tok,
" !=~@");
75 if (!(strpos($tok,
'.') > 0)) {
77 if (($tok !==
false) && ($tok !==
"true") && ($tok !==
"false") && (!in_array(ltrim($tok,
"(") , $props)))
return false;
97 $trash =
"", $simplesearch =
false, $folderRecursiveLevel = 2, $join =
'')
102 if ($trash ==
"only") $distinct =
true;
103 if ($fromid == - 1)
$table =
"docfam";
104 elseif ($simplesearch)
$table =
"docread";
105 elseif ($fromid < 0) {
114 $sqlfilters[-4] =
GetSqlCond(array_merge(array(
116 ) , array_keys(
$fdoc->GetChildFam())) ,
"fromid",
true);
120 } elseif ($fromid == 0) {
126 if (preg_match(
"/([a-z0-9_\-:]+)\s*=\s*([a-z0-9_\-:]+)\(([^\)]*)\)/", $join, $reg)) {
128 $jointable = ($joinid) ?
"doc" . $joinid : $reg[2];
130 $sqlfilters[] = sprintf(
"%s.%s = %s.%s",
$table, $reg[1], $jointable, $reg[3]);
132 $table.=
", " . $jointable;
134 addWarningMsg(sprintf(_(
"search join syntax error : %s") , $join));
138 $maintabledot = ($maintable && $dirid == 0) ? $maintable .
'.' :
'';
141 $selectfields =
"distinct on ($maintable.initid) $maintable.*";
143 $selectfields =
"$maintable.*";
144 $sqlfilters[-2] = $maintabledot .
"doctype != 'T'";
149 if (count($sqlfilters) > 0) $sqlcond =
" (" . implode(
") and (", $sqlfilters) .
")";
155 if (strpos(implode(
",", $sqlfilters) ,
"archiveid") ===
false) $sqlfilters[-4] = $maintabledot .
"archiveid is null";
157 if ($trash ==
"only") {
158 $sqlfilters[-3] = $maintabledot .
"doctype = 'Z'";
159 } elseif ($trash ==
"also");
160 else if (!$fromid) $sqlfilters[-3] = $maintabledot .
"doctype != 'Z'";
162 if ((
$latest) && (($trash ==
"no") || (!$trash))) $sqlfilters[-1] = $maintabledot .
"locked != -1";
164 if (count($sqlfilters) > 0) $sqlcond =
" (" . implode(
") and (", $sqlfilters) .
")";
165 $qsql =
"select $selectfields " .
"from $only $table " .
"where " . $sqlcond;
171 if ((is_array($dirid)) || ($fld->defDoctype !=
'S')) {
173 if ($fld && method_exists($fld,
"getSpecificFilters")) {
174 $specFilters = $fld->getSpecificFilters();
175 if (is_array($specFilters) && (count($specFilters) > 0)) {
176 $sqlfilters = array_merge($sqlfilters, $specFilters);
180 if (strpos(implode(
",", $sqlfilters) ,
"archiveid") ===
false) $sqlfilters[-4] = $maintabledot .
"archiveid is null";
182 if ($trash ==
"only") $sqlfilters[-1] =
"locked = -1";
183 elseif (
$latest) $sqlfilters[-1] =
"locked != -1";
185 if (count($sqlfilters) > 0) $sqlcond =
" (" . implode(
") and (", $sqlfilters) .
")";
187 if (is_array($dirid)) {
189 $qsql =
"select $selectfields " .
"from (select childid from fld where $sqlfld) as fld2 inner join $table on (initid=childid) " .
"where $sqlcond ";
191 $sqlfld =
"dirid=$dirid and qtype='S'";
192 if ($fromid == 2) $sqlfld.=
" and doctype='D'";
193 if ($fromid == 5) $sqlfld.=
" and doctype='S'";
195 $sqlcond =
" (" . implode(
") and (", $sqlfilters) .
")";
196 $qsql =
"select $selectfields from $only $table where $sqlcond ";
199 $q->AddQuery($sqlfld);
200 $tfld =
$q->Query(0, 0,
"TABLE");
202 foreach ($tfld as $onefld) {
203 $tfldid[] = $onefld[
"childid"];
205 if (count($tfldid) > 1000) {
206 $qsql =
"select $selectfields " .
"from $table where initid in (select childid from fld where $sqlfld) " .
"and $sqlcond ";
208 $sfldids = implode(
",", $tfldid);
209 if (
$table ==
"docread") {
213 $qsql =
"select $selectfields " .
"from $table where initid in ($sfldids) " .
"and $sqlcond ";
218 $qsql =
"select $selectfields " .
"from $only $table where initid in ($sfldids) " .
"and $sqlcond ";
231 $docsearch->AddQuery(
"dirid=$dirid");
232 $docsearch->AddQuery(
"qtype = 'M'");
233 $ldocsearch = $docsearch->Query(0, 0,
"TABLE");
235 if (($docsearch->nb) > 0) {
236 switch ($ldocsearch[0][
"qtype"]) {
240 if ($trash) $fld->setValue(
"se_trash", $trash);
241 else $trash = $fld->getValue(
"se_trash");
242 $fld->folderRecursiveLevel = $folderRecursiveLevel;
243 $tsqlM = $fld->getQuery();
244 foreach ($tsqlM as $sqlM) {
245 if ($sqlM !=
false) {
246 if (!preg_match(
"/doctype[ ]*=[ ]*'Z'/", $sqlM, $reg)) {
247 if (($trash !=
"also") && ($trash !=
"only")) $sqlfilters[-3] =
"doctype != 'Z'";
249 foreach ($sqlfilters as $kf => $sf) {
250 if (strstr($sqlM, $sf)) {
251 unset($sqlfilters[$kf]);
254 if (count($sqlfilters) > 0) $sqlcond =
" (" . implode(
") and (", $sqlfilters) .
")";
257 if ($fromid > 0) $sqlM = str_replace(
"from doc ",
"from $only $table ", $sqlM);
258 if ($sqlcond) $qsql[] = $sqlM .
" and " . $sqlcond;
259 else $qsql[] = $sqlM;
270 if (is_array($qsql))
return $qsql;
296 if ($fld->getValue(
"se_phpfunc") !=
"")
return $terr;
298 if ((is_array($dirid)) || ($fld->defDoctype !=
'S')) {
304 $err = $docsearch->AddQuery(
"dirid=$dirid");
307 $action->AddWarningMsg(
$err);
309 $docsearch->AddQuery(
"qtype = 'M'");
310 $ldocsearch = $docsearch->Query(0, 0,
"TABLE");
312 if (($docsearch->nb) > 0) {
313 switch ($ldocsearch[0][
"qtype"]) {
316 $tsqlM = $fld->getQuery();
317 foreach ($tsqlM as $sqlM) {
319 if ($sqlM ==
false) $terr[$dirid] = _(
"uncomplete request");
325 $terr[$dirid] = _(
"request not found");
350 function getChildDoc(
$dbaccess, $dirid,
$start =
"0",
$slice =
"ALL", $sqlfilters = array() , $userid = 1, $qtype =
"LIST", $fromid =
"", $distinct =
false, $orderby =
"title",
$latest =
true, $trash =
"", &$debug = null, $folderRecursiveLevel = 2, $join =
'')
356 if ($fromid == 0) $fromid =
"";
357 if (($fromid ==
"") && ($dirid != 0) && ($qtype ==
"TABLE")) {
361 if ($fld->fromid ==
getFamIdFromName(
$dbaccess,
"FTEXTSEARCH"))
return $fld->GetFullTextResultDocs(
$dbaccess, $dirid,
$start,
$slice, $sqlfilters, $userid, $qtype, $fromid, $distinct, $orderby,
$latest);
365 if ($fld->defDoctype !=
'S') {
367 if (!$fld->hasSpecificFilters()) {
369 if (is_array($td))
return $td;
372 if ($fld->getValue(
"se_famid")) $fromid = $fld->getValue(
"se_famid");
374 } elseif ($dirid != 0) {
376 if (($fld->defDoctype ==
'S') && ($fld->getValue(
"se_famid"))) $fromid = $fld->getValue(
"se_famid");
378 if ($trash ==
"only") $distinct =
true;
384 foreach ($tqsql as $k => & $qsql) {
385 if ($qsql ==
false) unset($tqsql[$k]);
387 $isgroup = (count($tqsql) > 1);
388 foreach ($tqsql as & $qsql) {
389 if ($fromid != - 1) {
394 $tsqlfields = array_merge(
$fdoc->fields,
$fdoc->sup_fields);
397 if (preg_match(
"/from\s+([a-z0-9]*)/", $qsql, $reg)) {
398 $maintable = $reg[1];
401 foreach ($tsqlfields as $kf =>
$vf) {
402 if ($if++ > 0) $tsqlfields[$kf] = $maintable .
'.' .
$vf;
407 $maintabledot = ($maintable) ? $maintable .
'.' :
'';
408 $sqlfields = implode(
", ", $tsqlfields);
410 $qsql.=
" and (${maintabledot}profid <= 0 or hasviewprivilege($userid, ${maintabledot}profid))";
412 $qsql = str_replace(
"* from ",
"$sqlfields from ", $qsql);
415 $qsql = str_replace(
"* from ",
"$sqlfields from ", $qsql);
417 if ((!$distinct) && strstr($qsql,
"distinct")) $distinct =
true;
421 $qsql.=
" ORDER BY $maintable.initid, $maintable.id desc";
423 $qsql.=
" ORDER BY initid, id desc";
425 if (!$isgroup) $qsql.=
" LIMIT $slice OFFSET $start";
427 if (($fromid ==
"") && $orderby ==
"") $orderby =
"title";
428 elseif (substr($qsql, 0, 12) ==
"select doc.*") $orderby =
"title";
429 if ($orderby ==
"" && (!$isgroup)) $qsql.=
" LIMIT $slice OFFSET $start;";
431 if ($orderby[0] ==
'-') $orderby = substr($orderby, 1) .
" desc";
432 if (!$isgroup) $qsql.=
" ORDER BY $orderby LIMIT $slice OFFSET $start;";
438 $qsql.=
" and (profid <= 0 or hasviewprivilege($userid, profid))";
440 $qsql = str_replace(
"* from ",
"* ,getuperm($userid,profid) as uperm from ", $qsql);
442 $qsql.=
" ORDER BY $orderby LIMIT $slice OFFSET $start;";
445 if ($fromid == - 1) {
446 include_once
"FDL$GEN/Class.DocFam.php";
449 $fromid = abs($fromid);
452 include_once
"FDL$GEN/Class.Doc$fromid.php";
457 if (count($tqsql) > 0) {
458 if (count($tqsql) == 1) {
461 $tableq =
$query->Query(0, 0, $qtype, $tqsql[0]);
463 $usql = implode($tqsql,
" union ");
464 if ($orderby) $usql.=
" ORDER BY $orderby LIMIT $slice OFFSET $start;";
465 else $usql.=
" LIMIT $slice OFFSET $start;";
469 $tableq =
$query->Query(0, 0, $qtype, $usql);
473 if ($qtype ==
"ITEM") {
474 $tretdocs[] = $tableq;
475 }
else $tretdocs = array_merge($tretdocs, $tableq);
478 if (
$query->basic_elem->msg_err !=
"") {
479 addLogMsg(
$query->basic_elem->msg_err, 200);
481 "query" =>
$query->LastQuery,
482 "err" =>
$query->basic_elem->msg_err
487 if ($debug !== null) {
488 $debug[
"count"] =
$query->nb;
489 $debug[
"query"] =
$query->LastQuery;
490 $debug[
"error"] =
$query->basic_elem->msg_err;
491 $debug[
"delay"] = sprintf(
"%.03fs",
microtime_diff(microtime() , $mb));
493 addLogMsg(
$query->basic_elem->msg_err, 200);
496 } elseif (
$query->basic_elem->msg_err !=
"") {
497 $debug[
"query"] =
$query->LastQuery;
498 $debug[
"error"] =
$query->basic_elem->msg_err;
516 if (is_array($dirid)) {
519 $sqlfld =
"fld.dirid=$dirid";
525 $q->AddQuery($sqlfld);
526 $q->AddQuery(
"qtype='S'");
529 $tfld =
$q->Query(0, $limit + 1,
"TABLE");
531 if (($reallylimit) && (
$q->nb > $limit))
return false;
533 $tfld =
$q->Query(0, $limit + 1,
"TABLE");
537 foreach ($tfld as $k => $v) {
538 $t[$v[
"childid"]] =
getLatestTDoc(
$dbaccess, $v[
"childid"], $sqlfilters, ($v[
"doctype"] ==
"C") ? -1 : $v[
"fromid"]);
540 if (
$t[$v[
"childid"]] ==
false) unset(
$t[$v[
"childid"]]);
541 elseif (
$t[$v[
"childid"]][
"archiveid"]) unset(
$t[$v[
"childid"]]);
543 if ((
$t[$v[
"childid"]][
"uperm"] & (1 <<
POS_VIEW)) == 0) {
544 unset(
$t[$v[
"childid"]]);
549 uasort(
$t,
"sortbytitle");
555 return strcasecmp($td1[
"title"], $td2[
"title"]);
561 function getMSearchDoc(
$dbaccess, $dirid,
$start =
"0",
$slice =
"ALL", $sqlfilters = array() , $userid = 1, $qtype =
"LIST", $fromid =
"", $distinct =
false, $orderby =
"title",
$latest =
true)
566 $tidsearch = $sdoc->getTValue(
"SEG_IDCOND");
568 foreach ($tidsearch as $k => $v) {
569 $tdoc = array_merge(
getChildDoc(
$dbaccess, $v,
$start,
$slice, $sqlfilters, $userid, $qtype, $fromid, $distinct, $orderby,
$latest) ,
$tdoc);
591 $sqlfilter = array() , $limit = 100, $qtype =
"TABLE", $userid = 0)
596 if ($userid == 0) $userid = $action->user->id;
601 $a =
$fdoc->getAttribute($aid);
604 $enum =
$a->getEnum();
605 while (list($k, $v) = each($enum)) {
606 if (in_array($kid, explode(
".", $k))) {
607 $tkids[] = substr($k, strrpos(
"." . $k,
'.'));
611 if (
$a->type ==
"enum") {
613 $sqlfilter[] =
"in_textlist($aid,'" . implode(
"') or in_textlist($aid,'", $tkids) .
"')";
615 $sqlfilter[] =
"$aid='" . implode(
"' or $aid='", $tkids) .
"'";
620 if (
$name !=
"") $sqlfilter[] =
"title ~* '$name'";
622 return getChildDoc(
$dbaccess, 0, 0, $limit, $sqlfilter, $userid,
"TABLE",
getFamIdFromName(
$dbaccess, $famname) ,
false,
"title");
628 if ($sqlvalue !=
"") {
629 $vals = explode(
"][", substr($sqlvalue, 1, -1));
630 while (list($k1, $v1) = each($vals)) {
631 list($aname, $aval) = explode(
";;", $v1);
648 foreach ($tdir as $k => $v) {
649 $tableid[] = $v[
"id"];
671 if ($level > $levelmax) {
680 if (count($childs) > 0) {
681 foreach ($childs as $k => $v) {
682 if (!in_array($v, $rchilds)) {
684 if (is_array(
$t)) $rchilds = array_values(array_unique(
$t));
695 $query->AddQuery(
"dirid=" . $dirid);
698 $query->Query(0, 0,
"TABLE");
712 $query->AddQuery(
"qtype='M'");
713 $query->AddQuery(
"dirid=$dirid");
717 $oquery =
$list[0][
"query"];
718 if (preg_match(
"/select (.+) from (.+)/", $oquery, $reg)) {
719 if (preg_match(
"/doctype( *)=/", $reg[2], $treg))
return false;
720 $nq = sprintf(
"select count(%s) from %s and ((doctype='D')or(doctype='S')) limit 1", $reg[1], $reg[2]);
721 $count =
$query->Query(0, 0,
"TABLE", $nq);
722 if ((
$query->nb > 0) && (is_array($count)) && ($count[0][
"count"] > 0))
return true;
727 $qfld->AddQuery(
"qtype='S'");
728 $qfld->AddQuery(
"fld.dirid=$dirid");
729 $qfld->AddQuery(
"doctype='D' or doctype='S'");
730 $lq = $qfld->Query(0, 1,
"TABLE");
733 if (!is_array($lq))
return false;
734 return ($qfld->nb > 0);
752 $query->AddQuery(
"doctype='C'");
754 if (is_array($classid)) {
755 foreach ($classid as $fid) {
757 $use[] = $tcdoc[
"usefor"];
760 }
else if ($classid > 0) {
762 $query->AddQuery(
"usefor = '" . $cdoc->usefor .
"'");
765 if ($userid > 1)
$query->AddQuery(
"hasviewprivilege(" . $userid .
",docfam.profid)");
767 if ($qtype ==
"TABLE") {
769 foreach (
$t as $k => $v) {
772 usort(
$t,
"cmpfamtitle");
775 $query->order_by =
"lower(title)";
776 return $query->Query(0, 0, $qtype);
797 $chdoc =
$doc->GetFromDoc();
798 if ($defProfFamId ==
"") $defProfFamId =
$doc->defProfFamId;
801 if ($cond !=
"")
$filter[] =
"dpdoc_famid is null or (" .
GetSqlCond($chdoc,
"dpdoc_famid") .
")";
802 else $filter[] =
"dpdoc_famid is null";
803 $filter[] =
"fromid=" . $defProfFamId;
820 if (count($tfid) > 0) {
825 $query->AddQuery(
"((profid = 0) OR hasdocprivilege($uid, profid, $perm))");
827 $l =
$query->Query(0, 0,
"TABLE");
831 foreach ($l as $k => $v) {
844 foreach ($ids as $k =>
$id) {
846 if ((($userid == 1) ||
controlTdoc($tdoc1,
"view")) && ($tdoc1[
"doctype"] !=
'Z'))
$tdoc[
$id] = $tdoc1;
857 foreach ($ids as $k =>
$id) {
859 if (($tdoc1 !==
false) && (($userid == 1) ||
controlTdoc($tdoc1,
"view")) && ($tdoc1[
"doctype"] !=
'Z'))
$tdoc[
$id] = $tdoc1;
873 $query->AddQuery(
"initid in (" . implode(
",", $ids) .
')');
874 $query->AddQuery(
"locked != -1");
875 if ($userid > 1)
$query->AddQuery(
"hasviewprivilege(" . $userid .
",profid)");
892 if (
$id == 0)
return false;
895 $result = pg_query(
$dbid,
"select id from docfam where id=$id and usedocread=1");
896 if (pg_numrows($result) > 0) {
897 $result = pg_query(
$dbid,
"select fromid from docfam where fromid=$id;");
898 if (pg_numrows($result) > 0) {