[Groonga-commit] groonga/groonga [master] add a input error check for geo point.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 7月 6日 (火) 14:20:43 JST


Kouhei Sutou	2010-07-06 05:20:43 +0000 (Tue, 06 Jul 2010)

  New Revision: a0528efa538a7b6fb27485dea066ddaa4200550b

  Log:
    add a input error check for geo point.
    
    A separator between latitude and longitude must be 'x':
    "LATITUDExLONGITUDE" form is valid.

  Modified files:
    lib/db.c
    test/unit/core/test-cast-basic.c

  Modified: lib/db.c (+1 -1)
===================================================================
--- lib/db.c    2010-07-06 05:06:13 +0000 (52985cb)
+++ lib/db.c    2010-07-06 05:20:43 +0000 (33a816f)
@@ -3773,7 +3773,7 @@ grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest, int addp)
         const char *cur, *str = GRN_TEXT_VALUE(src);
         const char *str_end = GRN_BULK_CURR(src);
         latitude = grn_atoi(str, str_end, &cur);
-        if (cur + 1 < str_end) {
+        if (cur[0] == 'x' && cur + 1 < str_end) {
           longitude = grn_atoi(cur + 1, str_end, &cur);
           if (cur == str_end) {
             GRN_GEO_POINT_SET(ctx, dest, latitude, longitude);

  Modified: test/unit/core/test-cast-basic.c (+31 -2)
===================================================================
--- test/unit/core/test-cast-basic.c    2010-07-06 05:06:13 +0000 (5812421)
+++ test/unit/core/test-cast-basic.c    2010-07-06 05:20:43 +0000 (42eb1f8)
@@ -1,6 +1,6 @@
 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
 /*
-  Copyright (C) 2009  Kouhei Sutou <kou****@clear*****>
+  Copyright (C) 2009-2010  Kouhei Sutou <kou****@clear*****>
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -35,6 +35,8 @@ void test_text_to_int64(void);
 void test_text_to_uint64(void);
 void test_text_to_float(void);
 void test_text_to_time(void);
+void test_text_to_geo_point(void);
+void test_text_to_geo_point_invalid(void);
 
 void data_text_error(void);
 void test_text_error(gconstpointer data);
@@ -114,12 +116,18 @@ cut_teardown(void)
 }
 
 static void
-cast_text(const gchar *text)
+set_text(const gchar *text)
 {
   grn_obj_reinit(&context, &src, GRN_DB_TEXT, 0);
   if (text) {
     GRN_TEXT_PUTS(&context, &src, text);
   }
+}
+
+static void
+cast_text(const gchar *text)
+{
+  set_text(text);
   grn_test_assert(grn_obj_cast(&context, &src, &dest, GRN_FALSE));
 }
 
@@ -236,6 +244,27 @@ test_text_to_time(void)
 }
 
 void
+test_text_to_geo_point(void)
+{
+  gint takane_latitude, takane_longitude;
+
+  grn_obj_reinit(&context, &dest, GRN_DB_WGS84_GEO_POINT, 0);
+  cast_text("130226900x503769900");
+  GRN_GEO_POINT_VALUE(&dest, takane_latitude, takane_longitude);
+  cut_assert_equal_int(130226900, takane_latitude);
+  cut_assert_equal_int(503769900, takane_longitude);
+}
+
+void
+test_text_to_geo_point_invalid(void)
+{
+  grn_obj_reinit(&context, &dest, GRN_DB_WGS84_GEO_POINT, 0);
+  set_text("130226900?503769900");
+  grn_test_assert_equal_rc(GRN_INVALID_ARGUMENT,
+                           grn_obj_cast(&context, &src, &dest, FALSE));
+}
+
+void
 data_text_error(void)
 {
 #define ADD_DATA(label, expected, type, text)           \




Groonga-commit メーリングリストの案内
Back to archive index