MySQL 8.4.2
Source Code Documentation
|
#include <assert.h>
#include <float.h>
#include <string.h>
#include <sys/types.h>
#include <algorithm>
#include <cstddef>
#include <iterator>
#include "lex_string.h"
#include "my_byteorder.h"
#include "my_compiler.h"
#include "my_inttypes.h"
#include "mysql/components/services/bits/psi_bits.h"
#include "mysql/service_mysql_alloc.h"
#include "sql/gis/srid.h"
#include "sql/inplace_vector.h"
#include "sql_string.h"
#include "unsafe_string_append.h"
Go to the source code of this file.
Classes | |
class | point_xy |
Point with coordinates X and Y. More... | |
struct | wkb_header_st |
struct | MBR |
class | Geometry |
class | Geometry::wkb_container |
Constant storage for WKB. More... | |
class | Geometry::wkb_parser |
WKB parser, designed to traverse through WKB data from beginning of the buffer towards the end using a set of scan_xxx(), get_xxx() and skip_xxx() routines, with safety tests to avoid going beyond the buffer end. More... | |
class | Geometry::Class_info |
class | Geometry::Flags_t |
Highest byte is stores byte order, dimension, nomem and geotype as follows: bo: byte order, 1 for little endian(ndr), 0 for big endian(xdr); Currently it must be always wkb_ndr since it is MySQL's portable geometry format. More... | |
class | Gis_point |
class | Gis_wkb_vector_const_iterator< T > |
Gis_wkb_vector_const_iterator is const_iterator class for Gis_wkb_vector, and base class of Gis_wkb_vector_iterator – iterator class for Gis_wkb_vector. More... | |
class | Gis_wkb_vector_iterator< T > |
This class is the iterator class for Gis_wkb_vector, its instances can be used to mutate their referenced data element. More... | |
class | Geometry_vector< T > |
Geometry vector class. More... | |
class | Gis_wkb_vector< T > |
Gis_wkb_vector class template definition. More... | |
class | Gis_line_string |
class | Gis_polygon_ring |
class | Gis_polygon |
class | Gis_multi_point |
class | Gis_multi_line_string |
class | Gis_multi_polygon |
class | Gis_geometry_collection |
struct | Geometry_buffer |
Gis_polygon objects and Gis_wkb_vector<> objects are of same size, and Gis_point and Geometry objects are smaller. More... | |
class | WKB_scanner_event_handler |
Typedefs | |
typedef struct wkb_header_st | wkb_header |
Functions | |
void * | gis_wkb_alloc (size_t sz) |
void * | gis_wkb_fixed_alloc (size_t sz) |
void * | gis_wkb_realloc (void *p, size_t sz) |
void | gis_wkb_free (void *p) |
void | gis_wkb_raw_free (void *p) |
Geometry::wkbByteOrder | get_byte_order (const void *p0) |
void | set_byte_order (void *p0, Geometry::wkbByteOrder bo) |
Geometry::wkbType | get_wkb_geotype (const void *p0) |
Get wkbType value from WKB, the WKB is always little endian, so need platform specific conversion. More... | |
char * | write_wkb_header (void *p0, Geometry::wkbType geotype) |
char * | write_wkb_header (void *p0, Geometry::wkbType geotype, uint32 obj_count) |
char * | write_geometry_header (void *p0, gis::srid_t srid, Geometry::wkbType geotype) |
char * | write_geometry_header (void *p0, gis::srid_t srid, Geometry::wkbType geotype, uint32 obj_count) |
void | write_wkb_header (String *str, Geometry::wkbType geotype) |
void | write_wkb_header (String *str, Geometry::wkbType geotype, uint32 obj_count) |
void | write_geometry_header (String *str, gis::srid_t srid, Geometry::wkbType geotype) |
void | write_geometry_header (String *str, gis::srid_t srid, Geometry::wkbType geotype, uint32 obj_count) |
template<typename T > | |
Gis_wkb_vector_const_iterator< T > | operator+ (typename Gis_wkb_vector_const_iterator< T >::difference_type n, const Gis_wkb_vector_const_iterator< T > &itr) |
template<typename T > | |
Gis_wkb_vector_iterator< T > | operator+ (typename Gis_wkb_vector_iterator< T >::difference_type n, const Gis_wkb_vector_iterator< T > &itr) |
void * | get_packed_ptr (const Geometry *geo, size_t *pnbytes) |
Packup a polygon's outer ring and inner rings into a single chunk of memory as result. More... | |
const char * | get_packed_ptr (Geometry *geo) |
Get a polygon's WKB string's starting address. More... | |
bool | polygon_is_packed (Geometry *plgn, Geometry *mplgn) |
Check whether plgn is packed into its owner mplgn's WKB buffer. More... | |
void | own_rings (Geometry *geo) |
void | parse_wkb_data (Geometry *geom, const char *p, size_t num_geoms=0) |
Parse the wkb buffer to build the component vector m_geo_vect for geom. More... | |
Gis_polygon_ring * | outer_ring (const Geometry *g) |
const char * | wkb_scanner (THD *thd, const char *wkb, uint32 *len, uint32 geotype, bool has_hdr, WKB_scanner_event_handler *handler) |
Scan WKB byte string and notify WKB events by calling registered callbacks. More... | |
Variables | |
const uint | GEOM_DIM = 2 |
const uint | SRID_SIZE = 4 |
const uint | SIZEOF_STORED_DOUBLE = 8 |
const uint | POINT_DATA_SIZE = (SIZEOF_STORED_DOUBLE * 2) |
const uint | WKB_HEADER_SIZE = (1 + 4) |
const uint | GEOM_HEADER_SIZE = (SRID_SIZE + WKB_HEADER_SIZE) |
const uint32 | GET_SIZE_ERROR = 0xFFFFFFFFU |
typedef struct wkb_header_st wkb_header |
|
inline |
void * get_packed_ptr | ( | const Geometry * | geo0, |
size_t * | pnbytes | ||
) |
Packup a polygon's outer ring and inner rings into a single chunk of memory as result.
nbytes returns the number of bytes in WKB data. The returned WKB has no WKB header. Never call get_ptr to obtain a polygon's WKB data.
geo0 | The polygon whose WKB data we want to pack up. | |
[out] | pnbytes | Takes back the number of bytes of the packed WKB string. |
const char * get_packed_ptr | ( | Geometry * | geo0 | ) |
Get a polygon's WKB string's starting address.
The polygon is already packed so that its outer ring and inner rings point to different locations of a continuous chunk of WKB buffer.
geo0 | The already packed polygon, we want to get its data address. |
|
inline |
Get wkbType value from WKB, the WKB is always little endian, so need platform specific conversion.
p0 | WKB geometry type field address. |
void * gis_wkb_alloc | ( | size_t | sz | ) |
|
inline |
|
inline |
|
inline |
void * gis_wkb_realloc | ( | void * | p, |
size_t | sz | ||
) |
Gis_wkb_vector_const_iterator< T > operator+ | ( | typename Gis_wkb_vector_const_iterator< T >::difference_type | n, |
const Gis_wkb_vector_const_iterator< T > & | itr | ||
) |
Gis_wkb_vector_iterator< T > operator+ | ( | typename Gis_wkb_vector_iterator< T >::difference_type | n, |
const Gis_wkb_vector_iterator< T > & | itr | ||
) |
|
inline |
void own_rings | ( | Geometry * | geo | ) |
void parse_wkb_data | ( | Geometry * | geom, |
const char * | p, | ||
size_t | num_geoms | ||
) |
Parse the wkb buffer to build the component vector m_geo_vect for geom.
Set each geometry's wkb pointer into the Geometry objects inside m_geo_vect. Make it a standalone function in order to be able to access classes defined after class template Gis_wkb_vector.
geom | the geometry to analyze and parse. |
p | points to the geometry's wkb data's 1st byte, right after its wkb header if any. |
num_geoms | number of following geometries, to be used only when parsing the WKB of a polygon's inner rings because there is no WKB header for the inner rings only. |
Check whether plgn is packed into its owner mplgn's WKB buffer.
plgn | the polygon to be checked |
mplgn | the multipolygon, owner/holder of plgn. |
|
inline |
const char * wkb_scanner | ( | THD * | thd, |
const char * | wkb, | ||
uint32 * | len, | ||
uint32 | geotype, | ||
bool | has_hdr, | ||
WKB_scanner_event_handler * | handler | ||
) |
Scan WKB byte string and notify WKB events by calling registered callbacks.
wkb | a little endian WKB byte string of 'len' bytes, with or without WKB header. | |
[in] | thd | Thread context. |
[in,out] | len | remaining number of bytes of the wkb string. |
geotype | the type of the geometry to be scanned. | |
has_hdr | whether the 'wkb' point to a WKB header or right after the header. If it is true, the 'geotype' should be the same as the type in the header; otherwise, and we will use the type specified in WKB header. | |
handler | the registered WKB_scanner_event_handler object to be notified. |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
const uint GEOM_DIM = 2 |
const uint GEOM_HEADER_SIZE = (SRID_SIZE + WKB_HEADER_SIZE) |
const uint32 GET_SIZE_ERROR = 0xFFFFFFFFU |
const uint POINT_DATA_SIZE = (SIZEOF_STORED_DOUBLE * 2) |
const uint SIZEOF_STORED_DOUBLE = 8 |
const uint SRID_SIZE = 4 |
const uint WKB_HEADER_SIZE = (1 + 4) |