Browse Source

[spod] Do not set SData field with the incorrect type

Cauê Waneck 11 years ago
parent
commit
fb16290ce1
2 changed files with 24 additions and 11 deletions
  1. 19 5
      std/sys/db/Manager.hx
  2. 5 6
      std/sys/db/RecordMacros.hx

+ 19 - 5
std/sys/db/Manager.hx

@@ -22,6 +22,7 @@
 package sys.db;
 import Reflect;
 import sys.db.Connection;
+import sys.db.RecordInfos;
 
 /**
 	Record Manager : the persistent object database manager. See the tutorial on
@@ -124,14 +125,25 @@ class Manager<T : Object> {
 		return v;
 	}
 
+	static function getFieldName(field:RecordField):String
+	{
+		return switch (field.t) {
+			case DData:
+				"data_" + field.name;
+			case _:
+				field.name;
+		}
+	}
+
 	function doInsert( x : T ) {
 		unmake(x);
 		var s = new StringBuf();
 		var fields = new List();
 		var values = new List();
 		for( f in table_infos.fields ) {
-			var name = f.name;
-			var v = Reflect.field(x,name);
+			var name = f.name,
+			    fieldName = getFieldName(f);
+			var v = Reflect.field(x,fieldName);
 			if( v != null ) {
 				fields.add(quoteField(name));
 				switch( f.t ) {
@@ -207,8 +219,9 @@ class Manager<T : Object> {
 		var cache = Reflect.field(x,cache_field);
 		var mod = false;
 		for( f in table_infos.fields ) {
-			var name = f.name;
-			var v : Dynamic = Reflect.field(x,name);
+			var name = f.name,
+			    fieldName = getFieldName(f);
+			var v : Dynamic = Reflect.field(x,fieldName);
 			var vc : Dynamic = Reflect.field(cache,name);
 			if( v != vc && (!isBinary(f.t) || hasBinaryChanged(v,vc)) ) {
 				switch( f.t ) {
@@ -322,6 +335,7 @@ class Manager<T : Object> {
 		for (f in Reflect.fields(x) )
 		{
 			var val:Dynamic = Reflect.field(x,f), info = table_infos.hfields.get(f);
+			var fieldName = getFieldName(info);
 			if (val != null && info != null) switch (info.t) {
 				case DDate, DDateTime if (!Std.is(val,Date)):
 					if (Std.is(val,Float))
@@ -344,7 +358,7 @@ class Manager<T : Object> {
 				case _:
 			}
 
-			Reflect.setField(o, f, val);
+			Reflect.setField(o, fieldName, val);
 			Reflect.setField(x, f, val);
 		}
 		Reflect.setField(o,cache_field,x);

+ 5 - 6
std/sys/db/RecordMacros.hx

@@ -1176,13 +1176,11 @@ class RecordMacros {
 			f.meta.push( { name : ":data", params : [], pos : f.pos } );
 			f.meta.push( { name : ":isVar", params : [], pos : f.pos } );
 			var meta = [ { name : ":hide", params : [], pos : pos } ];
-			var cache = "cache_" + f.name;
+			var cache = "cache_" + f.name,
+			    dataName = "data_" + f.name;
 			var ecache = { expr : EConst(CIdent(cache)), pos : pos };
-			var efield = { expr : EConst(CIdent(f.name)), pos : pos };
-			var fname = { expr : EConst(CString(f.name)), pos : pos };
-			// note : we need to store the data in the same field, which is typed as t while it is actually a haxe.io.Bytes
-			// this might cause some issues with static platforms.
-			// In that case maybe a special handling of SData field compilation to haxe.io.Bytes will be necessary
+			var efield = { expr : EConst(CIdent(dataName)), pos : pos };
+			var fname = { expr : EConst(CString(dataName)), pos : pos };
 			var get = {
 				args : [],
 				params : [],
@@ -1197,6 +1195,7 @@ class RecordMacros {
 				expr : macro { if( $ecache == null ) { $ecache = { v : _v }; $efield = cast {}; } else $ecache.v = _v; return _v; },
 			};
 			fields.push( { name : cache, pos : pos, meta : [meta[0], { name:":skip", params:[], pos:pos } ], access : [APrivate], doc : null, kind : FVar(macro : { v : $t }, null) } );
+			fields.push( { name : dataName, pos : pos, meta : [meta[0], { name:":skip", params:[], pos:pos } ], access : [APrivate], doc : null, kind : FVar(macro : haxe.io.Bytes, null) } );
 			fields.push( { name : "get_" + f.name, pos : pos, meta : meta, access : [APrivate], doc : null, kind : FFun(get) } );
 			fields.push( { name : "set_" + f.name, pos : pos, meta : meta, access : [APrivate], doc : null, kind : FFun(set) } );
 		case "SEnum":