390.1.6
by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see... |
1 |
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
|
2 |
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
3 |
*
|
|
4 |
* Copyright (C) 2008 Sun Microsystems, Inc.
|
|
5 |
*
|
|
6 |
* This program is free software; you can redistribute it and/or modify
|
|
7 |
* it under the terms of the GNU General Public License as published by
|
|
8 |
* the Free Software Foundation; version 2 of the License.
|
|
9 |
*
|
|
10 |
* This program is distributed in the hope that it will be useful,
|
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 |
* GNU General Public License for more details.
|
|
14 |
*
|
|
15 |
* You should have received a copy of the GNU General Public License
|
|
16 |
* along with this program; if not, write to the Free Software
|
|
17 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18 |
*/
|
|
19 |
||
20 |
#include <config.h> |
|
21 |
||
22 |
#include "libdrizzle_priv.h" |
|
23 |
||
24 |
#include <libdrizzle/drizzle_data.h> |
|
25 |
#include <libdrizzle/drizzle_rows.h> |
|
26 |
#include <libdrizzle/drizzle_field.h> |
|
27 |
||
28 |
#include <assert.h> |
|
29 |
#include <stdint.h> |
|
30 |
#include <stdbool.h> |
|
31 |
#include <stdlib.h> |
|
32 |
#include <string.h> |
|
33 |
||
34 |
/***************************************************************************
|
|
35 |
Change field rows to field structs
|
|
36 |
***************************************************************************/
|
|
37 |
||
38 |
DRIZZLE_FIELD * |
|
39 |
unpack_fields(DRIZZLE_DATA *data, unsigned int fields, |
|
40 |
bool default_value) |
|
41 |
{
|
|
42 |
DRIZZLE_ROWS *row; |
|
43 |
DRIZZLE_FIELD *field,*result; |
|
44 |
uint32_t lengths[9]; /* Max of fields */ |
|
45 |
||
46 |
field= result= (DRIZZLE_FIELD*) malloc((unsigned int) sizeof(*field)*fields); |
|
47 |
if (!result) |
|
48 |
{
|
|
49 |
free_rows(data); /* Free old data */ |
|
50 |
return(0); |
|
51 |
}
|
|
52 |
memset((char*) field, 0, (unsigned int) sizeof(DRIZZLE_FIELD)*fields); |
|
53 |
||
54 |
for (row= data->data; row ; row = row->next,field++) |
|
55 |
{
|
|
56 |
unsigned char *pos; |
|
57 |
/* fields count may be wrong */
|
|
58 |
assert((unsigned int) (field - result) < fields); |
|
59 |
cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7); |
|
60 |
field->catalog= strdup((char*) row->data[0]); |
|
61 |
field->db= strdup((char*) row->data[1]); |
|
62 |
field->table= strdup((char*) row->data[2]); |
|
63 |
field->org_table= strdup((char*) row->data[3]); |
|
64 |
field->name= strdup((char*) row->data[4]); |
|
65 |
field->org_name= strdup((char*) row->data[5]); |
|
66 |
||
67 |
field->catalog_length= lengths[0]; |
|
68 |
field->db_length= lengths[1]; |
|
69 |
field->table_length= lengths[2]; |
|
70 |
field->org_table_length= lengths[3]; |
|
71 |
field->name_length= lengths[4]; |
|
72 |
field->org_name_length= lengths[5]; |
|
73 |
||
74 |
/* Unpack fixed length parts */
|
|
75 |
pos= (unsigned char*) row->data[6]; |
|
76 |
field->charsetnr= uint2korr(pos); |
|
77 |
field->length= (unsigned int) uint4korr(pos+2); |
|
78 |
field->type= (enum enum_field_types) pos[6]; |
|
79 |
field->flags= uint2korr(pos+7); |
|
80 |
field->decimals= (unsigned int) pos[9]; |
|
81 |
||
82 |
/* Test if field is Internal Number Format */
|
|
83 |
if (((field->type <= DRIZZLE_TYPE_LONGLONG) && |
|
84 |
(field->type != DRIZZLE_TYPE_TIMESTAMP)) || |
|
85 |
(field->length == 14) || |
|
86 |
(field->length == 8)) |
|
87 |
field->flags|= NUM_FLAG; |
|
88 |
if (default_value && row->data[7]) |
|
89 |
{
|
|
90 |
field->def= (char *)malloc(lengths[7]); |
|
91 |
memcpy(field->def, row->data[7], lengths[7]); |
|
92 |
field->def_length= lengths[7]; |
|
93 |
}
|
|
94 |
else
|
|
95 |
field->def=0; |
|
96 |
field->max_length= 0; |
|
97 |
}
|
|
98 |
||
99 |
free_rows(data); /* Free old data */ |
|
100 |
return(result); |
|
101 |
}
|
|
102 |
||
103 |
void free_rows(DRIZZLE_DATA *cur) |
|
104 |
{
|
|
105 |
if (cur) |
|
106 |
{
|
|
107 |
if (cur->data != NULL) |
|
108 |
{
|
|
109 |
struct st_drizzle_rows * row= cur->data; |
|
110 |
uint64_t x; |
|
111 |
for (x= 0; x< cur->rows; x++) |
|
112 |
{
|
|
113 |
struct st_drizzle_rows * next_row= row->next; |
|
114 |
free(row); |
|
115 |
row= next_row; |
|
116 |
}
|
|
117 |
}
|
|
118 |
free((unsigned char*) cur); |
|
119 |
}
|
|
120 |
}
|