diff options
author | unknown <monty@mashka.mysql.fi> | 2004-03-04 08:50:37 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2004-03-04 08:50:37 +0200 |
commit | afa6728a9f7c00582b3dc9e96b2dce5c4ac1e56c (patch) | |
tree | f335ad0e2c6634a947a95d62cbee9a54ee9303e8 /sql/gstream.cc | |
parent | f96960f9e1605189cc49397c64ff1cff97faedf1 (diff) | |
download | mariadb-git-afa6728a9f7c00582b3dc9e96b2dce5c4ac1e56c.tar.gz |
Optimized GIS functions
heap/hp_delete.c:
Added comments
mysql-test/r/gis.result:
Updated results after name changes (all results line are unchanged)
mysql-test/r/show_check.result:
Update test results after fix in hp_delete.cc
mysql-test/t/gis.test:
Changed table names to longer, hopefully non conflicting ones.
Added missing drop table
mysys/hash.c:
Inendation cleanup
mysys/tree.c:
Updated comments
Decrease tree->allocated on delete (for status)
sql/field.cc:
Added safety checking for GIS objects
sql/gstream.cc:
Added copyright message
Made a lot of speed/space optimizations
Changed class names to be MySQL compliant
sql/gstream.h:
Made a lot of speed/space optimizations
Changed class names to be MySQL compliant
sql/item_create.cc:
Indentation fixup
sql/item_geofunc.cc:
Use new gis interface functions and new gis class names.
Simple optimizations
Indentation fixups
Fixed a lot of unlikely but possible errors.
sql/item_geofunc.h:
Moved SRID_SIZE to spatial.h
sql/spatial.cc:
Added copyright message
Made a lot of speed/space optimizations
Changed class names to be MySQL compliant
sql/spatial.h:
Made a lot of speed/space optimizations
Changed class names to be MySQL compliant
Indentation fixes
Use bool instead of int as result type for functions that only return 0 or 1
sql/sql_string.cc:
Simple optimizations
sql/sql_string.h:
Simple cleanups
sql/structs.h:
Added LEX_STRING_WITH_INIT (needed by spatial.cc)
Diffstat (limited to 'sql/gstream.cc')
-rw-r--r-- | sql/gstream.cc | 174 |
1 files changed, 75 insertions, 99 deletions
diff --git a/sql/gstream.cc b/sql/gstream.cc index 17b85af22bd..6b1e12ec733 100644 --- a/sql/gstream.cc +++ b/sql/gstream.cc @@ -1,139 +1,115 @@ +/* Copyright (C) 2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Functions to read and parse geometrical data. + NOTE: These functions assumes that the string is end \0 terminated! +*/ + #include "mysql_priv.h" -int GTextReadStream::get_next_toc_type() const +enum Gis_read_stream::enum_tok_types Gis_read_stream::get_next_toc_type() { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - if (!(*cur)) - { + skip_space(); + if (!*m_cur) return eostream; - } - - if (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || - (*cur=='_')) - { + if (my_isvar_start(&my_charset_bin, *m_cur)) return word; - } - - if (((*cur>='0') && (*cur<='9')) || (*cur=='-') || (*cur=='+') || - (*cur=='.')) - { + if ((*m_cur >= '0' && *m_cur <= '9') || *m_cur == '-' || *m_cur == '+') return numeric; - } - - if (*cur == '(') - { + if (*m_cur == '(') return l_bra; - } - - if (*cur == ')') - { + if (*m_cur == ')') return r_bra; - } - - if (*cur == ',') - { + if (*m_cur == ',') return comma; - } - return unknown; } -const char *GTextReadStream::get_next_word(int *word_len) -{ - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - m_last_text_position = cur; - - if (!(*cur)) - { - return 0; - } - const char *wd_start = cur; - - if (((*cur<'a') || (*cur>'z')) && ((*cur<'A') || (*cur>'Z')) && (*cur!='_')) - { - return NULL; - } +bool Gis_read_stream::get_next_word(LEX_STRING *res) +{ + skip_space(); + res->str= (char*) m_cur; + /* The following will also test for \0 */ + if (!my_isvar_start(&my_charset_bin, *m_cur)) + return 1; - ++cur; + /* + We can't combine the following increment with my_isvar() because + my_isvar() is a macro that would cause side effects + */ + m_cur++; + while (my_isvar(&my_charset_bin, *m_cur)) + m_cur++; - while (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || - (*cur=='_') || ((*cur>='0') && (*cur<='9'))) - { - ++cur; - } + res->length= (uint32) (m_cur - res->str); + return 0; +} - *word_len = cur - wd_start; - m_cur = cur; +/* + Read a floating point number - return wd_start; -} + NOTE: Number must start with a digit or sign. It can't start with a decimal + point +*/ -int GTextReadStream::get_next_number(double *d) +bool Gis_read_stream::get_next_number(double *d) { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - - m_last_text_position = cur; - if (!(*cur)) - { - set_error_msg("Numeric constant expected"); - return 1; - } + char *endptr; - if (((*cur<'0') || (*cur>'9')) && (*cur!='-') && (*cur!='+') && (*cur!='.')) + skip_space(); + /* The following will also test for end \0 */ + if ((*m_cur < '0' || *m_cur > '9') && *m_cur != '-' && *m_cur != '+') { set_error_msg("Numeric constant expected"); return 1; } - char *endptr; - - *d = my_strtod(cur, &endptr); - + *d = my_strtod(m_cur, &endptr); if (endptr) - { m_cur = endptr; - } - return 0; } -char GTextReadStream::get_next_symbol() + +bool Gis_read_stream::check_next_symbol(char symbol) { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) + skip_space(); + if (*m_cur != symbol) { - cur++; - } - if (!(*cur)) - { - return 0; + char buff[32]; + strmov(buff, "'?' expected"); + buff[2]= symbol; + set_error_msg(buff); + return 1; } + m_cur++; + return 0; +} - m_cur = cur + 1; - m_last_text_position = cur; - return *cur; -} +/* + Remember error message. +*/ -void GTextReadStream::set_error_msg(const char *msg) +void Gis_read_stream::set_error_msg(const char *msg) { - size_t len = strlen(msg); - m_err_msg = (char *)my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR)); + size_t len= strlen(msg); // ok in this context + m_err_msg= (char *) my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR)); memcpy(m_err_msg, msg, len + 1); } - - |