1
0
mirror of https://github.com/garraflavatra/go-fmp.git synced 2025-06-27 12:05:11 +00:00

Add doc from "fmplib" (Rust library for fmp12)

https://github.com/Rasmus20B/fmplib
This commit is contained in:
2025-06-13 13:58:25 +02:00
parent 36e75fb4bd
commit 41041e124c
2 changed files with 415 additions and 0 deletions

415
docs/fmplib.md Normal file
View File

@ -0,0 +1,415 @@
# FMP12 File Format Findings
(By Rasmus20B, 2024) - https://github.com/Rasmus20B/fmplib/blob/66245e5269275724bacfe1437fb1f73bc587a2f3/doc/fmp_format.md
## File Tree Structure
- Tables: [3].[16].[5]
- Relationships: [3].[17].[5]
- Fields: [table].[3].[5]
- Layout info: [4].[1].[7]
- Scripts: [17].[5].[script]
- value lists: [33].[5].[valuelist]
# Table Information
## Field type switches (Found at key 2 for field definition)
### Byte Index
### 0: Type of field (not data type, but simple, calculation, or summary)
- 0 = Simple field,
- 2 = Calculation field,
- 3 = Summary field,
### 1: Simple Data-types.
- 1 = Text,
- 2 = Number,
- 3 = Date,
- 4 = Time,
- 5 = Timestamp,
- 6 = Container,
### 1: Summary Field Data-types.
- 1 = List of,
- 2 = Total of || Count of || Standard Deviation || Fraction of Total of,
- 5 = Average || Minimum || Maximum,
### 4: Auto-Enter preset Options.
- 0 = Creation Date,
- 1 = Creation Time,
- 2 = Creation TimeStamp,
- 3 = Create Name,
- 4 = Creation Account Name,
- 5 = Modification Date,
- 6 = Modification Time,
- 7 = Modification TimeStamp,
- 8 = Modification Name,
- 9 = Modification Account Name,
### 7: Default language
2. Unicode,
3. Default,
16. Catalan,
17. Croatian,
18. Czech,
19. Danish,
20. Dutch,
21. English,
22. Finnish
23. Finnish (v\<\>w),
24. French,
25. German,
26. German (ä=a),
27. Greek,
28. Hungarian,
29. Icelandic,
30. Italian,
31. Japanese,
32. Norwegian,
33. Polish,
34. Portuguese,
35. Romanian,
36. Russian,
37. Slovak,
38. Slovenian,
39. Spanish (Modern),
40. Spanish,
41. Swedish,
42. Swedish (v\<\>w),
43. Turkish,
44. Ukrainian,
45. Chinese (Pinyin),
46. Chinese (Stroke),
47. Hebrew,
48. Hindi,
49. Arabic,
50. Estonian,
51. Lithuanian,
52. Latvian,
53. Serbian (Latin),
54. Farsi,
55. Bulgarian,
56. Vietnamese,
57. Thai,
58. Greek (Mixed),
59. Bengali,
60. Telugu,
61. Marathi,
62. Tamil,
63. Gujarati,
64. Kannada,
65. Malayalam
67. Panjabi,
76. Korean,
### 8:
- 64 = Don't automatically create index,
- 128 = ALways index this field,
### 9:
- 0 = regular storage,
- 1 = Global Field,
- 8 = Calculation field,
- 10 = Unstored Calculation,
### 10:
- 1: Prohibit modification of value during data-entry
- 2: Serial Number **On Commit**,
- 4: Set in conjunction with idx 11: 128 to signify lookup,
### 11:
- 1 = Options flag from idx 4,
- 2 = Serial Number **On Creation**,
- 4 = Data textbox,
- 8 = Auto-Enter Calculation (**does not** replace existing value),
- 16 = Value from last visited record,
- 32 = Evaluate Calculation even if all referenced fields are empty,
- 128 = with idx 10 = 4 it is a lookup that is active, otherwise inactive but data saved elsewhere,
- 136 = Auto-Enter Calculation (**does** replace existing value),
### 14:
- 0 = Only validate during data entry,
- 1 = Member of value list,
- 2 = maximum number of characters,
- 4 = always validate,
- 16 = strict data-type: Numeric only,
- 32 = strict data-type: 4 digit year,
- 64 = strict data-type: Time of Day,
### 15:
- 0 = User can override,
- 1 = Validated by calculation,
- 4 = User cannot override,
- 8 = Required value,
- 16 = Unique Value,
- 32 = Existing Value,
- 64 = within a range of values,
- 128 = Display a validation error message,
### 25:
- byte 25 simply states how many repetitions the field has
# Relationships
## Relationship Structure
### [3].[17].[5].[0]
- Each relationship is read sequentially at the same path, reusing the same key for references.
- Graph mapping data is stored at path **[3].[17].[5].[0].[251]**.
### Keys used in each relationship
- (2) => 35 bytes that specify metadata about the current table occurence.
- Byte 7 specificies table that occurence is based on.
- (16) => Name of the table occurence.
- (216) => gimme some time
- [3].[17].[5].[0].[251] => Simple Data. typically 5 Bytes.
- (252) => ???
# Calculation Engine
Calculations are stored in a kind of bytecode, with basic operators ('+', '-', etc) being encoded as ints.
## Operators
- '+' :: 0x25
- '-' :: 0x26
- '\*' :: 0x27
- '/' :: 0x28
- '&' :: 0x50
## How to decode numbers
Numbers start with a 0x10. The 9th byte will be the first byte of the number
## How to decode variables
Variables start with '0x1a', followed by the size of the variable name string.
# Scripts
## Scripting Structure
- 4 will usually denote the actual top-level script code.
### Script code
- Each step is stored as a 24 byte subarray, most commonly starting with '2, 1'.
- Bytes 3 and 4 are used to index the script step. This 'index' can be used in the script step 'data' directory specified below.
- **Important**: When script runs into space constraints, simple key ref does not suffice. Segments of the array are stored at **Path** [17].[5].[script].[4], rather than key-value.
### [17].[1].[7].[script]
- This path contains a small amount of metadata for the scripts, most notably their names located at key 16.
### [17].[5].[script]::4
- This path stores the instructions from the script, some metadata, as well as
the file value to append to the path above.
- Script attributes should be parsed in order of appearance in file format. If the script content appears first, store it's id with the content, with a blank name field and other options. Then when we find the name in the metadata directory, just look for the corresponding script and fill in the name.
### [17].[5].[script].[4]
- Used when script exceeds size limitations. replaces key of 4 in script directory ([17].[5].[script]).
### [17].[5].[script].[5]
- Store information about each script step. Each script step being a number after the 5, and treated as it's own directory.
### List of Instructions
#### 1. Perform Script
#### 3. Save a Copy as XML
#### 4. Go to Next Field
#### 5. Go to Previous Field
#### 6. Go to Layout
- bytes 7, 8, and 9: Specify layout. If "original layout" these are all zero.
#### 7. New Record/Request
#### 8. Duplicate Record/Request
#### 9. Delete Record/Request
#### 10. Delete All Records
#### 11. Insert From Index
#### 12. Insert From Last Visited
#### 13. Insert Current Date
#### 14. Insert Current Time
#### 16. Go to Record/Request/Page
#### 17. Go to Field
#### 18. Check Selection
#### 19. Check Record
#### 20. Check Found Set
#### 21. Unsort Records
#### 22. Enter Find Mode
#### 23. Show All Records
#### 24. Modify Last Find
#### 25. Omit Record
#### 26. Omit Multiple Records
#### 27. Show Ommited Only
#### 28. Perform Find
#### 29. Show/Hide Toolbars
#### 30. View As
#### 31. Adjust Window
#### 32. Open Help
#### 33. Open File
#### 34. Close File
#### 35. Import Records
#### 36. Export Records
#### 37. Save a Copy as
#### 38. Open Manage Database
#### 39. Sort Records
#### 40. Relookup Field Contents
#### 41. Enter Preview Mode
#### 42. Print Setup
#### 43. Print
#### 44. Exit Application
#### 45. Undo/Redo
#### 46. Cut
#### 47. Copy
#### 48. Paste
#### 49. Clear
#### 50. Select All
#### 51. Revert Record/Request
#### 55. Enter Browser Mode
#### 56. Insert Picture
#### 57. Send Event
#### 60. Insert Current User Name
#### 61. Insert Text
#### 62. Pause/Resume Script
#### 63. Send Mail
#### 64. Send DDE Execute
#### 65. Dial Phone
#### 66. Speak
#### 67. Perform AppleScript
#### 68. If
#### 69. Else
#### 70. End If
#### 71. Loop
#### 72. Exit Loop If
#### 73. End Loop
#### 74. Go to Related Record
#### 75. Commit Records/Requests
#### 76. Set Field
#### 77. Insert Calculated Result
#### 79. Freeze Window
#### 80. Refresh Window
#### 81. Scroll Window
#### 82. New File
#### 83. Change Password
#### 84. Set Multi-User
#### 85. Allow User abort. 26th byte option
- 26: 1 = Off, 3 = On.
#### 86. Set Error Capture
#### 87. Show Custom Dialog
#### 88. Open Script Workspace
#### 89. Blank Line/Comment
#### 90. Halt Script
#### 91. Replace Field Contents
#### 92. Show/Hide Text Ruler
#### 93. Beep
#### 94. Set Use System Formats
#### 95. Recover File
#### 96. Save a Copy as Add-on Package
#### 97. Set Zoom Level
#### 98. Copy All Records/Requests
#### 99. Go to Portal Row
#### 101. Copy Record/Request
#### 102. Fluch Cache to Disk
#### 103. Exit Script
#### 104. Delete Portal Row
#### 105. Open Preferences
#### 106. Correct Word
#### 107. Spelling Options
#### 108. Select Dictionaries
#### 109. Edit User Dictionary
#### 111. Open URL
#### 112. Open Manage Value Lists
#### 113. Open Sharing
#### 114. Open File Options
#### 115. Allow Formatting Bar
#### 116. Set Next Serial Value
#### 117. Execute SQL
#### 118. Open Hosts
#### 119. Move/Resize Window
#### 120. Arrange All Windows
#### 121. Close Window
#### 122. New Window
#### 123. Select Window
#### 124. Set Window Title
#### 125. Else If
#### 126. Constrain Found Set
#### 127. Extend Found Set
#### 128. Perform Find/Replace
#### 129. Open Find/Replace
#### 130. Set Selection
#### 131. Insert File
#### 132. Export Field Contents
#### 133. Open Record Request
#### 134. Add Account
#### 135. Delete Account
#### 136. Reset Account Password
#### 137. Enable Account
#### 138. Relogin
#### 139. Convert File
#### 140. Open Manage Data Sources
#### 141. Set Variable
- Stores variable name to be set @ [17].[5].[scriptnumber].[5].[instructionnumber].[128]::1
- stores new value calculation @ [17].[5].[scriptnumber].[5].[instructionnumber].[129].[5]::5
#### 142. Install Menu Set
#### 143. Save Records as Excel
#### 144. Save Records as PDF
#### 145. Go to Object
#### 147. Set Field by Name
#### 146. Set Web Viewer
#### 148. Install OnTimer Script
#### 149. Open Edit Saved Finds
#### 150. Perform Quick Find
#### 151. Open Manage Layouts
#### 152. Save Records as Snapshot Link
#### 154. Sort Records by Field
#### 155. Find Matching Records
#### 156. Manage Containers
#### 157. Install Plugin File
#### 158. Insert PDF
#### 159. Insert Audio/Video
#### 160. Insert from URL
#### 161. Insert From Device
#### 164. Perform Script on Server
#### 165. Open Manage Themes
#### 166. Show/Hide Menubar
#### 167. Refresh Object
#### 168. Set Layout Object Animation
#### 169. Close Popover
#### 172. Open Upload to Host
#### 174. Enable Touch Keyboard
#### 175. Perform JavaScript in Web Viewer
#### 177. AVPlayer Play
#### 178. AVPlayer Set Playback State
#### 179. AvPlayer Set Options
#### 180. Refresh Portal
#### 181. Get Folder Path
#### 182. Truncate Table
#### 183. Open Favorites
#### 185. Configure Region Monitor Script
#### 187. Configure Local Notification
#### 188. Get File Exists
#### 189. Get File Size
#### 190. Create Data File
#### 191. Open Data File
#### 192. Write to Data File
#### 193. Read from Data File
#### 194. Get Data File Position
#### 195. Set Data File Position
#### 196. Close Data File
#### 197. Delete File
#### 199. Rename File
#### 200. Set Error Logging
#### 201. Configure NFC Reading
#### 202. Configure Machine Learning Model
#### 203. Execute FileMaker Data API
#### 205. Open Transaction
#### 206. Commit Transaction
#### 207. Revert Transaction
#### 208. Set Session Identifier
#### 209. Set Dictionary
#### 210. Perform Script on Server with Callback
#### 211. Trigger Claris Connect Flow
### [17].[5].[script].[5] - The Instruction Directory
- The "data" for each script step is located in this folder.