Happy new year
[yazpp-moved-to-github.git] / src / yaz-cql2rpn.cpp
index 777c818..62f50fe 100644 (file)
@@ -1,12 +1,15 @@
-/*
- * Copyright (c) 1998-2004, Index Data.
+/* This file is part of the yazpp toolkit.
+ * Copyright (C) Index Data and Mike Taylor
  * See the file LICENSE for details.
- * 
- * $Id: yaz-cql2rpn.cpp,v 1.13 2007-01-16 11:54:55 adam Exp $
  */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <yaz/log.h>
+#include <yaz/diagsrw.h>
 #include <yaz/pquery.h>
+#include <yaz/sortspec.h>
 #include <yazpp/cql2rpn.h>
 
 using namespace yazpp_1;
@@ -37,7 +40,7 @@ bool Yaz_cql2rpn::parse_spec_file(const char *fname, int *error)
     return m_transform ? true : false;
 }
 
-int Yaz_cql2rpn::query_transform(const char *cql_query, 
+int Yaz_cql2rpn::query_transform(const char *cql_query,
                                  Z_RPNQuery **rpnquery, ODR o,
                                  char **addinfop)
 {
@@ -49,23 +52,41 @@ int Yaz_cql2rpn::query_transform(const char *cql_query,
     int r = cql_parser_string(cp, cql_query);
     if (r)
     {
-        r = 10;
+        r = YAZ_SRW_QUERY_SYNTAX_ERROR;
     }
     else
     {
-        char rpn_buf[10240];
-        r = cql_transform_buf(m_transform, cql_parser_result(cp), 
-                              rpn_buf, sizeof(rpn_buf)-1);
+        WRBUF pqf = wrbuf_alloc();
+        r = cql_transform(m_transform, cql_parser_result(cp),
+                          wrbuf_vp_puts, pqf);
         if (!r)
         {
+            WRBUF sortkeys = wrbuf_alloc();
+            WRBUF sortspec = wrbuf_alloc();
+            if (cql_sortby_to_sortkeys(cql_parser_result(cp),
+                                       wrbuf_vp_puts, sortkeys))
+            {
+                r = YAZ_SRW_UNSUPP_SORT_TYPE;
+            }
+            else
+            {
+                yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sortkeys), sortspec);
+                Z_SortKeySpecList *sksl =
+                    yaz_sort_spec(o, wrbuf_cstr(sortspec));
+                if (sksl)
+                    yaz_sort_spec_to_type7(sksl, pqf);
+            }
+            wrbuf_destroy(sortspec);
+            wrbuf_destroy(sortkeys);
+
             YAZ_PQF_Parser pp = yaz_pqf_create();
 
-            *rpnquery = yaz_pqf_parse(pp, o, rpn_buf);
+            *rpnquery = yaz_pqf_parse(pp, o, wrbuf_cstr(pqf));
             if (!*rpnquery)
             {
                 size_t off;
                 const char *pqf_msg;
-                int code = yaz_pqf_error(pp, &pqf_msg, &off);
+                yaz_pqf_error(pp, &pqf_msg, &off);
                 r = -1;
             }
             yaz_pqf_destroy(pp);
@@ -74,17 +95,16 @@ int Yaz_cql2rpn::query_transform(const char *cql_query,
         {
             r = cql_transform_error(m_transform, &addinfo);
         }
-    }   
+        wrbuf_destroy(pqf);
+    }
     cql_parser_destroy(cp);
-    if (addinfo)
-        *addinfop = odr_strdup(o, addinfo);
-    else
-        *addinfop = 0;
+    *addinfop = odr_strdup_null(o, addinfo);
     return r;
 }
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab