# File mysql-serialize.rb, line 92 def sql_create (dbi) sql = "CREATE TABLE " + sql_quote_name(self.type.name.sub(/#<Module .*?>::/, "")) + " (" sql << sql_quote_name(@sql_primary_key.id2name) pk = self.instance_eval("@" << @sql_primary_key.id2name) if (pk.kind_of? String) # WARNING! ALERT! # The string will be truncated to 255 bytes if it is primary # key and we are using mysql!!! sql << " VARCHAR(255) " elsif (pk.kind_of? Integer) sql << " BIGINT " elsif (pk.kind_of? Float) sql << " DOUBLE " elsif (pk.kind_of? Time) sql << " TIME " elsif (pk.kind_of? Date) sql << " DATE " end sql << "PRIMARY KEY, " sql_fetch_variable_names(false).each { |name| # we already have defined the primary key # and we are going to define sql_assoc_id explicitly in a moment next if (name == @sql_primary_key.id2name) next if (name == "sql_assoc_id") sql << sql_quote_name(name) # notice that I am never trying to preserve space, always # choosing the largest available data type. val = instance_eval("@" << name) if (val.kind_of? Integer) sql << " INT, " elsif (val.kind_of? Float) sql << " DOUBLE, " elsif (val.kind_of? Time) sql << " TIME, " elsif (val.kind_of? Date) sql << " DATE, " elsif (val.kind_of? String) sql << " LONGBLOB, " elsif (val.nil?) # this *might* not be a good idea sql << " LONGBLOB, " end } sql << sql_quote_name("sql_assoc_id") << " INT NOT NULL, " sql << "INDEX (" << sql_quote_name("sql_assoc_id") << "), " sql << "FOREIGN KEY (" << sql_quote_name("sql_assoc_id") << ") " sql << "REFERENCES " << sql_quote_name("sql_ids") << "(" sql << sql_quote_name("id") << ") ON DELETE CASCADE" sql << ") TYPE = InnoDB" dbi.do_more(sql) [["array", "arr_index", false], ["hash", "key_id", true], ["assoc", nil, false]].each { |range_key_id_fk| range, key_id, fk = range_key_id_fk sql = "CREATE TABLE " << sql_quote_name(self.type.name.sub(/#<Module .*?>::/, "") + "_" + range) << " (" sql << sql_quote_name("sql_assoc_id") << " INT NOT NULL, " sql << sql_quote_name(key_id) << " INT NOT NULL, " unless key_id.nil? # assocs don't have keys - hence the nil above sql << sql_quote_name("val_id") << " INT NOT NULL, " sql << sql_quote_name("symbol") << " VARCHAR(255) NOT NULL, " # this means that instance variable names cannot exeed 255 chars sql << "INDEX (" << sql_quote_name("sql_assoc_id") << "), " if (fk) sql << "INDEX (" << sql_quote_name(key_id) << "), " end sql << "INDEX (" << sql_quote_name("val_id") << "), " sql << "FOREIGN KEY (" << sql_quote_name("sql_assoc_id") << ") " sql << "REFERENCES " << sql_quote_name("sql_ids") << "(" sql << sql_quote_name("id") << ") ON DELETE CASCADE, " if (fk) sql << "FOREIGN KEY (" << sql_quote_name(key_id) << ") " sql << "REFERENCES " << sql_quote_name("sql_ids") << "(" sql << sql_quote_name("id") << ") ON DELETE CASCADE, " end sql << "FOREIGN KEY (" << sql_quote_name("val_id") << ") " sql << "REFERENCES " << sql_quote_name("sql_ids") << "(" sql << sql_quote_name("id") << ") ON DELETE CASCADE" sql << ") TYPE = InnoDB" dbi.do_more(sql) } end