--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
doseq does not have anything precisely like C/Java/Perl/etc.'s 'break' or 'continue'. The closest thing might be the :while keyword. You can see some one example of its use near the end of the examples on this page: http://clojuredocs.org/clojure.core/doseqThe best way I know to get such behavior is to use Clojure's loop, where if/when/whatever-conditional-statements-you-wish can used to control explicitly to do another loop iteration using recur, or not.
On Wed, Feb 25, 2015 at 8:59 AM, Cecil Westerhof <cldwes...@gmail.com> wrote:At the moment I have the following function:
(defn do-show-table
[table]
(doseq [{:keys [table_name]} (show-tables db-spec)]
(when (= (lower-case table) (lower-case table_name))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]
(printf format field type null key default))))))In this case it is not very important, because the outer sequence will not be very big. But I would like to leave the doseq at the moment that the when is executed. It will be done 0 or 1 times, so after it is done, there is no use in continuing the sequence walk.The second part is that I would like to do an action if it is done 0 times after the doseq. Is this possible?
2015-02-25 18:14 GMT+01:00 Andy Fingerhut <andy.fi...@gmail.com>:doseq does not have anything precisely like C/Java/Perl/etc.'s 'break' or 'continue'. The closest thing might be the :while keyword. You can see some one example of its use near the end of the examples on this page: http://clojuredocs.org/clojure.core/doseqThe best way I know to get such behavior is to use Clojure's loop, where if/when/whatever-conditional-statements-you-wish can used to control explicitly to do another loop iteration using recur, or not.I made the following with loop:
(defn do-show-table
[table]
(loop [all-tables (show-tables db-spec)]
(let [this-table (get (first all-tables) :table_name)]
(if (= all-tables ())
(printf "Table not found: %s\n" table)
(if (= (lower-case table) (lower-case this-table))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf "Table %s:\n" table)
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]
(printf format field type null key default))
(println))
(recur (rest all-tables)))))))It solves both problems.On Wed, Feb 25, 2015 at 8:59 AM, Cecil Westerhof <cldwes...@gmail.com> wrote:At the moment I have the following function:
(defn do-show-table
[table]
(doseq [{:keys [table_name]} (show-tables db-spec)]
(when (= (lower-case table) (lower-case table_name))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]
(printf format field type null key default))))))In this case it is not very important, because the outer sequence will not be very big. But I would like to leave the doseq at the moment that the when is executed. It will be done 0 or 1 times, so after it is done, there is no use in continuing the sequence walk.The second part is that I would like to do an action if it is done 0 times after the doseq. Is this possible?
--Cecil Westerhof
--
On Wed, Feb 25, 2015 at 1:08 PM, Cecil Westerhof <cldwes...@gmail.com> wrote:2015-02-25 18:14 GMT+01:00 Andy Fingerhut <andy.fi...@gmail.com>:doseq does not have anything precisely like C/Java/Perl/etc.'s 'break' or 'continue'. The closest thing might be the :while keyword. You can see some one example of its use near the end of the examples on this page: http://clojuredocs.org/clojure.core/doseqThe best way I know to get such behavior is to use Clojure's loop, where if/when/whatever-conditional-statements-you-wish can used to control explicitly to do another loop iteration using recur, or not.I made the following with loop:
(defn do-show-table
[table]
(loop [all-tables (show-tables db-spec)]
(let [this-table (get (first all-tables) :table_name)]
(if (= all-tables ())
(printf "Table not found: %s\n" table)
(if (= (lower-case table) (lower-case this-table))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf "Table %s:\n" table)
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]Please don't get into the habit of doing db queries like this, you're one "Little Bobby Tables" away from an sql injection. In this case you should do (jdbc/query db-spec ["SHOW COLUMNS FROM ?" table]).
I think you would be well-served by a general clojure principle here of trying to get the data you're are dealing within into "values" as quickly as possible, and then working with those.Rather than inter-mixing your querying and display as you're doing here, I would design this as a query to fill some maps describing your tables, and then use clojure.pprint/print-table to print out the resulting map when desired.
(printf format field type null key default))(println))
(recur (rest all-tables)))))))It solves both problems.On Wed, Feb 25, 2015 at 8:59 AM, Cecil Westerhof <cldwes...@gmail.com> wrote:At the moment I have the following function:
(defn do-show-table
[table]
(doseq [{:keys [table_name]} (show-tables db-spec)]
(when (= (lower-case table) (lower-case table_name))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]
(printf format field type null key default))))))In this case it is not very important, because the outer sequence will not be very big. But I would like to leave the doseq at the moment that the when is executed. It will be done 0 or 1 times, so after it is done, there is no use in continuing the sequence walk.The second part is that I would like to do an action if it is done 0 times after the doseq. Is this possible?
2015-02-25 19:23 GMT+01:00 Aaron Cohen <aa...@assonance.org>:On Wed, Feb 25, 2015 at 1:08 PM, Cecil Westerhof <cldwes...@gmail.com> wrote:2015-02-25 18:14 GMT+01:00 Andy Fingerhut <andy.fi...@gmail.com>:doseq does not have anything precisely like C/Java/Perl/etc.'s 'break' or 'continue'. The closest thing might be the :while keyword. You can see some one example of its use near the end of the examples on this page: http://clojuredocs.org/clojure.core/doseqThe best way I know to get such behavior is to use Clojure's loop, where if/when/whatever-conditional-statements-you-wish can used to control explicitly to do another loop iteration using recur, or not.I made the following with loop:
(defn do-show-table
[table]
(loop [all-tables (show-tables db-spec)]
(let [this-table (get (first all-tables) :table_name)]
(if (= all-tables ())
(printf "Table not found: %s\n" table)
(if (= (lower-case table) (lower-case this-table))
(let [format "%-20s %-30s %-5s %-5s %-20s\n"]
(printf "Table %s:\n" table)
(printf format "Field" "Type" "Null?" "Key" "Default")
(doseq [{:keys [field type null key default]}
(jdbc/query db-spec [(str "SHOW COLUMNS FROM " table)])]Please don't get into the habit of doing db queries like this, you're one "Little Bobby Tables" away from an sql injection. In this case you should do (jdbc/query db-spec ["SHOW COLUMNS FROM ?" table]).That gives:
JdbcSQLException Syntax error in SQL statement "SHOW COLUMNS FROM ?"; expected "identifier"; SQL statement:
SHOW COLUMNS FROM ? [42001-184] org.h2.engine.SessionRemote.done (SessionRemote.java:622)
That is why I do it in this way. As I understood it this has to do with that with a 'show columns from' the table can not be supplied. (I first tried Yesql, only when that did not work I went to JDBC.)
Another way to structure this problem is as sequences:
(show-tables db-spec)
(filter my-pred tables-seq)
(take 1 filtered-tables-seq)
(doseq [t 0-or-1-filtered-tables] (...))
That way, you will only do the work zero or one times, but the depth of your code is much shallower, and easier to read.
e
--