Changeset: 92efabea0bc2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=92efabea0bc2
Modified Files:
monetdb5/modules/mal/mal_mapi.c
sql/backends/monet5/sql_result.c
Branch: protocol
Log Message:
If the server and client have different endianness then the server swaps
short/int/lng/hge columns on the wire.
diffs (98 lines):
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -160,7 +160,7 @@ doChallenge(void *data)
/* generate the challenge string */
generateChallenge(challenge, 8, 12);
algos = mcrypt_getHashAlgorithms();
- // FIXME: add the newproto flag to algos and rename to 'capabilities'
to hide the crime
+ // FIXME: rename to 'capabilities' to hide the crime
// send the challenge over the block stream
mnstr_printf(fdout, "%s:mserver:9:%s:%s:%s:",
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -39,6 +39,29 @@ mystpcpy (char *yydest, const char *yysr
return yyd - 1;
}
+#ifdef _MSC_VER
+/* use intrinsic functions on Windows */
+#define short_int_SWAP(s) ((short) _byteswap_ushort((unsigned short) (s)))
+/* on Windows, long is the same size as int */
+#define normal_int_SWAP(s) ((int) _byteswap_ulong((unsigned long) (s)))
+#define long_long_SWAP(l) ((lng) _byteswap_uint64((unsigned __int64) (s)))
+#else
+#define short_int_SWAP(s) ((short)(((0x00ff&(s))<<8) | ((0xff00&(s))>>8)))
+
+#define normal_int_SWAP(i) (((0x000000ff&(i))<<24) | ((0x0000ff00&(i))<<8) | \
+ ((0x00ff0000&(i))>>8) | ((0xff000000&(i))>>24))
+#define long_long_SWAP(l) \
+ ((((lng)normal_int_SWAP(l))<<32) |\
+ (0xffffffff&normal_int_SWAP(l>>32)))
+#endif
+
+#ifdef HAVE_HGE
+#define huge_int_SWAP(h) \
+ ((((hge)long_long_SWAP(h))<<64) |\
+ (0xffffffffffffffff&long_long_SWAP(h>>64)))
+#endif
+
+
static int
dec_tostr(void *extra, char **Buf, int *len, int type, const void *a)
{
@@ -2209,10 +2232,50 @@ int mvc_export_resultset_prot10(mvc *m,
}
} else {
int atom_size = ATOMsize(mtype);
- if (strcasecmp(c->type.type->sqlname,
"decimal") == 0) {
+ if (c->type.type->eclass == EC_DEC) {
atom_size =
ATOMsize(ATOMstorage(mtype));
}
- memcpy(buf, Tloc(iterators[i].b, srow), (row -
srow) * atom_size);
+ if (mnstr_byteorder(s) != 1234) {
+ size_t j = 0;
+ switch(ATOMstorage(mtype)) {
+ case TYPE_sht: {
+ short *bufptr =
(short*) buf;
+ short *exported_values
= (short*) Tloc(iterators[i].b, srow);
+ for(j = 0; j < (row -
srow); j++) {
+ bufptr[j] =
short_int_SWAP(exported_values[j]);
+ }
+ break;
+ }
+ case TYPE_int: {
+ int *bufptr = (int*)
buf;
+ int *exported_values =
(int*) Tloc(iterators[i].b, srow);
+ for(j = 0; j < (row -
srow); j++) {
+ bufptr[j] =
normal_int_SWAP(exported_values[j]);
+ }
+ break;
+ }
+ case TYPE_lng: {
+ lng *bufptr = (lng*)
buf;
+ lng *exported_values =
(lng*) Tloc(iterators[i].b, srow);
+ for(j = 0; j < (row -
srow); j++) {
+ bufptr[j] =
long_long_SWAP(exported_values[j]);
+ }
+ break;
+ }
+#ifdef HAVE_HGE
+ case TYPE_hge: {
+ hge *bufptr = (hge*)
buf;
+ hge *exported_values =
(hge*) Tloc(iterators[i].b, srow);
+ for(j = 0; j < (row -
srow); j++) {
+ bufptr[j] =
huge_int_SWAP(exported_values[j]);
+ }
+ break;
+ }
+#endif
+ }
+ } else {
+ memcpy(buf, Tloc(iterators[i].b, srow),
(row - srow) * atom_size);
+ }
buf += (row - srow) * atom_size;
}
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list