#ifndef _CLAVE_H_
#define _CLAVE_H_
-/* Clave para agregar a un arbol B */
#include "common.h"
#include <string>
-/** Clave abstracta para manejo de Claves */
+/** Clase abstracta para manejo de Claves */
class Clave {
public:
virtual ~Clave () {}
- /** Retorna el tamaño en bytes que ocupa la clave */
+ /** Retorna el tamaño en bytes que ocupa la clave */
virtual uint Size () const = 0;
/** Retorna un array de bytes de Size() de longitud.
*
* El contenido del array es la clave en formato RAW
* para guardar en disco.
+ *
+ * El array debe ser liberado por el llamador.
*/
virtual uchar *ToArray () const = 0;
+ virtual uchar *ToRaw (uint &size) const = 0;
+
/** Retorna un clon de la clave actual */
virtual Clave *Clone () const = 0;
{
return data == ((ClaveFija&)c).data;
}
+
+uchar *ClaveFija::ToRaw (uint &size) const
+{
+ size = Size ();
+ return ToArray ();
+}
+
uint Size () const;
uchar *ToArray () const;
+ uchar *ToRaw (uint &size) const;
Clave *Clone () const;
virtual bool operator < (const Clave &c) const;
str[len] = '\0';
data = std::string ((const char *)(str));
delete [] str;
+ raw_data = data;
}
uint ClaveVariable::Size () const
{
- return data.size ()+sizeof (uint);
+ return data.size ()*sizeof (uchar)+sizeof (uint);
}
uchar *ClaveVariable::ToArray () const
uint len = data.size ();
out = new uchar[Size ()];
memcpy (out, &len, sizeof (uint));
- memcpy (out+sizeof(uint), data.c_str (), data.size ());
+ memcpy (out+sizeof(uint), data.c_str (), data.size ()*sizeof (uchar));
return out;
}
if (pos <= 0) return false;
std::string siguales = data.substr (0, pos);
- std::cout << siguales << std::endl;
int iguales = atoi (siguales.c_str ());
std::string primera_parte = c->data.substr (0, iguales);
return std::string (actual);
}
+uchar *ClaveVariable::ToRaw (uint &size) const
+{
+ uchar *out;
+ size = raw_data.size ()*sizeof (uchar)+sizeof (uint);
+ uint len = raw_data.size ();
+ out = new uchar[size];
+ memcpy (out, &len, sizeof (uint));
+ memcpy (out+sizeof(uint), raw_data.c_str (), raw_data.size ()*sizeof (uchar));
+ return out;
+}
+
uint Size () const;
uchar *ToArray () const;
+ uchar *ToRaw (uint &size) const;
Clave *Clone () const;
bool Abrev (ClaveVariable *c);
private:
std::string abreviar(std::string &primera, std::string &actual, int &iguales);
std::string data;
+ std::string raw_data;
};
#endif
std::string ViewProperties::ToRaw (BTreeData *p)
{
std::stringstream ss;
- uint size = p->Size (), i;
- uchar *arr = p->ToArray ();
+ uint size = 0, i;
+ uchar *arr = NULL;
+ if (p->GetKey ()) {
+ arr = p->GetKey ()->ToRaw (size);
+ }
for (i=0; i < size; i++) {
if (isalnum (arr[i]))
ss << ".";
}
- delete [] arr;
+ if (p->GetChild () != 0) {
+ ss << "(";
+ ss << p->GetChild ();
+ ss << ")";
+ }
+
+ if (arr)
+ delete [] arr;
return ss.str ();
}