source: pmb4.2/trunk/fuentes/pmb/zserver/export_z3950.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 5 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 7.9 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: export_z3950.php,v 1.7 2015-04-03 11:16:29 jpermanne Exp $
6
7$base_path="../..";
8include($base_path."/includes/db_param.inc.php");
9include($base_path."/admin/convert/export.class.php");
10include($base_path."/admin/convert/xml_unimarc.class.php");
11require_once($base_path."/includes/isbn.inc.php");
12
13function make_error($nerr,$err_message) {
14        echo $nerr."@".$err_message."@";
15        exit();
16}
17
18if (!@pmb_mysql_connect(SQL_SERVER,USER_NAME,USER_PASS)) make_error(1,"Could'nt connect to database server"); 
19if (!@pmb_mysql_select_db(DATA_BASE)) make_error(2,"Database unknown");
20
21//Commande envoyée
22$command=$_GET["command"];
23//Requete
24$query=$_GET["query"];
25function construct_query($query,$not,$level,$argn="") {
26        //La requête commence-t-elle par and, or ou and not ?
27        $pos=strpos($query,"and not");
28        if (($pos!==false)&&($pos==0)) {
29                $ope="and not";
30        } else {
31                $pos=strpos($query,"or");
32                if (($pos!==false)&&($pos==0)) {
33                        $ope="or";
34                } else {
35                        $pos=strpos($query,"and");
36                        if (($pos!==false)&&($pos==0)) {
37                                $ope="and";
38                        } else $ope="";
39                }
40        }
41        if ($ope!="") {
42                $arqs=array();
43                preg_match("/^".$ope." arg".$level."!1\((.*)\) arg".$level."!2\((.*)\)$/",$query,$args);
44                $return1=construct_query($args[1],0,$level+1,1);
45                if ($ope=="and not")
46                        $return2=construct_query($args[2],1,$level+1,2);
47                else
48                        $return2=construct_query($args[2],0,$level+1,2);
49                if ($ope=="and not") $ope="and";
50                $requete="create temporary table r$level ";
51                if ($ope=="and") {
52                        $requete.="select $return1.notice_id from $return1, $return2 where $return1.notice_id=$return2.notice_id";
53                        @pmb_mysql_query($requete);
54                }
55                else {
56                        $requete.="select notice_id from $return1";
57                        @pmb_mysql_query($requete);
58                        $requete="insert into r$level select $return2.notice_id from $return2,$return1 where $return2.notice_id!=$return1.notice_id";
59                        @pmb_mysql_query($requete);
60                }
61                $return="r$level";
62        } else {
63                $use=explode("=",$query);
64                switch ($use[0]) {
65                        //Titre
66                        case 4:
67                                if ($not)
68                                        $requete="select notice_id from notices where (tit1 not like '%".$use[1]."%' and tit2 not like '%".$use[1]."%' and tit3 not like '%".$use[1]."%' and tit4 not like '%".$use[1]."%')";
69                                else
70                                        $requete="select notice_id from notices where (tit1 like '%".$use[1]."%' or tit2 like '%".$use[1]."%' or tit3 like '%".$use[1]."%' or tit4 like '%".$use[1]."%')";
71                                break;
72                        //ISBN
73                        case 7:
74                            if(isISBN($use[1])) {
75                                        // si la saisie est un ISBN
76                                        $code = formatISBN($use[1]);
77                                        // si échec, ISBN erroné on le prend sous cette forme
78                                        if(!$code) $code = $use[1];
79                            } else $code = $use[1];
80                                if ($not)
81                                        $requete="select notice_id from notices where (code!='".$code."')";
82                                else
83                                        $requete="select notice_id from notices where (code='".$code."')";
84                                break;
85                        case 1003:
86                                if ($not) {
87                                        $requete="create temporary table aut1 select notice_id,concat(author_name,' ',author_rejete) as auth from notices left join authors on author_id=aut1_id";
88                                        @pmb_mysql_query($requete);
89                                        $requete="create temporary table aut2 select notice_id,concat(author_name,' ',author_rejete) as auth from notices left join authors on author_id=aut2_id";
90                                        @pmb_mysql_query($requete);
91                                        $requete="create temporary table aut3 select notice_id,concat(author_name,' ',author_rejete) as auth from notices left join authors on author_id=aut3_id";
92                                        @pmb_mysql_query($requete);
93                                        $requete="create temporary table aut4 select notice_id,concat(author_name,' ',author_rejete) as auth from notices left join authors on author_id=aut4_id";
94                                        @pmb_mysql_query($requete);
95                                        $requete="create temporary table aut select aut1.notice_id, concat(ifnull(aut1.auth,''),' ',ifnull(aut2.auth,''),' ',ifnull(aut3.auth,''),' ',ifnull(aut4.auth,'')) as auth from aut1, aut2, aut3, aut4 where aut2.notice_id=aut1.notice_id and aut3.notice_id=aut1.notice_id and aut4.notice_id=aut1.notice_id";
96                                    @pmb_mysql_query($requete);
97                                    $requete="select notice_id from aut where auth not like '%".$use[1]."%'";
98                                }
99                                else 
100                                        $requete="select notice_id from notices,authors where (concat(author_name,' ',author_rejete) like '%".$use[1]."%' and (author_id=aut1_id or author_id=aut2_id or author_id=aut3_id or author_id=aut3_id))";
101                                break;
102
103                        // Sujet - Catégories
104                        case 21:
105                                if ($not) {
106                                    $requete="CREATE TEMPORARY TABLE cat SELECT DISTINCT notices_categories.notcateg_notice as notice_id, index_categorie as cat FROM categories, notices_categories WHERE notcateg_categorie = categ_id ORDER BY notices_categories.ordre_categorie";
107                                    @pmb_mysql_query($requete);
108                                        $requete="SELECT DISTINCT notice_id FROM cat WHERE cat not like '%".$use[1]."%'";
109                                        } else { 
110                                                $requete="SELECT DISTINCT notice_id FROM notices_categories, categories, notices WHERE categ_id=notcateg_categorie AND notice_id=notcateg_notice AND index_categorie like '%".$use[1]."%'";
111                                                }
112                                break;
113                        default:
114                                make_error(3,"1=".$use[0]);
115                                break;
116                }
117                $requete="create temporary table r".$level."_".$argn." ".$requete;
118                @pmb_mysql_query($requete);
119                $return="r".$level."_".$argn;
120        }
121        return $return;
122}
123
124/*
125function construct_query($query,&$sup_tables,$not,$level) {
126        //La requête commence-t-elle par and, or ou and not ?
127        $pos=strpos($query,"and not");
128        if (($pos!==false)&&($pos==0)) {
129                $ope="and not";
130        } else {
131                $pos=strpos($query,"or");
132                if (($pos!==false)&&($pos==0)) {
133                        $ope="or";
134                } else {
135                        $pos=strpos($query,"and");
136                        if (($pos!==false)&&($pos==0)) {
137                                $ope="and";
138                        } else $ope="";
139                }
140        }
141       
142        //Si il y a un opérateur, on récupère les deux aguments et on les traite comme des nouvelles requetes
143        if ($ope!="") {
144                $arqs=array();
145                preg_match("/^".$ope." arg".$level."!1\((.*)\) arg".$level."!2\((.*)\)$/",$query,$args);
146                $return1=construct_query($args[1],$sup_tables,0,$level+1);
147                if ($ope=="and not")
148                        $return2=construct_query($args[2],$sup_tables,1,$level+1);
149                else
150                        $return2=construct_query($args[2],$sup_tables,0,$level+1);
151                if ($ope=="and not") $ope="and";
152                $return = sprintf("%s %s %s",$return1,$ope,$return2);
153        } else {
154                $use=explode("=",$query);
155                switch ($use[0]) {
156                        //Titre
157                        case 4:
158                                if ($not)
159                                        $return="(tit1 not like '%".$use[1]."%' and tit2 not like '%".$use[1]."%' and tit3 not like '%".$use[1]."%' and tit4 not like '%".$use[1]."%')";
160                                else
161                                        $return="(tit1 like '%".$use[1]."%' or tit2 like '%".$use[1]."%' or tit3 like '%".$use[1]."%' or tit4 like '%".$use[1]."%')";
162                                break;
163                        //ISBN
164                        case 7:
165                            if(isISBN($use[1])) {
166                                        // si la saisie est un ISBN
167                                        $code = formatISBN($use[1]);
168                                        // si échec, ISBN erroné on le prend sous cette forme
169                                        if(!$code) $code = $use[1];
170                            }
171                                if ($not)
172                                        $return="(code!='".$code."')";
173                                else
174                                        $return="(code='".$code."')";
175                                break;
176                        case 1003:
177                                if ($not)
178                                        $return="(concat(author_name,' ',author_rejete) not like '%".$use[1]."%' and (author_id=aut1_id or author_id=aut2_id or author_id=aut3_id or author_id=aut4_id))";
179                                else
180                                        $return="(concat(author_name,' ',author_rejete) like '%".$use[1]."%' and (author_id=aut1_id or author_id=aut2_id or author_id=aut3_id or author_id=aut3_id))";
181                                $sup_tables.=",authors";
182                                break;
183                        default:
184                                make_error(3,"1=".$use[0]);
185                                break;
186                }
187        }
188        return $return;
189}
190*/
191
192switch ($command) {
193        case "search":
194                $sup_tables="";
195                $sql_query=construct_query($query,0,0);
196                $sql_query="select notice_id from $sql_query limit 100";
197                $resultat=@pmb_mysql_query($sql_query);
198                echo "0@No errors@";
199                echo @pmb_mysql_num_rows($resultat);
200                while (list($id)=@pmb_mysql_fetch_row($resultat)) {
201                        echo "@$id";
202                }
203                break;
204        case "get_notice":
205                $id=$query;
206                $e = new export(array($id));
207                $e -> get_next_notice();
208                $toiso = new xml_unimarc();
209                $toiso->XMLtoiso2709_notice($e->notice);
210                echo "0@No errors@";
211                echo $toiso->notices_[0];
212                break;
213}
Note: See TracBrowser for help on using the repository browser.