diff options
author | unknown <hf@deer.(none)> | 2004-03-12 12:04:00 +0400 |
---|---|---|
committer | unknown <hf@deer.(none)> | 2004-03-12 12:04:00 +0400 |
commit | f84ec3c062d62a2ed623461a51e7106af0a8ae22 (patch) | |
tree | cb3e50fde9831da43587ba8f7d68c19837d201a3 /sql/item_geofunc.cc | |
parent | 188535bba0964652678c3ce82b2dae3a1ef8bb25 (diff) | |
download | mariadb-git-f84ec3c062d62a2ed623461a51e7106af0a8ae22.tar.gz |
Spatial code changed to get rid of inconsistent this->* operation
Now we use virtual calls instead and redirect VMT pointer of the
geometry object with 'new' operation
sql/field.cc:
Usage of the Geometry class changed
sql/item_geofunc.cc:
Usage of the Geometry class changed
sql/spatial.cc:
Now we rewrite the real VMT of the object with new operation
sql/spatial.h:
No need for the VMT-like structure and pointers to it
sql/sql_yacc.yy:
enum items was renamed accordingly to coding standards
Diffstat (limited to 'sql/item_geofunc.cc')
-rw-r--r-- | sql/item_geofunc.cc | 253 |
1 files changed, 141 insertions, 112 deletions
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index cbf286a2101..02c0f5829fd 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -30,7 +30,8 @@ String *Item_func_geometry_from_text::val_str(String *str) { - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; String arg_val; String *wkt= args[0]->val_str(&arg_val); Gis_read_stream trs(wkt->c_ptr(), wkt->length()); @@ -43,7 +44,8 @@ String *Item_func_geometry_from_text::val_str(String *str) return 0; str->length(0); str->q_append(srid); - if ((null_value=(args[0]->null_value || geom.create_from_wkt(&trs, str, 0)))) + if ((null_value=(args[0]->null_value || + !(geom= Geometry::create_from_wkt(&buffer, &trs, str, 0))))) return 0; return str; } @@ -59,7 +61,8 @@ String *Item_func_geometry_from_wkb::val_str(String *str) { String arg_val; String *wkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; uint32 srid= 0; if ((arg_count == 2) && !args[1]->null_value) @@ -69,9 +72,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str) return 0; str->length(0); str->q_append(srid); - if ((null_value= (args[0]->null_value || - geom.create_from_wkb(wkb->ptr(), wkb->length()))) || - str->append(*wkb)) + if ((null_value= + (args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, wkb->ptr(), wkb->length())) || + str->append(*wkb)))) return 0; return str; } @@ -87,16 +91,18 @@ String *Item_func_as_wkt::val_str(String *str) { String arg_val; String *swkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; const char *dummy; - if ((null_value= (args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)))) + if ((null_value= + (args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE))))) return 0; str->length(0); - if ((null_value= geom.as_wkt(str, &dummy))) + if ((null_value= geom->as_wkt(str, &dummy))) return 0; return str; @@ -113,11 +119,13 @@ String *Item_func_as_wkb::val_str(String *str) { String arg_val; String *swkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; - if ((null_value= (args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)))) + if ((null_value= + (args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE))))) return 0; str->copy(swkb->ptr() + SRID_SIZE, swkb->length() - SRID_SIZE, @@ -135,15 +143,17 @@ void Item_func_as_wkb::fix_length_and_dec() String *Item_func_geometry_type::val_str(String *str) { String *swkb= args[0]->val_str(str); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; - if ((null_value= (args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)))) + if ((null_value= + (args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE))))) return 0; /* String will not move */ - str->set(geom.get_class_info()->m_name.str, - geom.get_class_info()->m_name.length, + str->set(geom->get_class_info()->m_name.str, + geom->get_class_info()->m_name.length, default_charset()); return str; } @@ -153,12 +163,14 @@ String *Item_func_envelope::val_str(String *str) { String arg_val; String *swkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; uint32 srid; - if ((null_value= args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE))) + if ((null_value= + args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)))) return 0; srid= uint4korr(swkb->ptr()); @@ -166,7 +178,7 @@ String *Item_func_envelope::val_str(String *str) if (str->reserve(SRID_SIZE, 512)) return 0; str->q_append(srid); - return (null_value= geom.envelope(str)) ? 0 : str; + return (null_value= geom->envelope(str)) ? 0 : str; } @@ -174,13 +186,13 @@ String *Item_func_centroid::val_str(String *str) { String arg_val; String *swkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; uint32 srid; if ((null_value= args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, centroid))) + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)))) return 0; if (str->reserve(SRID_SIZE, 512)) @@ -189,7 +201,7 @@ String *Item_func_centroid::val_str(String *str) srid= uint4korr(swkb->ptr()); str->q_append(srid); - return (null_value= test(geom.centroid(str))) ? 0 : str; + return (null_value= test(geom->centroid(str))) ? 0 : str; } @@ -201,12 +213,14 @@ String *Item_func_spatial_decomp::val_str(String *str) { String arg_val; String *swkb= args[0]->val_str(&arg_val); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; uint32 srid; - if ((null_value= (args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)))) + if ((null_value= + (args[0]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE))))) return 0; srid= uint4korr(swkb->ptr()); @@ -216,17 +230,17 @@ String *Item_func_spatial_decomp::val_str(String *str) str->q_append(srid); switch (decomp_func) { case SP_STARTPOINT: - if (!GEOM_METHOD_PRESENT(geom,start_point) || geom.start_point(str)) + if (geom->start_point(str)) goto err; break; case SP_ENDPOINT: - if (!GEOM_METHOD_PRESENT(geom,end_point) || geom.end_point(str)) + if (geom->end_point(str)) goto err; break; case SP_EXTERIORRING: - if (!GEOM_METHOD_PRESENT(geom,exterior_ring) || geom.exterior_ring(str)) + if (geom->exterior_ring(str)) goto err; break; @@ -246,12 +260,14 @@ String *Item_func_spatial_decomp_n::val_str(String *str) String arg_val; String *swkb= args[0]->val_str(&arg_val); long n= (long) args[1]->val_int(); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom= NULL; uint32 srid; - if ((null_value= (args[0]->null_value || args[1]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)))) + if ((null_value= + (args[0]->null_value || args[1]->null_value || + !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE))))) return 0; if (str->reserve(SRID_SIZE, 512)) @@ -262,18 +278,17 @@ String *Item_func_spatial_decomp_n::val_str(String *str) switch (decomp_func_n) { case SP_POINTN: - if (!GEOM_METHOD_PRESENT(geom,point_n) || geom.point_n(n,str)) + if (geom->point_n(n,str)) goto err; break; case SP_GEOMETRYN: - if (!GEOM_METHOD_PRESENT(geom,geometry_n) || geom.geometry_n(n,str)) + if (geom->geometry_n(n,str)) goto err; break; case SP_INTERIORRINGN: - if (!GEOM_METHOD_PRESENT(geom,interior_ring_n) || - geom.interior_ring_n(n,str)) + if (geom->interior_ring_n(n,str)) goto err; break; @@ -309,8 +324,8 @@ String *Item_func_point::val_str(String *str) return 0; str->length(0); - str->q_append((char)Geometry::wkbNDR); - str->q_append((uint32)Geometry::wkbPoint); + str->q_append((char)Geometry::wkb_ndr); + str->q_append((uint32)Geometry::wkb_point); str->q_append(x); str->q_append(y); return str; @@ -336,7 +351,7 @@ String *Item_func_spatial_collection::val_str(String *str) if (str->reserve(1 + 4 + 4, 512)) goto err; - str->q_append((char) Geometry::wkbNDR); + str->q_append((char) Geometry::wkb_ndr); str->q_append((uint32) coll_type); str->q_append((uint32) arg_count); @@ -346,7 +361,7 @@ String *Item_func_spatial_collection::val_str(String *str) if (args[i]->null_value) goto err; - if (coll_type == Geometry::wkbGeometryCollection) + if (coll_type == Geometry::wkb_geometrycollection) { /* In the case of GeometryCollection we don't need any checkings @@ -375,19 +390,19 @@ String *Item_func_spatial_collection::val_str(String *str) goto err; switch (coll_type) { - case Geometry::wkbMultiPoint: - case Geometry::wkbMultiLineString: - case Geometry::wkbMultiPolygon: + case Geometry::wkb_multipoint: + case Geometry::wkb_multilinestring: + case Geometry::wkb_multipolygon: if (len < WKB_HEADER_SIZE || str->append(data-WKB_HEADER_SIZE, len+WKB_HEADER_SIZE, 512)) goto err; break; - case Geometry::wkbLineString: + case Geometry::wkb_linestring: if (str->append(data, POINT_DATA_SIZE, 512)) goto err; break; - case Geometry::wkbPolygon: + case Geometry::wkb_polygon: { uint32 n_points; double x1, y1, x2, y2; @@ -439,18 +454,20 @@ longlong Item_func_spatial_rel::val_int() { String *res1= args[0]->val_str(&tmp_value1); String *res2= args[1]->val_str(&tmp_value2); - Geometry g1, g2; + Geometry_buffer buffer1, buffer2; + Geometry *g1, *g2; MBR mbr1, mbr2; const char *dummy; - if ((null_value= (args[0]->null_value || - args[1]->null_value || - g1.create_from_wkb(res1->ptr() + SRID_SIZE, - res1->length() - SRID_SIZE) || - g2.create_from_wkb(res2->ptr() + SRID_SIZE, - res2->length() - SRID_SIZE) || - g1.get_mbr(&mbr1, &dummy) || - g2.get_mbr(&mbr2, &dummy)))) + if ((null_value= + (args[0]->null_value || + args[1]->null_value || + !(g1= Geometry::create_from_wkb(&buffer1, res1->ptr() + SRID_SIZE, + res1->length() - SRID_SIZE)) || + !(g2= Geometry::create_from_wkb(&buffer2, res2->ptr() + SRID_SIZE, + res2->length() - SRID_SIZE)) || + g1->get_mbr(&mbr1, &dummy) || + g2->get_mbr(&mbr2, &dummy)))) return 0; switch (spatial_rel) { @@ -503,15 +520,16 @@ longlong Item_func_isclosed::val_int() { String tmp; String *swkb= args[0]->val_str(&tmp); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; int isclosed= 0; // In case of error null_value= (!swkb || args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom,is_closed) || - geom.is_closed(&isclosed)); + !(geom= + Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->is_closed(&isclosed)); return (longlong) isclosed; } @@ -525,14 +543,16 @@ longlong Item_func_dimension::val_int() { uint32 dim= 0; // In case of error String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; const char *dummy; null_value= (!swkb || args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - geom.dimension(&dim, &dummy)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->dimension(&dim, &dummy)); return (longlong) dim; } @@ -541,13 +561,14 @@ longlong Item_func_numinteriorring::val_int() { uint32 num= 0; // In case of error String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, num_interior_ring) || - geom.num_interior_ring(&num)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->num_interior_ring(&num)); return (longlong) num; } @@ -556,13 +577,14 @@ longlong Item_func_numgeometries::val_int() { uint32 num= 0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, num_geometries) || - geom.num_geometries(&num)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->num_geometries(&num)); return (longlong) num; } @@ -571,14 +593,15 @@ longlong Item_func_numpoints::val_int() { uint32 num= 0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || args[0]->null_value || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, num_points) || - geom.num_points(&num)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->num_points(&num)); return (longlong) num; } @@ -587,13 +610,14 @@ double Item_func_x::val() { double res= 0.0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, get_x) || - geom.get_x(&res)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->get_x(&res)); return res; } @@ -602,13 +626,14 @@ double Item_func_y::val() { double res= 0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, get_y) || - geom.get_y(&res)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->get_y(&res)); return res; } @@ -617,14 +642,15 @@ double Item_func_area::val() { double res= 0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; const char *dummy; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, area) || - geom.area(&res, &dummy)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->area(&res, &dummy)); return res; } @@ -632,24 +658,27 @@ double Item_func_glength::val() { double res= 0; // In case of errors String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE) || - !GEOM_METHOD_PRESENT(geom, length) || - geom.length(&res)); + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)) || + geom->length(&res)); return res; } longlong Item_func_srid::val_int() { String *swkb= args[0]->val_str(&value); - Geometry geom; + Geometry_buffer buffer; + Geometry *geom; - null_value= (!swkb || - geom.create_from_wkb(swkb->ptr() + SRID_SIZE, - swkb->length() - SRID_SIZE)); + null_value= !swkb || + !(geom= Geometry::create_from_wkb(&buffer, + swkb->ptr() + SRID_SIZE, + swkb->length() - SRID_SIZE)); if (null_value) return 0; |