OSDN Git Service

init.jsでテーブルの定義を行うようにした
authorkonekoneko <jbh03215@hotmail.co.jp>
Sun, 5 May 2013 05:15:07 +0000 (14:15 +0900)
committerkonekoneko <jbh03215@hotmail.co.jp>
Sun, 5 May 2013 05:15:07 +0000 (14:15 +0900)
configure.js
init.js [new file with mode: 0644]
init.sql
profile.js
public/profile/edit.ejs
public/profile/registor.ejs
readme.html

index e5a61aa..23a945a 100644 (file)
 \r
        showip : false, //IPアドレスを表示するなら真。そうでないなら、偽\r
 \r
-       //詳細画面と編集画面に表示するフィールド名と表示名の組み合わせ\r
+       //詳細画面と編集画面に表示するフィールド名と表示名の組み合わせおよびテーブル定義\r
        //表示される順番はこの変数によって決まります\r
-       //連想配列の名称と型はinit.sqlと一致させること\r
        //\r
        //name 表示名を指定する\r
        //type データ型を指定する。指定可能な型は以下の通り\r
        //      text    文字列型を受け付ける\r
        //      password        パスワードとして指定できるものを受け付ける。デフォルトではすべての文字列です\r
-       //      number  数値型を受け付ける\r
+       //      number  符号付数値型を受け付ける\r
+       //      unsignednumber  符号なし数値型を受け付ける\r
        //      textarea        改行を含む文字列型を受け付ける\r
+       //      bool    BOOL型を受け付ける\r
+       //      datetime        DATETIME型を受け付ける\r
+       //length 長さを指定する\r
+       //      numberの場合、2がSMALLINT、4がINTに対応する\r
+       //      textとpasswordの場合、最大長を指定する\r
+       //defaultvalue デフォルト値を指定する\r
+       //primary プライマリーキーとして指定するなら真。そうでないなら偽\r
+       //isnotempty:真なら必須メンバーであることを表し、そうでないなら空欄でも構わないことを表す\r
        //visible 詳細画面に表示するなら真。そうでないなら偽\r
-       //rule バリテーション時のルール\r
-       // 関数もしくは連想配列を指定する\r
-       // 関数を指定した場合は成功時にnullを返す\r
-       // 連想配列にしていできるメンバーは以下の通り\r
-       //  isnotempty:真なら必須メンバーであることを表し、そうでないなら空欄でも構わないことを表す\r
+       //visible_edit 編集画面に表示するなら真。そうでないなら偽\r
+       //rule バリテーション時に実行される関数を指定する\r
+       // 実行される関数でバリテーションが成功した場合、nullを返さなければならない\r
        alias : {\r
+       //name以外の項目を編集しないでください。正常に動作しなくなります\r
+       //ここから\r
+               name_hash:\r
+                       {\r
+                               name : "名前(ハッシュ)",\r
+                               type : "unsignednumber",\r
+                               length : 4,\r
+                               primary : true,\r
+                               visible : false,\r
+                               visible_edit : false,\r
+                               isnotempty : true\r
+                       },\r
                name :\r
                        {\r
                                name : "名前",\r
                                type : "text",\r
                                visible : true,\r
-                               rule : {isnotempty : true}\r
+                               visible_edit : true,\r
+                               length : 64,\r
+                               isnotempty : true\r
                        },\r
                password :\r
                        {\r
                                name : "パスワード",\r
                                type : "password",\r
+                               length : 32,\r
+                               visible : false,\r
+                               visible_edit : true,\r
+                       },\r
+               lastmodified :\r
+                       {\r
+                               name : "更新日付",\r
+                               type : "datetime",\r
                                visible : false,\r
+                               visible_edit : false,\r
                        },\r
+       //ここまで\r
                mailto :\r
                        {\r
                                name : "メールアドレス",\r
                                type : "mail",\r
+                               length : 255,\r
                                visible : false,\r
+                               visible_edit : true,\r
                        },\r
                age :\r
                        {\r
                                name : "年齢",\r
                                type : "number",\r
+                               defaultvalue : 0,\r
+                               length : 2,\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
                height :\r
                        {\r
                                name : "身長",\r
                                type : "number",\r
+                               defaultvalue : 0,\r
+                               length : 2,\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
                weight :\r
                        {\r
                                name : "体重",\r
                                type : "number",\r
+                               defaultvalue : 0,\r
+                               length : 2,\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
                gender :\r
                        {\r
                                name : "性別",\r
                                type : "text",\r
+                               length : 8,\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
                race :\r
                        {\r
                                name : "種族",\r
                                type : "text",\r
+                               length : 64,\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
                etc :\r
                        {\r
                                name : "備考",\r
                                type : "textarea",\r
                                visible : true,\r
+                               visible_edit : true,\r
                        },\r
        },\r
 };\r
diff --git a/init.js b/init.js
new file mode 100644 (file)
index 0000000..9d9b50b
--- /dev/null
+++ b/init.js
@@ -0,0 +1,149 @@
+var util = require("util");
+var config = require("./configure.js");
+var async = require("async");
+
+var MySQLPool = new require("./mysql_pool.js");
+var pool = new MySQLPool({
+                       host     : config.db_host,
+                       user     : config.db_user,
+                       password : config.db_password,
+                       port     : config.db_port,
+                       database : "webchat",
+               });
+
+async.waterfall([
+       function(next){
+               var query = GetDropTableQuery("list"); 
+               pool.query(query,null,next);
+       },
+       function(result,next){
+               var query = GetCreateQuery(config.alias,"list"); 
+               pool.query(query,null,next);
+       },
+       function(result,next){
+               var query = GetDropTableQuery("ipbanlist"); 
+               pool.query(query,null,next);
+       },
+       function(result,next){
+               var def = {
+                       ip:{
+                               type : "text",
+                               length : 64,
+                               primary : true,
+                       },
+                       type:{
+                               type : "text",
+                               length : 1,
+                               primary : true,
+                       },
+               };
+               var query = GetCreateQuery(def,"ipbanlist"); 
+               pool.query(query,null,next);
+       },
+       function(result,next){
+               var query = GetDropTableQuery("rooms"); 
+               pool.query(query,null,next);
+       },
+       function(result,next){
+               var def = {
+                       number:
+                               {
+                                       type : "unsignednumber",
+                                       length:2,
+                                       isnotempty : true,
+                                       primary : true,
+                               },
+                       password:{
+                               type : "text",
+                               length : 16,
+                       },
+                       hiddenlog:{
+                               type : "bool",
+                       },
+               };
+               var query = GetCreateQuery(def,"rooms"); 
+               pool.query(query,null,next);
+       },
+],function(err){
+       console.log(err);
+       process.exit();
+});
+
+
+function GetDropTableQuery(tablename)
+{
+       var result = util.format("DROP TABLE IF EXISTS %s;",tablename);
+
+       console.log(result);
+
+       return result;
+}
+
+function GetCreateQuery(def,tablename)
+{
+       var result = "CREATE TABLE " + tablename + "(";
+       for(key in def)
+       {
+               switch(def[key].type)
+               {
+                       case "text":
+                               result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+                               break;
+                       case "number":
+                               result += util.format("%s %s ",key,GetIntType(def[key].length));
+                               break;
+                       case "unsignednumber":
+                               result += util.format("%s %s UNSIGNED ",key,GetIntType(def[key].length));
+                               break;
+                       case "mail":
+                               result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+                               break;
+                       case "password":
+                               result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+                               break;
+                       case "textarea":
+                               result += util.format("%s TEXT ",key);
+                               break;
+                       case "bool":
+                               result += util.format("%s BOOL ",key);
+                               break
+                       case "datetime":
+                               result +=  util.format("%s DATETIME ",key);
+                               break;
+                       default:
+                               throw util.format("invaild %s type:%s",key,def[key].type);
+               }
+               if(typeof(def[key].isnotempty) != "undefined" && def[key].isnotempty)
+                       result += " NOT NULL ";
+               result += ",";
+       }
+
+       for(key in def)
+       {
+               if(typeof(def[key].primary) != "undefined" && def[key].primary)
+               {
+                       result += util.format("PRIMARY KEY(%s)",key);
+                       break;
+               }
+       }
+       result += ");";
+
+       console.log(result);
+
+       return result;
+}
+
+function GetIntType(len)
+{
+       switch(len)
+       {
+               case 1:
+                       return "TINYINT";
+               case 2:
+                       return "SMALLINT";
+               case 4:
+                       return "INT";
+       }
+       console.log(len);
+       throw "Invaild Length";
+}
index 4f7f04a..3d2bd2f 100644 (file)
--- a/init.sql
+++ b/init.sql
@@ -4,33 +4,3 @@ grant select,
        update on *.* to user identified by 'user';
 flush privileges;
 CREATE DATABASE IF NOT EXISTS webchat DEFAULT CHARSET=utf8;
-use webchat;
-DROP TABLE IF EXISTS list;
-CREATE TABLE list(
-# does not edit
-# from
-       name_hash INT UNSIGNED NOT NULL,
-       name VARCHAR(64) NOT NULL,
-       lastmodified DATETIME,
-       password VARCHAR(32),
-# to
-       mailto VARCHAR(255),
-       age SMALLINT  UNSIGNED DEFAULT 0,
-       height SMALLINT  UNSIGNED DEFAULT 0,
-       weight SMALLINT  UNSIGNED DEFAULT 0,
-       gender VARCHAR(8),
-       race VARCHAR(64),
-       etc TEXT,
-# does not edit
-# from
-       PRIMARY KEY(name_hash));
-# to
-
-DROP TABLE IF EXISTS ipbanlist;
-CREATE TABLE ipbanlist(ip VARCHAR(64) NOT NULL,
-       type CHAR(1));
-
-DROP TABLE IF EXISTS rooms;
-CREATE TABLE rooms(number SMALLINT UNSIGNED NOT NULL,
-       password VARCHAR(16),
-       hiddenlog BOOL);
index 55d247c..df5804c 100644 (file)
@@ -289,7 +289,7 @@ function ProfileCollection()
                pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);\r
        }\r
        this.AddAsync = function(data,cb){\r
-               var item = GetItem(data);\r
+               var item = GetItem(data);;\r
                pool.query("INSERT INTO list SET ?",[item],cb);\r
        }\r
        this.UpdatAsync = function(name,data,newpassword,cb){\r
@@ -331,9 +331,16 @@ function ProfileCollection()
                for(var key in config.alias)\r
                {\r
                        if(key == "password")\r
+                       {\r
                                item[key] = md5_hex(data[key]);\r
-                       else\r
-                               item[key] = data[key];\r
+                       }\r
+                       else if(config.alias[key].visible_edit)\r
+                       {\r
+                               if(data[key] == "")\r
+                                       item[key] = config.alias[key].defaultvalue;\r
+                               else\r
+                                       item[key] = data[key];\r
+                       }\r
                }\r
                return item;\r
        }\r
@@ -355,7 +362,13 @@ function Validator()
                this.Message = "";\r
                for(var key in alias)\r
                {\r
-                       var message = IsValidate(body[key],alias[key].type,alias[key].rule);\r
+                       if(alias[key].visible_edit == false)\r
+                               continue;\r
+                       var message;\r
+                       if(typeof(alias[key].isnotempty) != "undefined" &&\r
+                               alias[key].isnotempty && body[key] == "")\r
+                                       message = resource.is_not_empty;\r
+                       message = IsValidate(body[key],alias[key].type,alias[key].rule);\r
                        if(message != null)\r
                        {\r
                                this.Message += "<p>" + alias[key].name + ":" + message + "</p>\n";\r
@@ -374,10 +387,6 @@ function Validator()
 \r
                var result = null;\r
 \r
-               if(typeof(rule) != "undefined" && typeof(rule.isnotempty) != "undefined"\r
-                       && rule.isnotempty && data == "")\r
-                       return resource.is_not_empty;\r
-\r
                switch(type)\r
                {\r
                        case "text":\r
@@ -401,4 +410,4 @@ function Validator()
 \r
                return result;\r
        }\r
-}
\ No newline at end of file
+}\r
index 3e2c400..a00a9b1 100644 (file)
        <form action="/profile/edit" method="POST">\r
                <table>\r
                <% for(var key in alias) {%>\r
-                       <tr>\r
-                               <td><%= alias[key].name %></td>\r
-                               <td>\r
-                               <% if(alias[key].type == "textarea"){ %>\r
-                                       <textarea name="<%= key %>" rows="4" cols="50"><%= list[0][key] %></textarea>\r
-                               <% }else if(alias[key].type == "password"){ %>\r
-                                       <input type="text" value="" name="<%= key %>"/><br/>\r
-                                       <input type="checkbox" name="update<%= key %>" value="true">更新する</input>\r
-                               <% }else{ %>\r
-                                       <input type="text" value="<%= list[0][key] %>" name="<%= key %>"/>\r
-                               <% } %>\r
-                               </td>\r
-                       </tr>\r
+                       <% if(typeof alias[key] != "undefined" && alias[key].visible_edit) {%>\r
+                               <tr>\r
+                                       <td><%= alias[key].name %></td>\r
+                                       <td>\r
+                                       <% if(alias[key].type == "textarea"){ %>\r
+                                               <textarea name="<%= key %>" rows="4" cols="50"><%= list[0][key] %></textarea>\r
+                                       <% }else if(alias[key].type == "password"){ %>\r
+                                               <input type="text" value="" name="<%= key %>"/><br/>\r
+                                               <input type="checkbox" name="update<%= key %>" value="true">更新する</input>\r
+                                       <% }else{ %>\r
+                                               <input type="text" value="<%= list[0][key] %>" name="<%= key %>"/>\r
+                                       <% } %>\r
+                                       </td>\r
+                               </tr>\r
+                       <% } %>\r
                <% } %>\r
                </table>\r
                <input type="hidden" name="_csrf" value="<%= token %>"></input>\r
index 0b00b2b..fdb9df9 100644 (file)
        <form action="/profile/registor" method="POST">\r
                <table>\r
                <% for(var key in alias) {%>\r
-                       <tr>\r
-                               <td><%= alias[key].name %></td>\r
-                               <td>\r
-                               <% if(alias[key].type == "textarea"){ %>\r
-                                       <textarea name="<%= key %>" rows="4" cols="50"></textarea>\r
-                               <% }else{ %>\r
-                                       <input type="text" value="" name="<%= key %>"/>\r
-                               <% } %>\r
-                               </td>\r
-                       </tr>\r
+                       <% if(typeof alias[key] != "undefined" && alias[key].visible_edit) {%>\r
+                               <tr>\r
+                                       <td><%= alias[key].name %></td>\r
+                                       <td>\r
+                                       <% if(alias[key].type == "textarea"){ %>\r
+                                               <textarea name="<%= key %>" rows="4" cols="50"></textarea>\r
+                                       <% }else{ %>\r
+                                               <input type="text" value="" name="<%= key %>"/>\r
+                                       <% } %>\r
+                                       </td>\r
+                               </tr>\r
+                       <% } %>\r
                <% } %>\r
                </table>\r
                <input type="hidden" name="_csrf" value="<%= token %>"></input>\r
index 552e519..692544c 100644 (file)
@@ -21,6 +21,7 @@
                <li><a href="http://nodejs.org/">ここ</a>のDownloadページからをnode.jsダウンロードし、インストールする</li>\r
                <li><a href="http://www-jp.mysql.com/">ここ</a>のダウンロードからMySQLをダウンロードし、インストールする</li>\r
                <li>mysql -u root -p &lt; init.sqlを実行する</li>\r
+               <li>node init.jsを実行する</li>\r
                <li>npm installを実行する</li>\r
                <li>configue.jsのusernameとpasswordを適切なものに変更する</li>\r
                <li>configue.jsのredis~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
@@ -50,6 +51,7 @@
                <li>configue.jsのredis~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
                <li>configue.jsのdb_~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
                <li>mysql -u root -p &lt; init.sqlを実行する</li>\r
+               <li>node init.jsを実行する</li>\r
                <li>main.jsを起動する</li>\r
        </ol>\r
        <h2>チャットの管理</h2>\r