summaryrefslogtreecommitdiff
path: root/storage/csv
diff options
context:
space:
mode:
authorunknown <brian@zim.(none)>2007-01-04 12:06:40 -0800
committerunknown <brian@zim.(none)>2007-01-04 12:06:40 -0800
commitc56c14f56db7e789d06a9f02e3d5e60da94ae6ac (patch)
tree95fd102911a2968fefd1daf2cf1c0c94d7e64115 /storage/csv
parent967b38a48c1dd8085c17ac2417fef9fa9eeeb07b (diff)
parent8bd11441fd5d78d31869cbfbfea4795577c37c35 (diff)
downloadmariadb-git-c56c14f56db7e789d06a9f02e3d5e60da94ae6ac.tar.gz
Merge baker@bk-internal.mysql.com:/home/bk/mysql-5.1-arch
into zim.(none):/home/brian/mysql/merge-5.1
Diffstat (limited to 'storage/csv')
-rw-r--r--storage/csv/ha_tina.cc158
1 files changed, 96 insertions, 62 deletions
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index 712c2d9d29a..0818b915618 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -462,6 +462,7 @@ int ha_tina::encode_quote(byte *buf)
my_bitmap_map *org_bitmap= dbug_tmp_use_all_columns(table, table->read_set);
buffer.length(0);
+
for (Field **field=table->field ; *field ; field++)
{
const char *ptr;
@@ -478,50 +479,58 @@ int ha_tina::encode_quote(byte *buf)
buffer.append(STRING_WITH_LEN("\"\","));
continue;
}
- else
+
+ (*field)->val_str(&attribute,&attribute);
+
+ if ((*field)->str_needs_quotes())
{
- (*field)->val_str(&attribute,&attribute);
ptr= attribute.ptr();
end_ptr= attribute.length() + ptr;
- }
- buffer.append('"');
+ buffer.append('"');
- while (ptr < end_ptr)
- {
- if (*ptr == '"')
- {
- buffer.append('\\');
- buffer.append('"');
- *ptr++;
- }
- else if (*ptr == '\r')
- {
- buffer.append('\\');
- buffer.append('r');
- *ptr++;
- }
- else if (*ptr == '\\')
+ while (ptr < end_ptr)
{
- buffer.append('\\');
- buffer.append('\\');
- *ptr++;
- }
- else if (*ptr == '\n')
- {
- buffer.append('\\');
- buffer.append('n');
- *ptr++;
+ if (*ptr == '"')
+ {
+ buffer.append('\\');
+ buffer.append('"');
+ *ptr++;
+ }
+ else if (*ptr == '\r')
+ {
+ buffer.append('\\');
+ buffer.append('r');
+ *ptr++;
+ }
+ else if (*ptr == '\\')
+ {
+ buffer.append('\\');
+ buffer.append('\\');
+ *ptr++;
+ }
+ else if (*ptr == '\n')
+ {
+ buffer.append('\\');
+ buffer.append('n');
+ *ptr++;
+ }
+ else
+ buffer.append(*ptr++);
}
- else
- buffer.append(*ptr++);
+ buffer.append('"');
+ }
+ else
+ {
+ buffer.append(attribute);
}
- buffer.append('"');
+
buffer.append(',');
}
// Remove the comma, add a line feed
buffer.length(buffer.length() - 1);
buffer.append('\n');
+
//buffer.replace(buffer.length(), 0, "\n", 1);
dbug_tmp_restore_column_map(table->read_set, org_bitmap);
@@ -601,47 +610,72 @@ int ha_tina::find_current_row(byte *buf)
buffer.length(0);
if (curr_offset < end_offset &&
file_buff->get_value(curr_offset) == '"')
- curr_offset++; // Incrementpast the first quote
- else
- goto err;
- for(;curr_offset < end_offset; curr_offset++)
{
- // Need to convert line feeds!
- if (file_buff->get_value(curr_offset) == '"' &&
- ((file_buff->get_value(curr_offset + 1) == ',') ||
- (curr_offset == end_offset -1 )))
- {
- curr_offset+= 2; // Move past the , and the "
- break;
- }
- if (file_buff->get_value(curr_offset) == '\\' &&
- curr_offset != (end_offset - 1))
+ curr_offset++; // Incrementpast the first quote
+
+ for(;curr_offset < end_offset; curr_offset++)
{
- curr_offset++;
- if (file_buff->get_value(curr_offset) == 'r')
- buffer.append('\r');
- else if (file_buff->get_value(curr_offset) == 'n' )
- buffer.append('\n');
- else if ((file_buff->get_value(curr_offset) == '\\') ||
- (file_buff->get_value(curr_offset) == '"'))
- buffer.append(file_buff->get_value(curr_offset));
- else /* This could only happed with an externally created file */
+ // Need to convert line feeds!
+ if (file_buff->get_value(curr_offset) == '"' &&
+ ((file_buff->get_value(curr_offset + 1) == ',') ||
+ (curr_offset == end_offset -1 )))
{
- buffer.append('\\');
+ curr_offset+= 2; // Move past the , and the "
+ break;
+ }
+ if (file_buff->get_value(curr_offset) == '\\' &&
+ curr_offset != (end_offset - 1))
+ {
+ curr_offset++;
+ if (file_buff->get_value(curr_offset) == 'r')
+ buffer.append('\r');
+ else if (file_buff->get_value(curr_offset) == 'n' )
+ buffer.append('\n');
+ else if ((file_buff->get_value(curr_offset) == '\\') ||
+ (file_buff->get_value(curr_offset) == '"'))
+ buffer.append(file_buff->get_value(curr_offset));
+ else /* This could only happed with an externally created file */
+ {
+ buffer.append('\\');
+ buffer.append(file_buff->get_value(curr_offset));
+ }
+ }
+ else // ordinary symbol
+ {
+ /*
+ We are at final symbol and no last quote was found =>
+ we are working with a damaged file.
+ */
+ if (curr_offset == end_offset - 1)
+ goto err;
buffer.append(file_buff->get_value(curr_offset));
}
}
- else // ordinary symbol
+ }
+ else if (my_isdigit(system_charset_info,
+ file_buff->get_value(curr_offset)))
+ {
+ for(;curr_offset < end_offset; curr_offset++)
{
- /*
- We are at final symbol and no last quote was found =>
- we are working with a damaged file.
- */
- if (curr_offset == end_offset - 1)
+ if (file_buff->get_value(curr_offset) == ',')
+ {
+ curr_offset+= 1; // Move past the ,
+ break;
+ }
+
+ if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset)))
+ buffer.append(file_buff->get_value(curr_offset));
+ else if (file_buff->get_value(curr_offset) == '.')
+ buffer.append(file_buff->get_value(curr_offset));
+ else
goto err;
- buffer.append(file_buff->get_value(curr_offset));
}
}
+ else
+ {
+ goto err;
+ }
+
if (bitmap_is_set(table->read_set, (*field)->field_index))
(*field)->store(buffer.ptr(), buffer.length(), system_charset_info);
}