首页 / MYSQL / mysql_create_frm
mysql_create_frm
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql_create_frm,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10227字,纯文字阅读大概需要15分钟。
内容图文
![mysql_create_frm](/upload/InfoBanner/zyjiaocheng/460/1be22807d63047f68347a5aa6bb15025.jpg)
/* Pack keyinfo and keynames to keybuff for save in form-file. */ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo, ulong data_offset) { uint key_parts,length; uchar *pos, *keyname_pos; KEY *key,*end; KEY_PART_INFO *key_part,*key_part_end; DBUG_ENTER("pack_keys"); pos=keybuff+6; key_parts=0; for (key=keyinfo,end=keyinfo+key_count ; key != end ; key++) { int2store(pos, (key->flags ^ HA_NOSAME)); int2store(pos+2,key->key_length); pos[4]= (uchar) key->key_parts; pos[5]= (uchar) key->algorithm; int2store(pos+6, key->block_size); pos+=8; key_parts+=key->key_parts; DBUG_PRINT("loop", ("flags: %lu key_parts: %d at 0x%lx", key->flags, key->key_parts, (long) key->key_part)); for (key_part=key->key_part,key_part_end=key_part+key->key_parts ; key_part != key_part_end ; key_part++) { uint offset; DBUG_PRINT("loop",("field: %d startpos: %lu length: %d", key_part->fieldnr, key_part->offset + data_offset, key_part->length)); int2store(pos,key_part->fieldnr+1+FIELD_NAME_USED); offset= (uint) (key_part->offset+data_offset+1); int2store(pos+2, offset); pos[4]=0; // Sort order int2store(pos+5,key_part->key_type); int2store(pos+7,key_part->length); pos+=9; } } /* Save keynames */ keyname_pos=pos; *pos++=(uchar) NAMES_SEP_CHAR; for (key=keyinfo ; key != end ; key++) { uchar *tmp=(uchar*) strmov((char*) pos,key->name); *tmp++= (uchar) NAMES_SEP_CHAR; *tmp=0; pos=tmp; } *(pos++)=0; for (key=keyinfo,end=keyinfo+key_count ; key != end ; key++) { if (key->flags & HA_USES_COMMENT) { int2store(pos, key->comment.length); uchar *tmp= (uchar*)strnmov((char*) pos+2,key->comment.str, key->comment.length); pos= tmp; } } if (key_count > 127 || key_parts > 127) { keybuff[0]= (key_count & 0x7f) | 0x80; keybuff[1]= key_count >> 7; int2store(keybuff+2,key_parts); } else { keybuff[0]=(uchar) key_count; keybuff[1]=(uchar) key_parts; keybuff[2]= keybuff[3]= 0; } length=(uint) (pos-keyname_pos); int2store(keybuff+4,length); DBUG_RETURN((uint) (pos-keybuff)); } /* pack_keys */
/* Save fields, fieldnames and intervals */ static bool pack_fields(File file, List<Create_field> &create_fields, ulong data_offset) { reg2 uint i; uint int_count, comment_length=0; uchar buff[MAX_FIELD_WIDTH]; Create_field *field; DBUG_ENTER("pack_fields"); /* Write field info */ List_iterator<Create_field> it(create_fields); int_count=0; while ((field=it++)) { uint recpos; buff[0]= (uchar) field->row; buff[1]= (uchar) field->col; buff[2]= (uchar) field->sc_length; int2store(buff+3, field->length); /* The +1 is here becasue the col offset in .frm file have offset 1 */ recpos= field->offset+1 + (uint) data_offset; int3store(buff+5,recpos); int2store(buff+8,field->pack_flag); DBUG_ASSERT(field->unireg_check < 256); buff[10]= (uchar) field->unireg_check; buff[12]= (uchar) field->interval_id; buff[13]= (uchar) field->sql_type; if (field->sql_type == MYSQL_TYPE_GEOMETRY) { buff[11]= 0; buff[14]= (uchar) field->geom_type; #ifndef HAVE_SPATIAL DBUG_ASSERT(0); // Should newer happen #endif } else if (field->charset) { buff[11]= (uchar) (field->charset->number >> 8); buff[14]= (uchar) field->charset->number; } else { buff[11]= buff[14]= 0; // Numerical } int2store(buff+15, field->comment.length); comment_length+= field->comment.length; set_if_bigger(int_count,field->interval_id); if (mysql_file_write(file, buff, FCOMP, MYF_RW)) DBUG_RETURN(1); } /* Write fieldnames */ buff[0]=(uchar) NAMES_SEP_CHAR; if (mysql_file_write(file, buff, 1, MYF_RW)) DBUG_RETURN(1); i=0; it.rewind(); while ((field=it++)) { char *pos= strmov((char*) buff,field->field_name); *pos++=NAMES_SEP_CHAR; if (i == create_fields.elements-1) *pos++=0; if (mysql_file_write(file, buff, (size_t) (pos-(char*) buff), MYF_RW)) DBUG_RETURN(1); i++; } /* Write intervals */ if (int_count) { String tmp((char*) buff,sizeof(buff), &my_charset_bin); tmp.length(0); it.rewind(); int_count=0; while ((field=it++)) { if (field->interval_id > int_count) { unsigned char sep= 0; unsigned char occ[256]; uint i; unsigned char *val= NULL; bzero(occ, sizeof(occ)); for (i=0; (val= (unsigned char*) field->interval->type_names[i]); i++) for (uint j = 0; j < field->interval->type_lengths[i]; j++) occ[(unsigned int) (val[j])]= 1; if (!occ[(unsigned char)NAMES_SEP_CHAR]) sep= (unsigned char) NAMES_SEP_CHAR; else if (!occ[(unsigned int)‘,‘]) sep= ‘,‘; else { for (uint i=1; i<256; i++) { if(!occ[i]) { sep= i; break; } } if(!sep) /* disaster, enum uses all characters, none left as separator */ { my_message(ER_WRONG_FIELD_TERMINATORS,ER(ER_WRONG_FIELD_TERMINATORS), MYF(0)); DBUG_RETURN(1); } } int_count= field->interval_id; tmp.append(sep); for (const char **pos=field->interval->type_names ; *pos ; pos++) { tmp.append(*pos); tmp.append(sep); } tmp.append(‘\0‘); // End of intervall } } if (mysql_file_write(file, (uchar*) tmp.ptr(), tmp.length(), MYF_RW)) DBUG_RETURN(1); } if (comment_length) { it.rewind(); int_count=0; while ((field=it++)) { if (field->comment.length) if (mysql_file_write(file, (uchar*) field->comment.str, field->comment.length, MYF_RW)) DBUG_RETURN(1); } } DBUG_RETURN(0); }
mysql_create_frm
标签:
本文系统来源:http://www.cnblogs.com/taek/p/5081174.html
内容总结
以上是互联网集市为您收集整理的mysql_create_frm全部内容,希望文章能够帮你解决mysql_create_frm所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。