Forráskód Böngészése

added "in" operator

Nicolas Cannasse 14 éve
szülő
commit
b351b1051d
3 módosított fájl, 32 hozzáadás és 0 törlés
  1. 1 0
      doc/CHANGES.txt
  2. 21 0
      std/sys/db/Manager.hx
  3. 10 0
      std/sys/db/SpodMacros.hx

+ 1 - 0
doc/CHANGES.txt

@@ -5,6 +5,7 @@
 	flash9 : fixed -D swfprotected with swc output
 	neko : added ~ implementation
 	js : upgraded jquery version
+	spod macros : added "in" operator
 
 2011-09-25: 2.08
 	js : added js.JQuery

+ 21 - 0
std/sys/db/Manager.hx

@@ -582,4 +582,25 @@ class Manager<T : Object> {
 		return quoteAny(v);
 	}
 
+	static function quoteAnyList( v : String, it : Iterable<Dynamic> ) {
+		var b = new StringBuf();
+		var first = true;
+		if( it != null )
+			for( v in it ) {
+				if( first ) first = false else b.addChar(','.code);
+				cnx.addValue(b, v);
+			}
+		if( first )
+			return "FALSE";
+		return v + " IN (" + b.toString() + ")";
+	}
+
+	public static inline function quoteIntList( v : String, it : Iterable<Int> ) {
+		return quoteAnyList(v, it);
+	}
+
+	public static function quoteStringList( v : String, it : Iterable<String> ) {
+		return quoteAnyList(v, it);
+	}
+	
 }

+ 10 - 0
std/sys/db/SpodMacros.hx

@@ -687,6 +687,16 @@ class SpodMacros {
 			unify(r2.t, r1.t, e2.pos);
 			unify(r1.t, r2.t, e1.pos);
 			return { sql : { expr : EIf(e, r1.sql, r2.sql), pos : p }, t : r1.t, n : r1.n || r2.n };
+		case EIn(e, v):
+			var e = buildCond(e);
+			switch( unifyClass(e.t) ) {
+			case 0: // int
+				return { sql : { expr : ECall( { expr : EField(manager, "quoteIntList"), pos : p }, [e.sql, v]), pos : p }, t : DBool, n : e.n };
+			case 3: // string
+				return { sql : { expr : ECall( { expr : EField(manager, "quoteStringList"), pos : p }, [e.sql, v]), pos : p }, t : DBool, n : e.n };
+			default:
+				error("'in' operator not supported for type " + typeStr(e.t), e.sql.pos);
+			}
 		default:
 		}
 		error("Unsupported expression", p);