1
0

mkpragmatab.tcl 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. #!/usr/bin/tclsh
  2. #
  3. # Run this script to generate the pragma name lookup table C code.
  4. #
  5. # To add new pragmas, first add the name and other relevant attributes
  6. # of the pragma to the "pragma_def" object below. Then run this script
  7. # to generate the C-code for the lookup table and copy/paste the output
  8. # of this script into the appropriate spot in the pragma.c source file.
  9. # Then add the extra "case PragTyp_XXXXX:" and subsequent code for the
  10. # new pragma.
  11. #
  12. set pragma_def {
  13. NAME: full_column_names
  14. TYPE: FLAG
  15. ARG: SQLITE_FullColNames
  16. NAME: short_column_names
  17. TYPE: FLAG
  18. ARG: SQLITE_ShortColNames
  19. NAME: count_changes
  20. TYPE: FLAG
  21. ARG: SQLITE_CountRows
  22. NAME: empty_result_callbacks
  23. TYPE: FLAG
  24. ARG: SQLITE_NullCallback
  25. NAME: legacy_file_format
  26. TYPE: FLAG
  27. ARG: SQLITE_LegacyFileFmt
  28. NAME: fullfsync
  29. TYPE: FLAG
  30. ARG: SQLITE_FullFSync
  31. NAME: checkpoint_fullfsync
  32. TYPE: FLAG
  33. ARG: SQLITE_CkptFullFSync
  34. NAME: cache_spill
  35. TYPE: FLAG
  36. ARG: SQLITE_CacheSpill
  37. NAME: reverse_unordered_selects
  38. TYPE: FLAG
  39. ARG: SQLITE_ReverseOrder
  40. NAME: query_only
  41. TYPE: FLAG
  42. ARG: SQLITE_QueryOnly
  43. NAME: automatic_index
  44. TYPE: FLAG
  45. ARG: SQLITE_AutoIndex
  46. IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
  47. NAME: sql_trace
  48. TYPE: FLAG
  49. ARG: SQLITE_SqlTrace
  50. IF: defined(SQLITE_DEBUG)
  51. NAME: vdbe_listing
  52. TYPE: FLAG
  53. ARG: SQLITE_VdbeListing
  54. IF: defined(SQLITE_DEBUG)
  55. NAME: vdbe_trace
  56. TYPE: FLAG
  57. ARG: SQLITE_VdbeTrace
  58. IF: defined(SQLITE_DEBUG)
  59. NAME: vdbe_addoptrace
  60. TYPE: FLAG
  61. ARG: SQLITE_VdbeAddopTrace
  62. IF: defined(SQLITE_DEBUG)
  63. NAME: vdbe_debug
  64. TYPE: FLAG
  65. ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
  66. IF: defined(SQLITE_DEBUG)
  67. NAME: ignore_check_constraints
  68. TYPE: FLAG
  69. ARG: SQLITE_IgnoreChecks
  70. IF: !defined(SQLITE_OMIT_CHECK)
  71. NAME: writable_schema
  72. TYPE: FLAG
  73. ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode
  74. NAME: read_uncommitted
  75. TYPE: FLAG
  76. ARG: SQLITE_ReadUncommitted
  77. NAME: recursive_triggers
  78. TYPE: FLAG
  79. ARG: SQLITE_RecTriggers
  80. NAME: foreign_keys
  81. TYPE: FLAG
  82. ARG: SQLITE_ForeignKeys
  83. IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
  84. NAME: defer_foreign_keys
  85. TYPE: FLAG
  86. ARG: SQLITE_DeferFKs
  87. IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
  88. NAME: default_cache_size
  89. FLAG: NeedSchema
  90. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
  91. NAME: page_size
  92. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  93. NAME: secure_delete
  94. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  95. NAME: page_count
  96. FLAG: NeedSchema
  97. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  98. NAME: max_page_count
  99. TYPE: PAGE_COUNT
  100. FLAG: NeedSchema
  101. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  102. NAME: locking_mode
  103. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  104. NAME: journal_mode
  105. FLAG: NeedSchema
  106. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  107. NAME: journal_size_limit
  108. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  109. NAME: cache_size
  110. FLAG: NeedSchema
  111. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  112. NAME: mmap_size
  113. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  114. NAME: auto_vacuum
  115. FLAG: NeedSchema
  116. IF: !defined(SQLITE_OMIT_AUTOVACUUM)
  117. NAME: incremental_vacuum
  118. FLAG: NeedSchema
  119. IF: !defined(SQLITE_OMIT_AUTOVACUUM)
  120. NAME: temp_store
  121. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  122. NAME: temp_store_directory
  123. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  124. NAME: data_store_directory
  125. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
  126. NAME: lock_proxy_file
  127. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
  128. NAME: synchronous
  129. FLAG: NeedSchema
  130. IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
  131. NAME: table_info
  132. FLAG: NeedSchema
  133. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  134. NAME: stats
  135. FLAG: NeedSchema
  136. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  137. NAME: index_info
  138. FLAG: NeedSchema
  139. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  140. NAME: index_list
  141. FLAG: NeedSchema
  142. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  143. NAME: database_list
  144. FLAG: NeedSchema
  145. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  146. NAME: collation_list
  147. IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
  148. NAME: foreign_key_list
  149. FLAG: NeedSchema
  150. IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
  151. NAME: foreign_key_check
  152. FLAG: NeedSchema
  153. IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
  154. NAME: parser_trace
  155. IF: defined(SQLITE_DEBUG)
  156. NAME: case_sensitive_like
  157. NAME: integrity_check
  158. FLAG: NeedSchema
  159. IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
  160. NAME: quick_check
  161. TYPE: INTEGRITY_CHECK
  162. FLAG: NeedSchema
  163. IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
  164. NAME: encoding
  165. IF: !defined(SQLITE_OMIT_UTF16)
  166. NAME: schema_version
  167. TYPE: HEADER_VALUE
  168. IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
  169. NAME: user_version
  170. TYPE: HEADER_VALUE
  171. IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
  172. NAME: freelist_count
  173. TYPE: HEADER_VALUE
  174. IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
  175. NAME: application_id
  176. TYPE: HEADER_VALUE
  177. IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
  178. NAME: compile_options
  179. IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
  180. NAME: wal_checkpoint
  181. FLAG: NeedSchema
  182. IF: !defined(SQLITE_OMIT_WAL)
  183. NAME: wal_autocheckpoint
  184. IF: !defined(SQLITE_OMIT_WAL)
  185. NAME: shrink_memory
  186. NAME: busy_timeout
  187. NAME: lock_status
  188. IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
  189. NAME: key
  190. IF: defined(SQLITE_HAS_CODEC)
  191. NAME: rekey
  192. IF: defined(SQLITE_HAS_CODEC)
  193. NAME: hexkey
  194. IF: defined(SQLITE_HAS_CODEC)
  195. NAME: hexrekey
  196. TYPE: HEXKEY
  197. IF: defined(SQLITE_HAS_CODEC)
  198. NAME: activate_extensions
  199. IF: defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD)
  200. NAME: soft_heap_limit
  201. }
  202. set name {}
  203. set type {}
  204. set if {}
  205. set flags {}
  206. set arg 0
  207. proc record_one {} {
  208. global name type if arg allbyname typebyif flags
  209. if {$name==""} return
  210. set allbyname($name) [list $type $arg $if $flags]
  211. set name {}
  212. set type {}
  213. set if {}
  214. set flags {}
  215. set arg 0
  216. }
  217. foreach line [split $pragma_def \n] {
  218. set line [string trim $line]
  219. if {$line==""} continue
  220. foreach {id val} [split $line :] break
  221. set val [string trim $val]
  222. if {$id=="NAME"} {
  223. record_one
  224. set name $val
  225. set type [string toupper $val]
  226. } elseif {$id=="TYPE"} {
  227. set type $val
  228. } elseif {$id=="ARG"} {
  229. set arg $val
  230. } elseif {$id=="IF"} {
  231. set if $val
  232. } elseif {$id=="FLAG"} {
  233. foreach term [split $val] {
  234. lappend flags $term
  235. set allflags($term) 1
  236. }
  237. } else {
  238. error "bad pragma_def line: $line"
  239. }
  240. }
  241. record_one
  242. set allnames [lsort [array names allbyname]]
  243. # Generate #defines for all pragma type names. Group the pragmas that are
  244. # omit in default builds (defined(SQLITE_DEBUG) and defined(SQLITE_HAS_CODEC))
  245. # at the end.
  246. #
  247. set pnum 0
  248. foreach name $allnames {
  249. set type [lindex $allbyname($name) 0]
  250. if {[info exists seentype($type)]} continue
  251. set if [lindex $allbyname($name) 2]
  252. if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
  253. set seentype($type) 1
  254. puts [format {#define %-35s %4d} PragTyp_$type $pnum]
  255. incr pnum
  256. }
  257. foreach name $allnames {
  258. set type [lindex $allbyname($name) 0]
  259. if {[info exists seentype($type)]} continue
  260. set if [lindex $allbyname($name) 2]
  261. if {[regexp SQLITE_DEBUG $if]} continue
  262. set seentype($type) 1
  263. puts [format {#define %-35s %4d} PragTyp_$type $pnum]
  264. incr pnum
  265. }
  266. foreach name $allnames {
  267. set type [lindex $allbyname($name) 0]
  268. if {[info exists seentype($type)]} continue
  269. set seentype($type) 1
  270. puts [format {#define %-35s %4d} PragTyp_$type $pnum]
  271. incr pnum
  272. }
  273. # Generate #defines for flags
  274. #
  275. set fv 1
  276. foreach f [lsort [array names allflags]] {
  277. puts [format {#define PragFlag_%-20s 0x%02x} $f $fv]
  278. set fv [expr {$fv*2}]
  279. }
  280. # Generate the lookup table
  281. #
  282. puts "static const struct sPragmaNames \173"
  283. puts " const char *const zName; /* Name of pragma */"
  284. puts " u8 ePragTyp; /* PragTyp_XXX value */"
  285. puts " u8 mPragFlag; /* Zero or more PragFlag_XXX values */"
  286. puts " u32 iArg; /* Extra argument */"
  287. puts "\175 aPragmaNames\[\] = \173"
  288. set current_if {}
  289. set spacer [format { %26s } {}]
  290. foreach name $allnames {
  291. foreach {type arg if flag} $allbyname($name) break
  292. if {$if!=$current_if} {
  293. if {$current_if!=""} {puts "#endif"}
  294. set current_if $if
  295. if {$current_if!=""} {puts "#if $current_if"}
  296. }
  297. set typex [format PragTyp_%-23s $type,]
  298. if {$flag==""} {
  299. set flagx "0"
  300. } else {
  301. set flagx PragFlag_[join $flag {|PragFlag_}]
  302. }
  303. puts " \173 /* zName: */ \"$name\","
  304. puts " /* ePragTyp: */ PragTyp_$type,"
  305. puts " /* ePragFlag: */ $flagx,"
  306. puts " /* iArg: */ $arg \175,"
  307. }
  308. if {$current_if!=""} {puts "#endif"}
  309. puts "\175;"
  310. # count the number of pragmas, for information purposes
  311. #
  312. set allcnt 0
  313. set dfltcnt 0
  314. foreach name $allnames {
  315. incr allcnt
  316. set if [lindex $allbyname($name) 2]
  317. if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
  318. incr dfltcnt
  319. }
  320. puts "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"