-/* $Id: data1.h,v 1.1 2004-09-28 10:15:03 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
- Index Data Aps
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+ Copyright (C) 1994-2011 Index Data
Zebra is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
for more details.
You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
*/
#ifndef DATA1_H
#include <stdio.h>
#include <yaz/nmem.h>
-#include <yaz/oid.h>
#include <yaz/proto.h>
-
-#include <idzebra/version.h>
-#include <d1_attset.h>
-#include <d1_map.h>
#include <yaz/yaz-util.h>
-#include <yaz/wrbuf.h>
+
+#include <idzebra/util.h>
#define d1_isspace(c) strchr(" \r\n\t\f", c)
#define d1_isdigit(c) ((c) <= '9' && (c) >= '0')
#define DATA1_MAX_SYMBOL 31
+/*
+ * This structure describes a attset, perhaps made up by inclusion
+ * (supersetting) of other attribute sets. When indexing and searching,
+ * we perform a normalisation, where we associate a given tag with
+ * the set that originally defined it, rather than the superset. This
+ * allows the most flexible access. Eg, the tags common to GILS and BIB-1
+ * should be searchable by both names.
+ */
+
+struct data1_attset;
+
+typedef struct data1_attset data1_attset;
+typedef struct data1_att data1_att;
+typedef struct data1_attset_child data1_attset_child;
+
+struct data1_att
+{
+ data1_attset *parent; /* attribute set */
+ char *name; /* symbolic name of this attribute */
+ int value; /* attribute value */
+ data1_att *next;
+};
+
+struct data1_attset_child {
+ data1_attset *child;
+ data1_attset_child *next;
+};
+
+struct data1_attset
+{
+ char *name; /* symbolic name */
+ Odr_oid *oid; /* attribute set OID */
+ data1_att *atts; /* attributes */
+ data1_attset_child *children; /* included attset */
+ data1_attset *next; /* next in cache */
+};
+
+typedef struct data1_handle_info *data1_handle;
+
+YAZ_EXPORT data1_att *data1_getattbyname(data1_handle dh, data1_attset *s,
+ const char *name);
+YAZ_EXPORT data1_attset *data1_read_attset(data1_handle dh, const char *file);
+
+YAZ_EXPORT data1_attset *data1_empty_attset(data1_handle dh);
+
+typedef struct data1_maptag
+{
+ int new_field;
+ int type;
+#define D1_MAPTAG_numeric 1
+#define D1_MAPTAG_string 2
+ int which;
+ union
+ {
+ int numeric;
+ char *string;
+ } value;
+ struct data1_maptag *next;
+} data1_maptag;
+
+typedef struct data1_mapunit data1_mapunit;
+
+typedef struct data1_maptab
+{
+ char *name;
+ Odr_oid *oid; /* target abstract syntax */
+ char *target_absyn_name;
+ data1_mapunit *map;
+ struct data1_maptab *next;
+} data1_maptab;
+
+
typedef struct data1_name
{
char *name;
typedef struct data1_marctab
{
char *name;
- oid_value reference;
+ Odr_oid *oid; /* MARC OID */
char record_status[2];
char implementation_codes[5];
int force_indicator_length;
int force_identifier_length;
- char leader[24]; /* Fixme! Need linear access to LEADER of MARC record */
+ char leader[24]; /* Fixme! Need linear access to LEADER of MARC record */
struct data1_marctab *next;
} data1_marctab;
typedef struct data1_varset
{
char *name;
- oid_value reference;
+ Odr_oid *oid; /* variant OID */
data1_varclass *classes;
} data1_varset;
{
int type; /* type of tagset in current context */
char *name; /* symbolic name */
- oid_value reference;
+ Odr_oid *oid; /* variant OID */
data1_tag *tags; /* tags defined by this set */
data1_tagset *children; /* children */
data1_tagset *next; /* sibling */
typedef struct data1_termlist
{
- data1_att *att;
+ char *index_name;
char *structure;
char *source;
struct data1_termlist *next;
char *sub_name;
struct data1_element *children;
struct data1_element *next;
+ struct data1_hash_table *hash;
} data1_element;
typedef struct data1_sub_elements {
typedef struct data1_node
{
/* the root of a record (containing global data) */
-#define DATA1N_root 1
+#define DATA1N_root 1
/* a tag */
-#define DATA1N_tag 2
+#define DATA1N_tag 2
/* some data under a leaf tag or variant */
#define DATA1N_data 3
/* variant specification (a triple, actually) */
struct data1_absyn *absyn; /* abstract syntax for this type */
} root;
- struct
+ struct
{
char *tag;
data1_element *element;
/* binary data inclusion */
#define DATA1I_incbin 2
/* text data */
-#define DATA1I_text 3
+#define DATA1I_text 3
/* numerical data */
#define DATA1I_num 4
/* object identifier */
} preprocess;
} u;
- void (*destroy)(struct data1_node *n);
#define DATA1_LOCALDATA 12
char lbuf[DATA1_LOCALDATA]; /* small buffer for local data */
struct data1_node *next;
struct data1_node *root;
} data1_node;
+enum DATA1_XPATH_INDEXING {
+ DATA1_XPATH_INDEXING_DISABLE,
+ DATA1_XPATH_INDEXING_ENABLE
+};
+
YAZ_EXPORT data1_handle data1_create (void);
-#define DATA1_FLAG_XML 1
-YAZ_EXPORT data1_handle data1_createx (int flags);
YAZ_EXPORT void data1_destroy(data1_handle dh);
YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
YAZ_EXPORT data1_node *data1_read_nodex (data1_handle dh, NMEM m,
int (*get_byte)(void *fh), void *fh,
WRBUF wrbuf);
-YAZ_EXPORT data1_node *data1_read_record(data1_handle dh,
+YAZ_EXPORT data1_node *data1_read_record(data1_handle dh,
int (*rf)(void *, char *, size_t),
void *fh, NMEM m);
-YAZ_EXPORT data1_absyn *data1_read_absyn(data1_handle dh, const char *file,
- int file_must_exist);
+
+YAZ_EXPORT void data1_remove_node (data1_handle dh, data1_node *n);
+YAZ_EXPORT void data1_remove_idzebra_subtree (data1_handle dh, data1_node *n);
YAZ_EXPORT data1_tag *data1_gettagbynum(data1_handle dh,
data1_tagset *s,
int type, int value);
YAZ_EXPORT data1_tagset *data1_empty_tagset (data1_handle dh);
-YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh,
+YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh,
const char *file,
int type);
-YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh,
+YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh,
data1_absyn *abs,
data1_element *parent,
const char *tagname);
int *len);
YAZ_EXPORT data1_tag *data1_gettagbyname(data1_handle dh, data1_tagset *s,
const char *name);
-YAZ_EXPORT void data1_free_tree(data1_handle dh, data1_node *t);
YAZ_EXPORT char *data1_nodetobuf(data1_handle dh, data1_node *n,
int select, int *len);
YAZ_EXPORT data1_node *data1_mk_tag_data_wd(data1_handle dh,
YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
data1_varset *set,
- char *zclass, char *type);
+ const char *zclass,
+ const char *type);
YAZ_EXPORT data1_vartype *data1_getvartypeby_absyn(data1_handle dh,
data1_absyn *absyn,
char *zclass, char *type);
YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
-YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh,
+YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh,
data1_absyn *a,
const char *name);
YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
YAZ_EXPORT data1_node *data1_mk_node2(data1_handle dh, NMEM m,
int type, data1_node *parent);
-YAZ_EXPORT data1_node *data1_mk_tag (data1_handle dh, NMEM nmem,
+YAZ_EXPORT data1_node *data1_mk_tag (data1_handle dh, NMEM nmem,
const char *tag, const char **attr,
data1_node *at);
YAZ_EXPORT data1_node *data1_mk_tag_n (data1_handle dh, NMEM nmem,
const char *str,
NMEM nmem);
-YAZ_EXPORT data1_absyn *data1_get_absyn (data1_handle dh, const char *name);
+YAZ_EXPORT data1_absyn *data1_get_absyn (data1_handle dh, const char *name,
+ enum DATA1_XPATH_INDEXING en);
YAZ_EXPORT data1_node *data1_search_tag (data1_handle dh, data1_node *n,
const char *tag);
-YAZ_EXPORT data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem,
+YAZ_EXPORT data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem,
const char *tag, data1_node *at);
YAZ_EXPORT data1_attset *data1_get_attset (data1_handle dh, const char *name);
YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
YAZ_EXPORT data1_marctab *data1_read_marctab (data1_handle dh,
const char *file);
YAZ_EXPORT data1_marctab *data1_absyn_getmarctab(data1_handle dh,
- data1_absyn *absyn);
+ data1_node *root);
YAZ_EXPORT data1_element *data1_absyn_getelements(data1_handle dh,
- data1_absyn *absyn);
+ data1_node *root);
YAZ_EXPORT char *data1_nodetomarc(data1_handle dh, data1_marctab *p,
data1_node *n, int selected, int *len);
YAZ_EXPORT char *data1_nodetoidsgml(data1_handle dh, data1_node *n,
YAZ_EXPORT Z_ExplainRecord *data1_nodetoexplain(data1_handle dh,
data1_node *n, int select,
ODR o);
-YAZ_EXPORT Z_BriefBib *data1_nodetosummary(data1_handle dh,
+YAZ_EXPORT Z_BriefBib *data1_nodetosummary(data1_handle dh,
data1_node *n, int select,
ODR o);
YAZ_EXPORT char *data1_nodetosoif(data1_handle dh, data1_node *n, int select,
void (*fh)(data1_handle dh,
void *h, data1_absyn *a));
-YAZ_EXPORT data1_attset *data1_attset_search_id (data1_handle dh, int id);
+YAZ_EXPORT data1_attset *data1_attset_search_id (data1_handle dh,
+ const Odr_oid *oid);
YAZ_EXPORT char *data1_getNodeValue(data1_node* node, char* pTagPath);
YAZ_EXPORT data1_node *data1_LookupNode(data1_node* node, char* pTagPath);
YAZ_EXPORT data1_node *data1_get_root_tag (data1_handle dh, data1_node *n);
YAZ_EXPORT int data1_iconv (data1_handle dh, NMEM m, data1_node *n,
- const char *tocode,
+ const char *tocode,
const char *fromcode);
YAZ_EXPORT const char *data1_get_encoding (data1_handle dh, data1_node *n);
const char *default_value);
YAZ_EXPORT void data1_concat_text(data1_handle dh, NMEM m, data1_node *n);
+YAZ_EXPORT void data1_chop_text(data1_handle dh, NMEM m, data1_node *n);
YAZ_EXPORT void data1_absyn_destroy(data1_handle dh);
+YAZ_EXPORT const char *data1_absyn_get_staticrank(data1_absyn *absyn);
+
YAZ_END_CDECL
#endif
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+