Drizzled Public API Documentation

column.cc
Go to the documentation of this file.
00001 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab: 
00002  *
00003  *  Drizzle Client & Protocol Library
00004  *
00005  * Copyright (C) 2008 Eric Day (eday@oddments.org)
00006  * All rights reserved.
00007  *
00008  * Redistribution and use in source and binary forms, with or without
00009  * modification, are permitted provided that the following conditions are
00010  * met:
00011  *
00012  *     * Redistributions of source code must retain the above copyright
00013  * notice, this list of conditions and the following disclaimer.
00014  *
00015  *     * Redistributions in binary form must reproduce the above
00016  * copyright notice, this list of conditions and the following disclaimer
00017  * in the documentation and/or other materials provided with the
00018  * distribution.
00019  *
00020  *     * The names of its contributors may not be used to endorse or
00021  * promote products derived from this software without specific prior
00022  * written permission.
00023  *
00024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00025  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00026  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00027  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00028  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00029  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00030  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00031  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00032  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00033  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00034  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035  *
00036  */
00037 
00038 
00044 #include <libdrizzle/common.h>
00045 
00046 /*
00047  * Private variables.
00048  */
00049 
00050 static drizzle_column_type_t _column_type_drizzle_map_to[]=
00051 {
00052  DRIZZLE_COLUMN_TYPE_TINY,
00053  DRIZZLE_COLUMN_TYPE_LONG,
00054  DRIZZLE_COLUMN_TYPE_DOUBLE,
00055  DRIZZLE_COLUMN_TYPE_NULL,
00056  DRIZZLE_COLUMN_TYPE_TIMESTAMP,
00057  DRIZZLE_COLUMN_TYPE_LONGLONG,
00058  DRIZZLE_COLUMN_TYPE_DATETIME,
00059  DRIZZLE_COLUMN_TYPE_NEWDATE,
00060  DRIZZLE_COLUMN_TYPE_VARCHAR,
00061  DRIZZLE_COLUMN_TYPE_NEWDECIMAL,
00062  DRIZZLE_COLUMN_TYPE_ENUM,
00063  DRIZZLE_COLUMN_TYPE_BLOB
00064 };
00065 
00066 static drizzle_column_type_drizzle_t _column_type_drizzle_map_from[]=
00067 {
00068  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 0 */
00069  DRIZZLE_COLUMN_TYPE_DRIZZLE_BOOLEAN,
00070  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00071  DRIZZLE_COLUMN_TYPE_DRIZZLE_LONG,
00072  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00073  DRIZZLE_COLUMN_TYPE_DRIZZLE_DOUBLE,
00074  DRIZZLE_COLUMN_TYPE_DRIZZLE_NULL,
00075  DRIZZLE_COLUMN_TYPE_DRIZZLE_TIMESTAMP,
00076  DRIZZLE_COLUMN_TYPE_DRIZZLE_LONGLONG,
00077  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00078 
00079  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 10 */
00080  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00081  DRIZZLE_COLUMN_TYPE_DRIZZLE_DATETIME,
00082  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00083  DRIZZLE_COLUMN_TYPE_DRIZZLE_DATE,
00084  DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR,
00085  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00086  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00087  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00088  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00089 
00090  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 20 */
00091  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00092  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00093  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00094  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00095  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00096  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00097  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00098  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00099  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00100 
00101  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 30 */
00102  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00103  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00104  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00105  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00106  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00107  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00108  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00109  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00110  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00111 
00112  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 40 */
00113  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00114  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00115  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00116  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00117  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00118  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00119  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00120  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00121  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00122 
00123  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 50 */
00124  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00125  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00126  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00127  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00128  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00129  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00130  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00131  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00132  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00133 
00134  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 60 */
00135  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00136  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00137  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00138  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00139  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00140  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00141  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00142  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00143  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00144 
00145  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 70 */
00146  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00147  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00148  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00149  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00150  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00151  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00152  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00153  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00154  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00155 
00156  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 80 */
00157  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00158  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00159  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00160  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00161  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00162  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00163  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00164  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00165  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00166 
00167  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 90 */
00168  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00169  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00170  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00171  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00172  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00173  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00174  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00175  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00176  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00177 
00178  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 100 */
00179  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00180  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00181  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00182  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00183  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00184  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00185  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00186  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00187  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00188 
00189  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 110 */
00190  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00191  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00192  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00193  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00194  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00195  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00196  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00197  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00198  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00199 
00200  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 120 */
00201  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00202  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00203  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00204  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00205  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00206  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00207  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00208  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00209  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00210 
00211  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 130 */
00212  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00213  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00214  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00215  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00216  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00217  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00218  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00219  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00220  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00221 
00222  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 140 */
00223  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00224  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00225  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00226  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00227  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00228  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00229  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00230  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00231  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00232 
00233  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 150 */
00234  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00235  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00236  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00237  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00238  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00239  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00240  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00241  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00242  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00243 
00244  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 160 */
00245  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00246  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00247  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00248  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00249  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00250  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00251  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00252  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00253  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00254 
00255  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 170 */
00256  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00257  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00258  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00259  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00260  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00261  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00262  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00263  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00264  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00265 
00266  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 180 */
00267  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00268  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00269  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00270  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00271  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00272  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00273  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00274  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00275  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00276 
00277  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 190 */
00278  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00279  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00280  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00281  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00282  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00283  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00284  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00285  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00286  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00287 
00288  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 200 */
00289  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00290  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00291  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00292  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00293  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00294  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00295  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00296  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00297  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00298 
00299  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 210 */
00300  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00301  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00302  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00303  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00304  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00305  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00306  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00307  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00308  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00309 
00310  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 220 */
00311  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00312  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00313  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00314  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00315  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00316  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00317  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00318  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00319  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00320 
00321  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 230 */
00322  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00323  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00324  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00325  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00326  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00327  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00328  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00329  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00330  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00331 
00332  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 240 */
00333  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00334  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00335  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00336  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00337  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00338  DRIZZLE_COLUMN_TYPE_DRIZZLE_NEWDECIMAL,
00339  DRIZZLE_COLUMN_TYPE_DRIZZLE_ENUM,
00340  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00341  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00342 
00343  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX, /* 250 */
00344  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00345  DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB,
00346  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00347  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX,
00348  DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX
00349 };
00350 
00351 /*
00352  * Common definitions
00353  */
00354 
00355 drizzle_column_st *drizzle_column_create(drizzle_result_st *result,
00356                                          drizzle_column_st *column)
00357 {
00358   if (result == NULL)
00359   {
00360     return NULL;
00361   }
00362 
00363   if (column == NULL)
00364   {
00365     column= new (std::nothrow) (drizzle_column_st);
00366     if (column == NULL)
00367     {
00368       drizzle_set_error(result->con->drizzle, __func__, "Failed to allocate.");
00369       return NULL;
00370     }
00371 
00372     column->result = result;
00373     /* SET BELOW: column->next */
00374     column->prev = NULL;
00375     column->options= DRIZZLE_COLUMN_ALLOCATED;
00376     column->catalog[0] = '\0';
00377     column->db[0] = '\0';
00378     column->table[0] = '\0';
00379     column->orig_table[0] = '\0';
00380     column->name[0] = '\0';
00381     column->orig_name[0] = '\0';
00382     column->charset = 0;
00383     column->size = 0;
00384     column->max_size = 0;
00385     column->type = drizzle_column_type_t();
00386     column->flags = drizzle_column_flags_t();
00387     column->decimals = 0;
00388     /* UNSET: column->default_value */
00389     column->default_value_size = 0;
00390 
00391   }
00392   else
00393   {
00394     column->result = result;
00395     /* SET BELOW: column->next */
00396     column->prev = NULL;
00397     column->options= drizzle_column_options_t();
00398     column->catalog[0] = '\0';
00399     column->db[0] = '\0';
00400     column->table[0] = '\0';
00401     column->orig_table[0] = '\0';
00402     column->name[0] = '\0';
00403     column->orig_name[0] = '\0';
00404     column->charset = 0;
00405     column->size = 0;
00406     column->max_size = 0;
00407     column->type = drizzle_column_type_t();
00408     column->flags = drizzle_column_flags_t();
00409     column->decimals = 0;
00410     /* UNSET: column->default_value */
00411     column->default_value_size = 0;
00412   }
00413 
00414   column->result= result;
00415 
00416   if (result->column_list)
00417     result->column_list->prev= column;
00418 
00419   column->next= result->column_list;
00420   result->column_list= column;
00421 
00422   return column;
00423 }
00424 
00425 void drizzle_column_free(drizzle_column_st *column)
00426 {
00427   if (column == NULL)
00428   {
00429     return;
00430   }
00431 
00432   if (column->result->column_list == column)
00433     column->result->column_list= column->next;
00434 
00435   if (column->prev)
00436     column->prev->next= column->next;
00437 
00438   if (column->next)
00439     column->next->prev= column->prev;
00440 
00441   if (column->options & DRIZZLE_COLUMN_ALLOCATED)
00442   {
00443     delete column;
00444   }
00445 }
00446 
00447 drizzle_result_st *drizzle_column_drizzle_result(drizzle_column_st *column)
00448 {
00449   if (column == NULL)
00450   {
00451     return NULL;
00452   }
00453 
00454   return column->result;
00455 }
00456 
00457 const char *drizzle_column_catalog(drizzle_column_st *column)
00458 {
00459   if (column == NULL)
00460   {
00461     return NULL;
00462   }
00463 
00464   return column->catalog;
00465 }
00466 
00467 const char *drizzle_column_db(drizzle_column_st *column)
00468 {
00469   if (column == NULL)
00470   {
00471     return NULL;
00472   }
00473 
00474   return column->db;
00475 }
00476 
00477 const char *drizzle_column_table(drizzle_column_st *column)
00478 {
00479   if (column == NULL)
00480   {
00481     return NULL;
00482   }
00483 
00484   return column->table;
00485 }
00486 
00487 const char *drizzle_column_orig_table(drizzle_column_st *column)
00488 {
00489   if (column == NULL)
00490   {
00491     return NULL;
00492   }
00493 
00494   return column->orig_table;
00495 }
00496 
00497 const char *drizzle_column_name(drizzle_column_st *column)
00498 {
00499   if (column == NULL)
00500   {
00501     return NULL;
00502   }
00503 
00504   return column->name;
00505 }
00506 
00507 const char *drizzle_column_orig_name(drizzle_column_st *column)
00508 {
00509   if (column == NULL)
00510   {
00511     return NULL;
00512   }
00513 
00514   return column->orig_name;
00515 }
00516 
00517 drizzle_charset_t drizzle_column_charset(drizzle_column_st *column)
00518 {
00519   if (column == NULL)
00520   {
00521     return drizzle_charset_t();
00522   }
00523 
00524   return column->charset;
00525 }
00526 
00527 uint32_t drizzle_column_size(drizzle_column_st *column)
00528 {
00529   if (column == NULL)
00530   {
00531     return 0;
00532   }
00533 
00534   return column->size;
00535 }
00536 
00537 size_t drizzle_column_max_size(drizzle_column_st *column)
00538 {
00539   if (column == NULL)
00540   {
00541     return 0;
00542   }
00543 
00544   return column->max_size;
00545 }
00546 
00547 void drizzle_column_set_max_size(drizzle_column_st *column, size_t size)
00548 {
00549   if (column == NULL)
00550   {
00551     return;
00552   }
00553 
00554   column->max_size= size;
00555 }
00556 
00557 drizzle_column_type_t drizzle_column_type(drizzle_column_st *column)
00558 {
00559   if (column == NULL)
00560   {
00561     return drizzle_column_type_t();
00562   }
00563 
00564   return column->type;
00565 }
00566 
00567 drizzle_column_type_drizzle_t
00568 drizzle_column_type_drizzle(drizzle_column_st *column)
00569 {
00570   if (column == NULL)
00571   {
00572     return drizzle_column_type_drizzle_t();
00573   }
00574 
00575   return _column_type_drizzle_map_from[column->type];
00576 }
00577 
00578 drizzle_column_flags_t drizzle_column_flags(drizzle_column_st *column)
00579 {
00580   if (column == NULL)
00581   {
00582     return drizzle_column_flags_t();
00583   }
00584 
00585   return drizzle_column_flags_t(column->flags);
00586 }
00587 
00588 uint8_t drizzle_column_decimals(drizzle_column_st *column)
00589 {
00590   if (column == NULL)
00591   {
00592     return 0;
00593   }
00594 
00595   return column->decimals;
00596 }
00597 
00598 const uint8_t *drizzle_column_default_value(drizzle_column_st *column,
00599                                             size_t *size)
00600 {
00601   if (column == NULL)
00602   {
00603     return NULL;
00604   }
00605 
00606   *size= column->default_value_size;
00607   return column->default_value;
00608 }
00609 
00610 /*
00611  * Client definitions
00612  */
00613 
00614 drizzle_return_t drizzle_column_skip(drizzle_result_st *result)
00615 {
00616   if (result == NULL)
00617   {
00618     return DRIZZLE_RETURN_INVALID_ARGUMENT;
00619   }
00620 
00621   drizzle_return_t ret;
00622   if (drizzle_state_none(result->con))
00623   {
00624     result->options|= int(DRIZZLE_RESULT_SKIP_COLUMN);
00625 
00626     drizzle_state_push(result->con, drizzle_state_column_read);
00627     drizzle_state_push(result->con, drizzle_state_packet_read);
00628   }
00629   ret= drizzle_state_loop(result->con);
00630   result->options&= ~int(DRIZZLE_RESULT_SKIP_COLUMN);
00631   return ret;
00632 }
00633 
00634 drizzle_return_t drizzle_column_skip_all(drizzle_result_st *result)
00635 {
00636   if (result == NULL)
00637   {
00638     return DRIZZLE_RETURN_INVALID_ARGUMENT;
00639   }
00640 
00641   for (uint16_t it= 1; it <= result->column_count; it++)
00642   {
00643     drizzle_return_t ret= drizzle_column_skip(result);
00644 
00645     if (ret != DRIZZLE_RETURN_OK)
00646     {
00647       return ret;
00648     }
00649   }
00650 
00651   return DRIZZLE_RETURN_OK;
00652 }
00653 
00654 drizzle_column_st *drizzle_column_read(drizzle_result_st *result,
00655                                        drizzle_column_st *column,
00656                                        drizzle_return_t *ret_ptr)
00657 {
00658   drizzle_return_t unused_ret;
00659   if (ret_ptr == NULL)
00660   {
00661     ret_ptr= &unused_ret;
00662   }
00663 
00664   if (result == NULL)
00665   {
00666     return NULL;
00667   }
00668 
00669   if (drizzle_state_none(result->con))
00670   {
00671     result->column= column;
00672 
00673     drizzle_state_push(result->con, drizzle_state_column_read);
00674     drizzle_state_push(result->con, drizzle_state_packet_read);
00675   }
00676 
00677   *ret_ptr= drizzle_state_loop(result->con);
00678 
00679   return result->column;
00680 }
00681 
00682 drizzle_return_t drizzle_column_buffer(drizzle_result_st *result)
00683 {
00684   if (result == NULL)
00685   {
00686     return DRIZZLE_RETURN_INVALID_ARGUMENT;
00687   }
00688 
00689   drizzle_return_t ret;
00690 
00691   if (result->column_buffer == NULL)
00692   {
00693     if (result->column_count == 0)
00694     {
00695       result->options|= int(DRIZZLE_RESULT_BUFFER_COLUMN);
00696       return DRIZZLE_RETURN_OK;
00697     }
00698 
00699     result->column_buffer= new (std::nothrow) drizzle_column_st[result->column_count];
00700     if (result->column_buffer == NULL)
00701     {
00702       drizzle_set_error(result->con->drizzle, __func__, "Failed to allocate.");
00703 
00704       return DRIZZLE_RETURN_MEMORY;
00705     }
00706   }
00707 
00708   /* No while body, just keep calling to buffer columns. */
00709   while (drizzle_column_read(result,
00710                              &(result->column_buffer[result->column_current]),
00711                              &ret) != NULL && ret == DRIZZLE_RETURN_OK);
00712   if (ret == DRIZZLE_RETURN_OK)
00713   {
00714     result->column_current= 0;
00715     result->options|= DRIZZLE_RESULT_BUFFER_COLUMN;
00716   }
00717 
00718   return ret;
00719 }
00720 
00721 drizzle_column_st *drizzle_column_next(drizzle_result_st *result)
00722 {
00723   if (result == NULL)
00724   {
00725     return NULL;
00726   }
00727 
00728   if (result->column_current == result->column_count)
00729   {
00730     return NULL;
00731   }
00732 
00733   result->column_current++;
00734   return &(result->column_buffer[result->column_current - 1]);
00735 }
00736 
00737 drizzle_column_st *drizzle_column_prev(drizzle_result_st *result)
00738 {
00739   if (result == NULL)
00740   {
00741     return NULL;
00742   }
00743 
00744   if (result->column_current == 0)
00745   {
00746     return NULL;
00747   }
00748 
00749   result->column_current--;
00750   return &(result->column_buffer[result->column_current]);
00751 }
00752 
00753 void drizzle_column_seek(drizzle_result_st *result, uint16_t column)
00754 {
00755   if (result == NULL)
00756   {
00757     return;
00758   }
00759 
00760   if (column <= result->column_count)
00761   {
00762     result->column_current= column;
00763   }
00764 }
00765 
00766 drizzle_column_st *drizzle_column_index(drizzle_result_st *result,
00767                                         uint16_t column)
00768 {
00769   if (result == NULL)
00770   {
00771     return NULL;
00772   }
00773 
00774   if (column >= result->column_count)
00775   {
00776     return NULL;
00777   }
00778 
00779   return &(result->column_buffer[column]);
00780 }
00781 
00782 uint16_t drizzle_column_current(drizzle_result_st *result)
00783 {
00784   if (result == NULL)
00785   {
00786     return 0;
00787   }
00788 
00789   return result->column_current;
00790 }
00791 
00792 /*
00793  * Server definitions
00794  */
00795 
00796 drizzle_return_t drizzle_column_write(drizzle_result_st *result,
00797                                       drizzle_column_st *column)
00798 {
00799   if (result == NULL)
00800   {
00801     return DRIZZLE_RETURN_INVALID_ARGUMENT;
00802   }
00803 
00804   if (drizzle_state_none(result->con))
00805   {
00806     result->column= column;
00807 
00808     drizzle_state_push(result->con, drizzle_state_column_write);
00809   }
00810 
00811   return drizzle_state_loop(result->con);
00812 }
00813 
00814 void drizzle_column_set_catalog(drizzle_column_st *column, const char *catalog)
00815 {
00816   if (column == NULL)
00817   {
00818     return;
00819   }
00820 
00821   if (catalog == NULL)
00822   {
00823     column->catalog[0]= 0;
00824   }
00825   else
00826   {
00827     strncpy(column->catalog, catalog, DRIZZLE_MAX_CATALOG_SIZE);
00828     column->catalog[DRIZZLE_MAX_CATALOG_SIZE - 1]= 0;
00829   }
00830 }
00831 
00832 void drizzle_column_set_db(drizzle_column_st *column, const char *db)
00833 {
00834   if (column == NULL)
00835   {
00836     return;
00837   }
00838 
00839   if (db == NULL)
00840   {
00841     column->db[0]= 0;
00842   }
00843   else
00844   {
00845     strncpy(column->db, db, DRIZZLE_MAX_DB_SIZE);
00846     column->db[DRIZZLE_MAX_DB_SIZE - 1]= 0;
00847   }
00848 }
00849 
00850 void drizzle_column_set_table(drizzle_column_st *column, const char *table)
00851 {
00852   if (column == NULL)
00853   {
00854     return;
00855   }
00856 
00857   if (table == NULL)
00858   {
00859     column->table[0]= 0;
00860   }
00861   else
00862   {
00863     strncpy(column->table, table, DRIZZLE_MAX_TABLE_SIZE);
00864     column->table[DRIZZLE_MAX_TABLE_SIZE - 1]= 0;
00865   }
00866 }
00867 
00868 void drizzle_column_set_orig_table(drizzle_column_st *column,
00869                                    const char *orig_table)
00870 {
00871   if (column == NULL)
00872   {
00873     return;
00874   }
00875 
00876   if (orig_table == NULL)
00877   {
00878     column->orig_table[0]= 0;
00879   }
00880   else
00881   {
00882     strncpy(column->orig_table, orig_table, DRIZZLE_MAX_TABLE_SIZE);
00883     column->orig_table[DRIZZLE_MAX_TABLE_SIZE - 1]= 0;
00884   }
00885 }
00886 
00887 void drizzle_column_set_name(drizzle_column_st *column, const char *name)
00888 {
00889   if (column == NULL)
00890   {
00891     return;
00892   }
00893 
00894   if (name == NULL)
00895   {
00896     column->name[0]= 0;
00897   }
00898   else
00899   {
00900     strncpy(column->name, name, DRIZZLE_MAX_COLUMN_NAME_SIZE);
00901     column->name[DRIZZLE_MAX_COLUMN_NAME_SIZE - 1]= 0;
00902   }
00903 }
00904 
00905 void drizzle_column_set_orig_name(drizzle_column_st *column,
00906                                   const char *orig_name)
00907 {
00908   if (orig_name == NULL)
00909     column->orig_name[0]= 0;
00910   else
00911   {
00912     strncpy(column->orig_name, orig_name, DRIZZLE_MAX_COLUMN_NAME_SIZE);
00913     column->orig_name[DRIZZLE_MAX_COLUMN_NAME_SIZE - 1]= 0;
00914   }
00915 }
00916 
00917 void drizzle_column_set_charset(drizzle_column_st *column,
00918                                 drizzle_charset_t charset)
00919 {
00920   if (column == NULL)
00921   {
00922     return;
00923   }
00924 
00925   column->charset= charset;
00926 }
00927 
00928 void drizzle_column_set_size(drizzle_column_st *column, uint32_t size)
00929 {
00930   if (column == NULL)
00931   {
00932     return;
00933   }
00934 
00935   column->size= size;
00936 }
00937 
00938 void drizzle_column_set_type(drizzle_column_st *column,
00939                              drizzle_column_type_t type)
00940 {
00941   if (column == NULL)
00942   {
00943     return;
00944   }
00945 
00946   column->type= type;
00947 }
00948 
00949 void drizzle_column_set_flags(drizzle_column_st *column,
00950                               drizzle_column_flags_t flags)
00951 {
00952   if (column == NULL)
00953   {
00954     return;
00955   }
00956 
00957   column->flags= flags;
00958 }
00959 
00960 void drizzle_column_set_decimals(drizzle_column_st *column, uint8_t decimals)
00961 {
00962   if (column == NULL)
00963   {
00964     return;
00965   }
00966 
00967   column->decimals= decimals;
00968 }
00969 
00970 void drizzle_column_set_default_value(drizzle_column_st *column,
00971                                       const uint8_t *default_value,
00972                                       size_t size)
00973 {
00974   if (column == NULL)
00975   {
00976     return;
00977   }
00978 
00979   if (default_value == NULL)
00980   {
00981     column->default_value[0]= 0;
00982   }
00983   else
00984   {
00985     if (size < DRIZZLE_MAX_DEFAULT_VALUE_SIZE)
00986     {
00987       memcpy(column->default_value, default_value, size);
00988       column->default_value[size]= 0;
00989       column->default_value_size= size;
00990     }
00991     else
00992     {
00993       memcpy(column->default_value, default_value,
00994              DRIZZLE_MAX_DEFAULT_VALUE_SIZE - 1);
00995       column->default_value[DRIZZLE_MAX_DEFAULT_VALUE_SIZE - 1]= 0;
00996       column->default_value_size= DRIZZLE_MAX_DEFAULT_VALUE_SIZE;
00997     }
00998   }
00999 }
01000 
01001 /*
01002  * Internal state functions.
01003  */
01004 
01005 drizzle_return_t drizzle_state_column_read(drizzle_con_st *con)
01006 {
01007   if (con == NULL)
01008   {
01009     return DRIZZLE_RETURN_INVALID_ARGUMENT;
01010   }
01011 
01012   drizzle_column_st *column;
01013   drizzle_column_type_drizzle_t drizzle_type;
01014 
01015   drizzle_log_debug(con->drizzle, "drizzle_state_column_read");
01016 
01017   /* Assume the entire column packet will fit in the buffer. */
01018   if (con->buffer_size < con->packet_size)
01019   {
01020     drizzle_state_push(con, drizzle_state_read);
01021     return DRIZZLE_RETURN_OK;
01022   }
01023 
01024   if (con->packet_size == 5 && con->buffer_ptr[0] == 254)
01025   {
01026     /* EOF packet marking end of columns. */
01027     con->result->column= NULL;
01028     con->result->warning_count= drizzle_get_byte2(con->buffer_ptr + 1);
01029     con->status= drizzle_con_status_t(drizzle_get_byte2(con->buffer_ptr + 3));
01030     con->buffer_ptr+= 5;
01031     con->buffer_size-= 5;
01032 
01033     drizzle_state_pop(con);
01034   }
01035   else if (con->result->options & DRIZZLE_RESULT_SKIP_COLUMN)
01036   {
01037     con->buffer_ptr+= con->packet_size;
01038     con->buffer_size-= con->packet_size;
01039     con->packet_size= 0;
01040     con->result->column_current++;
01041 
01042     drizzle_state_pop(con);
01043   }
01044   else
01045   {
01046     column= drizzle_column_create(con->result, con->result->column);
01047     if (column == NULL)
01048       return DRIZZLE_RETURN_MEMORY;
01049 
01050     con->result->column= column;
01051 
01052     /* These functions can only fail if they need to read data, but we know we
01053        buffered the entire packet, so ignore returns. */
01054     (void)drizzle_unpack_string(con, column->catalog, DRIZZLE_MAX_CATALOG_SIZE);
01055     (void)drizzle_unpack_string(con, column->db, DRIZZLE_MAX_DB_SIZE);
01056     (void)drizzle_unpack_string(con, column->table, DRIZZLE_MAX_TABLE_SIZE);
01057     (void)drizzle_unpack_string(con, column->orig_table,
01058                                 DRIZZLE_MAX_TABLE_SIZE);
01059     (void)drizzle_unpack_string(con, column->name,
01060                                 DRIZZLE_MAX_COLUMN_NAME_SIZE);
01061     (void)drizzle_unpack_string(con, column->orig_name,
01062                                 DRIZZLE_MAX_COLUMN_NAME_SIZE);
01063 
01064     /* Skip one filler byte. */
01065     column->charset= (drizzle_charset_t)drizzle_get_byte2(con->buffer_ptr + 1);
01066     column->size= drizzle_get_byte4(con->buffer_ptr + 3);
01067 
01068     if (con->options & DRIZZLE_CON_MYSQL)
01069     {
01070       column->type= drizzle_column_type_t(con->buffer_ptr[7]);
01071     }
01072     else
01073     {
01074       drizzle_type= drizzle_column_type_drizzle_t(con->buffer_ptr[7]);
01075       if (drizzle_type >= DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX)
01076         drizzle_type= DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX;
01077       column->type= _column_type_drizzle_map_to[drizzle_type];
01078     }
01079 
01080     column->flags= drizzle_column_flags_t(drizzle_get_byte2(con->buffer_ptr + 8));
01081     if (column->type <= DRIZZLE_COLUMN_TYPE_INT24 &&
01082         column->type != DRIZZLE_COLUMN_TYPE_TIMESTAMP)
01083     {
01084       column->flags|= int(DRIZZLE_COLUMN_FLAGS_NUM);
01085     }
01086 
01087     column->decimals= con->buffer_ptr[10];
01088     /* Skip two reserved bytes. */
01089 
01090     con->buffer_ptr+= 13;
01091     con->buffer_size-= 13;
01092     con->packet_size-= 13;
01093 
01094     if (con->packet_size > 0)
01095     {
01096       drizzle_column_set_default_value(column, con->buffer_ptr,
01097                                        con->packet_size);
01098 
01099       con->buffer_ptr+= con->packet_size;
01100       con->buffer_size-= con->packet_size;
01101     }
01102     else
01103       column->default_value[0]= 0;
01104 
01105     con->result->column_current++;
01106 
01107     drizzle_state_pop(con);
01108   }
01109 
01110   return DRIZZLE_RETURN_OK;
01111 }
01112 
01113 drizzle_return_t drizzle_state_column_write(drizzle_con_st *con)
01114 {
01115   if (con == NULL)
01116   {
01117     return DRIZZLE_RETURN_INVALID_ARGUMENT;
01118   }
01119 
01120   uint8_t *start= con->buffer_ptr + con->buffer_size;
01121   uint8_t *ptr;
01122   drizzle_column_st *column= con->result->column;
01123 
01124   drizzle_log_debug(con->drizzle, "drizzle_state_column_write");
01125 
01126   /* Calculate max packet size. */
01127   con->packet_size= 9 + strlen(column->catalog)
01128                   + 9 + strlen(column->db)
01129                   + 9 + strlen(column->table)
01130                   + 9 + strlen(column->orig_table)
01131                   + 9 + strlen(column->name)
01132                   + 9 + strlen(column->orig_name)
01133                   + 1   /* Unused */
01134                   + 2   /* Charset */
01135                   + 4   /* Size */
01136                   + 1   /* Type */
01137                   + 2   /* Flags */
01138                   + 1   /* Decimals */
01139                   + 2   /* Unused */
01140                   + column->default_value_size;
01141 
01142   /* Assume the entire column packet will fit in the buffer. */
01143   if ((con->packet_size + 4) > DRIZZLE_MAX_BUFFER_SIZE)
01144   {
01145     drizzle_set_error(con->drizzle, "drizzle_state_column_write",
01146                       "buffer too small:%zu", con->packet_size + 4);
01147     return DRIZZLE_RETURN_INTERNAL_ERROR;
01148   }
01149 
01150   /* Flush buffer if there is not enough room. */
01151   if (((size_t)DRIZZLE_MAX_BUFFER_SIZE - (size_t)(start - con->buffer)) <
01152       con->packet_size)
01153   {
01154     drizzle_state_push(con, drizzle_state_write);
01155     return DRIZZLE_RETURN_OK;
01156   }
01157 
01158   /* Store packet size at the end since it may change. */
01159   ptr= start;
01160   ptr[3]= con->packet_number;
01161   con->packet_number++;
01162   ptr+= 4;
01163 
01164   ptr= drizzle_pack_string(column->catalog, ptr);
01165   ptr= drizzle_pack_string(column->db, ptr);
01166   ptr= drizzle_pack_string(column->table, ptr);
01167   ptr= drizzle_pack_string(column->orig_table, ptr);
01168   ptr= drizzle_pack_string(column->name, ptr);
01169   ptr= drizzle_pack_string(column->orig_name, ptr);
01170 
01171   /* This unused byte is set to 12 for some reason. */
01172   ptr[0]= 12;
01173   ptr++;
01174 
01175   drizzle_set_byte2(ptr, column->charset);
01176   ptr+= 2;
01177 
01178   drizzle_set_byte4(ptr, column->size);
01179   ptr+= 4;
01180 
01181   if (con->options & DRIZZLE_CON_MYSQL)
01182   {
01183     ptr[0]= column->type;
01184   }
01185   else
01186   {
01187     ptr[0]= _column_type_drizzle_map_from[column->type];
01188   }
01189   ptr++;
01190 
01191   drizzle_set_byte2(ptr, column->flags);
01192   ptr+= 2;
01193 
01194   ptr[0]= column->decimals;
01195   ptr++;
01196 
01197   memset(ptr, 0, 2);
01198   ptr+= 2;
01199 
01200   if (column->default_value_size > 0)
01201   {
01202     memcpy(ptr, column->default_value, column->default_value_size);
01203     ptr+= column->default_value_size;
01204   }
01205 
01206   con->packet_size= ((size_t)(ptr - start) - 4);
01207   con->buffer_size+= (4 + con->packet_size);
01208 
01209   /* Store packet size now. */
01210   drizzle_set_byte3(start, con->packet_size);
01211 
01212   con->result->column_current++;
01213 
01214   drizzle_state_pop(con);
01215 
01216   return DRIZZLE_RETURN_OK;
01217 }