+/* Decode the Z_SortKeySpec struct and store the whole thing in a perl hash */
+int simpleserver_SortKeySpecToHash (HV *sort_spec, Z_SortKeySpec *spec)
+{
+ Z_SortElement *element = spec->sortElement;
+
+ hv_store(sort_spec, "RELATION", 8, newSViv(*spec->sortRelation), 0);
+ hv_store(sort_spec, "CASE", 4, newSViv(*spec->caseSensitivity), 0);
+ hv_store(sort_spec, "MISSING", 7, newSViv(spec->which), 0);
+
+ if (element->which == Z_SortElement_generic)
+ {
+ Z_SortKey *key = element->u.generic;
+
+ if (key->which == Z_SortKey_sortField)
+ {
+ hv_store(sort_spec, "SORTFIELD", 9,
+ newSVpv((char *) key->u.sortField, 0), 0);
+ }
+ else if (key->which == Z_SortKey_elementSpec)
+ {
+ Z_Specification *zspec = key->u.elementSpec;
+
+ hv_store(sort_spec, "ELEMENTSPEC_TYPE", 16,
+ newSViv(zspec->which), 0);
+
+ if (zspec->which == Z_Schema_oid)
+ {
+ WRBUF elementSpec = wrbuf_alloc();
+
+ oid2str(zspec->schema.oid, elementSpec);
+ hv_store(sort_spec, "ELEMENTSPEC_VALUE", 17,
+ newSVpv(elementSpec->buf, elementSpec->pos), 0);
+ wrbuf_free(elementSpec, 1);
+ }
+ else if (zspec->which == Z_Schema_uri)
+ {
+ hv_store(sort_spec, "ELEMENTSPEC_VALUE", 17,
+ newSVpv((char *) zspec->schema.uri, 0), 0);
+ }
+ }
+ else if (key->which == Z_SortKey_sortAttributes)
+ {
+ Z_SortAttributes *attr = key->u.sortAttributes;
+
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+